ROS CDK魔法书:点亮博客上云新技能(Python篇)

news2024/11/15 21:55:53

引言

在数字世界的浩瀚海洋中,信息与数据如同戏剧中的主角,舞动着无形的旋律,构建起信息时代的交响乐。而在这其中,作为一位技术领域的探索者,你的使命便是挥舞着编码的魔杖,创造和守护着这些宝贵的数字灵魂。不过,面对如潮水般汹涌涌来的数据流,你或许会困惑:如何能将这些珍贵的数字财富安全、有效地存储、管理乃至发挥其最大的价值?

别害怕,现在你手头有了一本魔法书——阿里云资源编排服务(Resource Orchestration Service,简称ROS)的云开发套件(Cloud Development Kit,简称CDK),其中的神奇篇章“Asset模块”将成为你最信赖的助手。无需纠结复杂的咒语(SDK)和手工的辛苦劳作(控制台操作),你将学到如何借助ROS CDK的力量,将你地面上的财宝(本地文件)以一种最轻巧简易的方式上传到一座漂浮在数据云端的宝库——OSS(对象存储服务)——中去。

在这篇文章里,我们将一起翻开这本神秘的魔法书,通过将网站内容部署到云端的案例,来揭露资产(Asset)模块的秘密。我将指引你通过简单的咒语、轻点魔杖,将本地文件巧妙地搬运到OSS之中,无需亲自攀爬数据的高峰,也无须担忧文件在旅途中的安全与完整。

背景

什么是ROS CDK?

想象一下你是一位建筑师,面前有一片空白土地,你的任务是构建一座由不同楼层和房间组成的大楼。在传统方式中,你可能需要一块一块砖头手工搭建,一个一个螺丝钉紧固,这不仅耗时而且劳力密集。现在,假设你有一本魔法书,只要念几句咒语(输入几行代码),那座建筑就能自动建造好,并且可以随时按照你的设计意图进行修改和扩展。这本魔法书,就是阿里云资源编排服务(Resource Orchestration Service,简称ROS)的云开发套件(Cloud Development Kit,简称CDK)。

ROS CDK 是一种软件开发框架,它允许开发人员使用熟悉的编程语言来定义、构建和部署云资源。使用ROS CDK,你可以把你的云基础架构定义为代码(Infrastructure as Code, IaC),像你编写应用程序逻辑一样编写云资源的布局和配置。

为了绘画出你理想中的云结构,你不必每次都去拧每个螺丝、背诵每个资源的配置细节。而是可以编写干净、直观的代码,用来描述这些建筑的结构。这些代码随后通过CDK框架转化成具体的资源配置,比如弹性计算云服务器(ECS)、对象存储服务(OSS)桶或是负载均衡器等,在云上快速部署。这样一来,整个部署过程更加自动化、可重复,并且可以轻松地跨团队或者项目共享。

将基础设施代码化,不仅大大降低了人为错误,还让原本复杂的云服务管理变得像搭积木一样简单。ROS CDK 对于迅速部署、升级和扩展云应用提供了巨大便利,让开发者更专注于创新和开发本身,而非重复劳动。简而言之,ROS CDK 赋予了开发者一种创造云上城堡的巧夺天工之能。

什么是OSS?

作为一名旅行在无限广阔数据荒原上的魔法师,在你的奇幻旅程中,征服了许多知识,创造了无数的魂核(数据)。要在这样浩瀚的世界中安全地保存这些珍贵的魂核,你需要一个强大而神秘的宝库——这就是OSS(对象存储服务)。

OSS像一座横跨数据海洋之上的庞大云城堡,由无数个神奇的能够无限扩张的房间(Buckets)组成。每一个房间都可以根据你的需要无限扩张,就像魔法伸缩袋一样,可以储存无尽的魂核,不管是一张小小的符箓(文本文件),还是一个包含着强大能量的水晶球(音视频文件)。

将魂核存放到OSS中就像施展了永久保护咒,使得每一片知识和记忆都能够抵抗时间的侵蚀,亦或是地狱火焰的焚烧。它赋予你的宝贵资源一种神通:随时随地、不管在何方,只要一念之间,就能达到你所愿,提取你所需。

正如一位能够指引星辰的导航者,OSS让你可以轻松地对这些魂核进行组织和检索,它的智能排序、标记、以及自动清理不用的过时魂核,让你的储存空间永远井然有序。而神秘的魔法屏障(加密和权限控制)则守护着你珍贵魂核的安全,仅允许那些持有正确咒语和钥匙(密钥和权限)的人接近。

在阿里云这片神奇的领土上,OSS是每位魔法师守护和共享他们智慧与成果的最佳之所,不受物理空间的限制和束缚,轻而易举地实现无尽数据的积累和传承。所以,尊敬的魔法师,当你准备在云上铸造你的知识帝国时,就让OSS成为你最值得依赖的守护者。

准备工作

语言要求

在进入IaC魔法世界前,我们还需要一些准备工作。为了安装ROS CDK,请确保Node.js和TypeScript满足以下版本要求:

  • Node.js:14.17.0及以上
  • TypeScript:3.8及以上
  • Python:3.7及以上

初始化工程项目

首先让我们获取魔杖(安装ROS CDK)。

注意:请确保你安装的 ros-cdk-cli 版本在 1.0.50 以上,可以通过运行 npm list -g 确认。

在你的魔法实践中,每当你打算开始一个全新的咒法项目,你都需要在你的魔法工作台(编程环境)上准备一些基础元素。就好比在开始一场远征前的准备过程,你需要确保你有一张图(项目框架),一些指南(配置)以及能够让你进出神秘地域(云平台)的通行证(凭证信息)。

初始化工程就好比是在你的魔法工作台上铺好一张干净的魔法制图纸,上面标注了将要完成的奇迹蓝图的基本轮廓。在你的电脑上,这就是创建一个包含必要文件结构的新目录,给魔法师们(开发者)提供了一个可以施展咒语(编码)的场所。

配置凭证信息则像是在你的魔法袍上缝上一枚能够开启云之城门的徽章,这枚徽章(AccessKey)凭证证明了你有权利指挥云中的能量流动,操纵存储在云中的宝藏。在阿里云的世界里,这意味着你需要在本地环境中配置好用于鉴权的AccessKey ID和Secret AccessKey。这样一来,当你使用ROS CDK这个强大的咒法工具时,它能够确保你是有权操控这些云资源的魔法师,而不是一个无意闯入的冒险者。

那么让我们在施展更高级魔法之前,先布置一下仪式现场。

  1. 执行以下命令,创建工程目录并初始化工程:
    mkdir demo
    cd demo
    ros-cdk init --language=python --generate-only=true
    
  2. 执行以下命令,配置阿里云凭证信息:
    ros-cdk config
    
  3. 根据界面提示输入配置信息:
    endpoint(optional, default:https://ros.aliyuncs.com):
    defaultRegionId(optional, default:cn-hangzhou):
    
    [1] AK
    [2] StsToken
    [3] RamRoleArn
    [4] EcsRamRole
    [0] CANCEL
    
    Authenticate mode [1...4 / 0]: 1
    accessKeyId:************************
    accessKeySecret:******************************
    
    ✅ Your cdk configuration has been saved successfully!
    

配置内容说明如下:

  • endpoint:ROS服务地址。默认值为https://ros.aliyuncs.com。
  • defaultRegionId:ROS资源栈部署的地域。默认值为cn-hangzhou。
  • Authenticate mode:鉴权方式。本示例的鉴权方式为AccessKey,您需要输入AccessKey ID和AccessKey Secret。关于如何获取AccessKey,请参见交互式配置(快速配置)。

万事俱备,让我们开始ROS CDK魔法之旅。

注册域名(可选)

为了访问部署在OSS bucket上的静态网页,你需要为其准备一个域名,该域名会在本篇教程的最后一步用到,因此也可以在CDK部署完成后注册。

建议你使用阿里云域名服务快速注册一个属于你的域名。详细步骤,请参见注册通用域名。

若你注册的域名需绑定在中国内地的 OSS Bucket 上,你还需在中国工信部备案域名。详细步骤,请参见备案。

模块介绍

Asset模块:彩虹桥

在你作为魔法师的云上造物之旅中,ROS CDK的Asset模块是你魔法书中的一章,它让你能够轻松地搬运地上的宝贵资源进入神秘的云层城堡。想象一下,你在自己的书房里,手头有一些宝贵的卷轴(本地文件),你想将它们安全地存放到漂浮在空中的巨大宝库(OSS Bucket)中。在没有魔法的日子里,你或许得亲自爬上高塔,把卷轴一一放进宝库。但借助Asset模块的力量,这一切都变得简单。

Asset 模块就像是一座精灵工匠构建的独特彩虹桥。这座彩虹桥异常奇妙,它本身并不负责直接搬运宝物,却能够把现实世界的资源转化为一个个用魔法符号(元数据)标记好的光球。这些光球静静地等待在桥的一端,包含了足够的信息,让其他的魔法结构(如部署工具)能够准确无误地识别并将宝物传输到云端世界的准确位置。

让我们来用更现实的视角详细描述这过程:

当一位工程师或开发者使用 Asset 模块时,他们其实是在启动一个准备过程,这个过程会将本地文件或者目录封装成可以被云端理解的资源。Asset 模块会生成所有必要的元数据和配置文件,告诉云端如何接收和存储即将到来的文件。但是,Asset 模块自己并不执行文件的实际上传操作。

换句话说,Asset 模块赋予了你的本地资源在云上具象化的能力,它将文件转化为资产描述,就像给文件打上了云端寓所的地址标签。然后,它等待一位邮递员(比如一个CDK构建和部署流程)来收集这些准备好的包裹(包含元数据的文件),并将其通过数据的高速公路准确无误地送达到指定的云端存储服务(如OSS)上。

ros-cdk-ossassets 与 ros-cdk-ossdeployment:魔法背包与肩上的猎鹰

你,一位技艺高超的魔法师,总是寻找着更高效的方法来操控与传送你的魔法卷轴(文件)和魔能结晶(数据)。在ROS CDK魔法书中,有两条特别的咒语—— ros-cdk-ossassets 和 ros-cdk-ossdeployment。

ros-cdk-ossassets 是你神奇的魔法背包,其中的Asset类可以暂时将卷轴(本地文件)缓存到一个临时的桥梁宝库(临时的OSS Bucket)中。这是缓存与转移的首要步骤,为接下来更远的旅程做好准备。

而ros-cdk-ossdeployment,则宛如你肩头的猎鹰,精准无误地执行着你下达的搬运命令。该模块中的 Source 类支持从不同来源上传文件,四个静态函数如猎鹰四只锐利的眼紧锁着源头:

  • bucket:支持将同地域bucket中的object作为部署源;
  • asset:将本地文件作为部署源;
  • data:将指定字符串作为部署源;
  • jsonData:将Json对象作为部署源。

最后,当你需要传送这些源头文件到具体的OSS Bucket时,只需将Source传入BucketDeployment类,并指定要传送到的目标bucket。

这样,通过你的魔法背包和肩头的猎鹰,任何所需的资源和能量都将毫无失误地被存储、转移,并精确地部署到云端的宝库之中,此时,阿里云的广袤宇宙里又将多了一个由你一手构建的魔法领地。

在这里插入图片描述

最佳实践:本地博客网站上云

接下来,我们将通过一个最佳实践案例来演示如何将本地文件上传至阿里云OSS Bucket。我们先创建一个全新的博客项目(或者你也可以使用本地已存在的博客项目),然后将向你展示如何将其内容优雅地部署到OSS Bucket中。完成之后,我们可以直接使用OSS Bucket提供的公网地址来访问并欣赏我们的博客网站。

进行如下步骤之前请确保你已完成所有必须的准备工作,包括环境配置和初始化项目工程。

新建博客(可选)

本步骤示例运行环境:

  • 芯片:Apple M1
  • 系统环境:macOS Ventura 13.2.1
  • Next.js 14.2.3

我们将使用基于 React 的 Next.js 框架来搭建一个极简的博客网站。你只需要按顺序操作以下步骤:

  1. 执行以下命令创建项目
npx create-next-app nextjs-blog --use-npm --example https://github.com/vercel/examples/tree/main/solutions/blog         

该项目是利用 create-next-app 工具生成的,它自动为你构建了一个 Next.js 应用,并通过 --example 参数引用了此特定模板。

若有兴趣探索不同的网页设计,你可以浏览Vercel的其他模板选项。

如果你是第一次使用create-next-app,命令行终端会返回如下提示:

Need to install the following packages:
create-next-app@14.2.3
Ok to proceed? (y)

在Ok to proceed? (y)后输入y,然后回车。

等待几分钟后项目将自动创建完成,同时会自动安装依赖。

项目完成创建后,你将在命令行中看到相应的确认信息:

Success! Created nextjs-blog at ***/nextjs-blog
Inside that directory, you can run several commands:

  npm run dev
    Starts the development server.

  npm run build
    Builds the app for production.

  npm start
    Runs the built app in production mode.

We suggest that you begin by typing:

  cd nextjs-blog
  npm run dev
  1. 进入开发模式
cd nextjs-blog
npm run dev

等待命令行终端返回如下信息:

> dev
> next dev

  ▲ Next.js 14.2.3
  - Local:        http://localhost:3000

 ✓ Starting...
Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-9.3.0.tgz.
 ✓ Ready in 5.6s

此时点击http://localhost:3000,即可看到如下页面内容:

在这里插入图片描述

  1. 创建页面

Next.js 的开发模式下具备热刷新功能,即当你修改文件后,系统将自动更新并反映这些变更至浏览器。

现在,让我们动手添加一篇新的博文吧。在该模板中,所有博文都位于 app/blog/posts 目录下,并以 MDX 格式保存。执行以下命令来创建你的第一篇博文:

touch app/blog/posts/what-is-ros-cdk.mdx

使用你熟悉的编辑器或 vim 模式下打开 app/blog/posts 目录下的 what-is-ros-cdk.mdx 文件,并添加如下内容:

---
title: '什么是ROS CDK?'
publishedAt: '2024-06-11'
summary: '本文将介绍如何ROS CDK的基本概念与适用场景'
---

ROS CDK(Cloud Development Toolkit)是阿里云资源编排服务ROS提供的一套开源软件开发工具包,用于在代码中定义云资源并通过ROS进行部署。使用该工具,你无需再依赖繁琐的JSON或YAML模板语法,而是可以通过熟悉的编程语言完成资源的创建和配置,实现自动化部署及运维。

## 使用须知

ROS CDK已经支持在TypeScript、JavaScript、Python、Java和C#中使用,你可以选择任意已支持的编程语言来定义云资源。更多信息,请参见[入门应用示例](https://help.aliyun.com/zh/ros/developer-reference/getting-started-with-applications)。

ROS CDK由构造库和命令行工具两部分组成:

- **构造库**:预先编写的模块化和可重用代码片段的集合,可供你组合、修改和集成,用于快速部署云资源以构建你的应用程序。构造库中配备了多种简化操作的函数,旨在降低在构建应用程序时定义和集成阿里云服务的复杂性。
- **命令行工具**:在完成应用程序构建后,需要使用ROS CDK提供的命令行工具与其交互,以实现生成模板、线上部署、查询和删除资源栈等功能。

## 适用场景

ROS CDK利用面向对象的高级抽象模式对云资源进行标准定义,从而实现快速构建云资源,适用于需要快速、安全且可重复部署云资源的开发团队。其适用场景主要包括:

- 基础设施即代码(Infrastructure as Code,IaC):在需要以可编程和可重复的方式预置、管理和更新阿里云上的云基础设施时,CDK提供了一种强大的解决方案。通过编写代码定义你的资源栈(包含例如VPC、ECS实例、RDS数据库实例、ACK集群等资源),可以确保环境的一致性,并且能够轻松地在不同环境中部署相同的基础设施配置。
- 复杂架构管理:若你的项目涉及复杂的阿里云资源架构设计,包含多个服务之间的相互依赖关系,CDK可以协助你组织这些服务组件,创建模块化的构造块(Constructs),并允许复用和组合这些组件以构建大型应用架构。
- 多团队协作与分层设计:针对多团队共同开发的项目,CDK可以通过版本控制工具促进协同工作,并支持基础设施的分层设计,使得不同的团队可以专注于各自负责的服务或组件。
- 自动化部署与持续集成/持续部署(CI/CD)流水线:CDK可以无缝集成到持续集成和持续部署(Continuous Integration/Continuous Deployment,CI/CD)流程中,便利开发者进行应用和相关基础设施资源的自动部署和更新。
- 安全性与权限管理:使用CDK,你可以精确控制RAM角色、策略和其他安全相关设置,以确保基础设施的安全合规性。
- 测试驱动开发:CDK支持单元测试和合成测试,你可以在实际部署之前对基础设施模型进行验证,从而提高代码质量并减少生产环境中的错误。

## 工具优势

ROS CDK是一种基础设施即代码(IaC)的框架,它提供了将基础设施定义为代码的能力。借助编程语言的强大功能,使得基础设施的创建和管理更加高效、灵活和可靠。以下是CDK的一些主要优势:

- 通用编程语言开发:CDK允许开发者使用他们已经熟悉的编程语言(如JavaScript、TypeScript、Python、Java、C#等),来定义基础设施,无需学习专有的配置语言。
- 高级抽象层次:CDK提供了构建块(称为Constructs),用于封装较低层次的细节,使开发者能够专注于业务逻辑。
- 模块化和可重用性:开发者可以利用构造库中预先定义的构建块,也可以创建自定义的构建块,然后在不同的基础设施项目中反复利用它们,从而促进了模块化和代码的重用。
- 类型安全:对于支持静态类型的语言(如TypeScript和Java),CDK提供了类型安全性,减少了因类型错误而导致的运行时问题。
- 智能编辑器支持:由于CDK使用通用编程语言开发,开发者可以充分利用现代集成开发环境(IDE)提供的代码补全、语法高亮、格式化和Linting等功能。
- 版本控制和团队协作:CDK代码以源码形式存在,因此可以轻松地纳入版本控制系统,从而便于团队成员协同工作。
- ROS集成支持:ROS CDK与ROS集成,可以在阿里云上部署和预置你的基础设施。借助ROS,你可以可预测地重复执行基础设施部署,并在出现错误时进行回滚。如果你已经熟悉ROS,则在开始使用ROS CDK时无需学习新的IaC管理服务。
- 其他软件开发工具集成:CDK可以无缝集成到现有的软件工程工具和流程中,例如源代码管理、单元测试、集成测试以及持续集成/持续交付。

此时你会发现博客主页已经多了一篇文章:

在这里插入图片描述

点击文章标题可以看到文章的具体内容:

在这里插入图片描述

  1. 更多操作

为了保持文章的简洁性和主题相关性,我们这里只介绍如何进行最基础的博文添加操作。对于那些渴望深入挖掘的开发者朋友来说,你可以通过访问 Next.js 官方文档 来获取更多高级定制和基本知识,以进一步优化和个性化你的网站。

  1. 打包生产环境代码

crtl + C 退出开发模式。

为了生成可直接部署于 OSS 的静态网页文件,我们需要对现有配置做一些改动,首先需要去除在生成 OG 图片时传入的request.url参数,具体的,修改 app/og/route.tsx 文件内容如下:

import { ImageResponse } from 'next/og';

export function GET() {
    let title = 'Next.js Portfolio Starter';

    return new ImageResponse(
        (
            <div tw="flex flex-col w-full h-full items-center justify-center bg-white">
                <div tw="flex flex-col md:flex-row w-full py-12 px-4 md:items-center justify-between p-8">
                    <h2 tw="flex flex-col text-4xl font-bold tracking-tight text-left">
                        {title}
                    </h2>
                </div>
            </div>
        ),
        {
            width: 1200,
            height: 630,
        }
    );
}

其次,为了启用 Next.js 的静态导出,我们需要修改项目根目录下的 next.config.js 文件,如果没有该配置文件,可以执行以下命令同时创建并保存配置:

echo "const nextConfig = { output: 'export' }\nmodule.exports = nextConfig" > next.config.js

最后执行以下命令打包生产环境代码:

npm run build

如果成功则会显示如下信息:

> build
> next build

  ▲ Next.js 14.2.3

   Creating an optimized production build ...
 ✓ Compiled successfully
 ✓ Linting and checking validity of types    
 ✓ Collecting page data    
 ✓ Generating static pages (13/13)
 ✓ Collecting build traces    
 ✓ Finalizing page optimization    

Route (app)                              Size     First Load JS
┌ ○ /                                    175 B            94 kB
├ ○ /_not-found                          141 B          87.2 kB
├ ○ /blog                                175 B            94 kB
├ ● /blog/[slug]                         5.29 kB        99.1 kB
├   ├ /blog/how-to-use-cdk
├   ├ /blog/spaces-vs-tabs
├   ├ /blog/static-typing
├   └ /blog/vim
├ ○ /og                                  0 B                0 B
├ ○ /robots.txt                          0 B                0 B
├ ○ /rss                                 0 B                0 B
└ ○ /sitemap.xml                         0 B                0 B
+ First Load JS shared by all            87.1 kB
  ├ chunks/23-a6fd6170b6cfa730.js        31.6 kB
  ├ chunks/fd9d1056-6184565b3c21c232.js  53.6 kB
  └ other shared chunks (total)          1.86 kB


○  (Static)  prerendered as static content
●  (SSG)     prerendered as static HTML (uses getStaticProps)

Next.js 将生成一个out文件夹,其中包含应用程序的 HTML/CSS/JS 资源。

通过CDK托管静态网站至OSS

安装依赖

首先,我们需要安装开发CDK项目时所需的依赖。

进入在「准备工作」中初始化的项目,并修改 requirements.txt 文件内容如下:

ros-cdk-core==1.0.29
ros-cdk-oss==1.0.27
ros-cdk-ossdeployment==1.0.27

修改完成后执行以下命令,安装依赖:

pip install -r requirements.txt
添加资源

接着,我们要为项目中添加资源,也就是实现将本地博客传输至云端的功能。本示例涉及到的资源有:

  • ALIYUN::OSS::Bucket
  • ALIYUN::RAM::Role
  • ALIYUN::SLS::Project
  • ALIYUN::SLS::Logstore
  • ALIYUN::SLS::Index
  • ALIYUN::FC::Service
  • ALIYUN::FC::Function
  • ALIYUN::ROS::CustomResource

本项目涉及到的收费项有:

  • OSS存储费用
  • FC计算费用
  • 日志服务计费(可选)

进入项目目录,并修改 demo/demo_stack.py 的内容如下:

import os
import ros_cdk_core as core
import ros_cdk_ossdeployment as oss_deployment
import ros_cdk_oss as oss


def get_all_files(dir_path: str):
    """
    Recursively reads all files in a directory including subdirectories.
    :param dir_path: The directory path to read.
    :returns: An array containing paths of all files.
    """
    if not dir_path.endswith('/'):
        dir_path += '/'
    result = []
    files = os.listdir(dir_path)
    for file in files:
        cur_path = os.path.join(dir_path, file)
        if os.path.isdir(cur_path):
            result.extend(get_all_files(cur_path))
        else:
            object_prefix = os.path.dirname(cur_path)[os.path.dirname(cur_path).index('/out') + len('/out'):] + '/'
            print(object_prefix[1:], cur_path)
            result.append(oss_deployment.Source.asset(cur_path, {}, object_prefix[1:]))
    return result


class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs):
        super().__init__(scope, construct_id, **kwargs)

        blog_path = "your-blog-project-path/out"  # 本地文件夹路径
        oss_bucket_name = "my-blog"  # OSS bucket名称
        file_paths = get_all_files(blog_path)

        core.RosInfo(self, core.RosInfo.description, "Deploy the blog to OSS.")

        dest_bucket = oss.Bucket(self, 'SampleDestBucket',
                                 oss.BucketProps(bucket_name=oss_bucket_name))

        oss_deployment.BucketDeployment(self, 'SampleFileDeployment',
                                        oss_deployment.BucketDeploymentProps(
                                            sources=file_paths,
                                            destination_bucket=dest_bucket,
                                            timeout=300,
                                            log_monitoring=True  # 是否开启日志监控,设为false则不开启
                                        ))

请将 blog_path 变量设置为你的本地博客项目打包生成的生产环境代码路径,例如,在完成“新建博客”章节最终得到的 out 目录;同时,将 oss_bucket_name 变量指定为你计划创建的,用于存储博客文件的OSS Bucket名称,Bucket 名称必须全局唯一!

如果你想使用已有的 OSS Bucket来存放你的博客项目文件,那么请修改上述代码如下:

import os
import ros_cdk_core as core
import ros_cdk_ossdeployment as oss_deployment
import ros_cdk_oss as oss


def get_all_files(dir_path: str):
    """
    Recursively reads all files in a directory including subdirectories.
    :param dir_path: The directory path to read.
    :returns: An array containing paths of all files.
    """
    if not dir_path.endswith('/'):
        dir_path += '/'
    result = []
    files = os.listdir(dir_path)
    for file in files:
        cur_path = os.path.join(dir_path, file)
        if os.path.isdir(cur_path):
            result.extend(get_all_files(cur_path))
        else:
            object_prefix = os.path.dirname(cur_path)[os.path.dirname(cur_path).index('/out') + len('/out'):] + '/'
            print(object_prefix[1:], cur_path)
            result.append(oss_deployment.Source.asset(cur_path, {}, object_prefix[1:]))
    return result


class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs):
        super().__init__(scope, construct_id, **kwargs)

        blog_path = "your-blog-project-path/out"  # 本地文件夹路径
        oss_bucket_name = "my-blog"  # OSS bucket名称
        file_paths = get_all_files(blog_path)

        core.RosInfo(self, core.RosInfo.description, "Deploy the blog to OSS.")

        oss_deployment.BucketDeployment(self, 'SampleFileDeployment',
                                        oss_deployment.BucketDeploymentProps(
                                            sources=file_paths,
                                            destination_bucket=oss_bucket_name,
                                            timeout=300,
                                            log_monitoring=True  # 是否开启日志监控,设为false则不开启
                                        ))

并将 oss_bucket_name 变量赋值为你想要存放博客项目文件的 OSS Bucket名称。请确保该 Bucket 已存在。

部署资源栈

运行如下命令:

ros-cdk deploy --sync=true

--sync=true 会将资源栈信息同步返回至终端显示。成功后,命令行终端返回如下信息:

DemoStack: deploying...
|DemoStack               |2024-06-20T03:46:09 | CREATE_COMPLETE      | ALIYUN::SLS::Logstore   | ros-cdk-oss-deploy...gxxxx/funct
ion-log | SLSLogStoregxxxx

|DemoStack               |2024-06-20T03:46:09 | CREATE_COMPLETE      | ALIYUN::SLS::Project    | ros-cdk-oss-deployment-gxxxx | S
LSProjectgxxxx

|DemoStack               |2024-06-20T03:46:09 | CREATE_COMPLETE      | ALIYUN::RAM::Role       | ros-cdk-oss-deployment-gxxxx | F
CRolegxxxx

|DemoStack               |2024-06-20T03:46:09 | CREATE_COMPLETE      | ALIYUN::OSS::Bucket     | yingzhao-blog-0001 | SampleDestB
ucket

|DemoStack               |2024-06-20T03:46:09 | CREATE_COMPLETE      | ALIYUN::FC::Service     | 6ba8771f-a499-433d-a7ac-5e7axxxx
eb4b | FCServicegxxxx

|DemoStack               |2024-06-20T03:46:09 | CREATE_COMPLETE      | ALIYUN::FC::Function    | 436f5ba6-7ce2-4627-be63-c67dxxxx
907a | FCFunctiongxxxx

|DemoStack               |2024-06-20T03:46:09 | CREATE_COMPLETE      | ALIYUN::SLS::Index      | ros-cdk-oss-deploy...function-lo
g/index | SLSIndexgxxxx

|DemoStack               |2024-06-20T03:46:09 | CREATE_COMPLETE      | ALIYUN::ROS::CustomResource | - | SampleFileDeployment


 ✅ The deployment(sync create stack) has completed!
Status: CREATE_COMPLETE
StatusReason: Stack CREATE completed successfully
StackId: 070932bb-d6d3-4f08-8e6a-2a0740bxxxx
配置静态网站托管与绑定自定义域名

最后,还需要在 OSS 控制台上进行两步简单的配置。请按照以下简化的步骤操作:

  1. 打开 OSS 控制台,并登陆你的阿里云账号。

  2. 选定你的 Bucket,步入文件管理界面。在这里,你应能看到 Bucket 中已整齐存放着博客的全部生产环境文件目录,一切就绪待命。如下:
    在这里插入图片描述

  3. 在左侧导航栏,选择数据管理 > 静态页面

  4. 静态页面,单击设置,然后将 index.html 设置为默认首页,将 error.html 设置为默认404页。如下:
    在这里插入图片描述

  5. 单击保存

  6. 在左侧导航栏,选择Bucket配置 > 域名管理

  7. 域名管理页面,单击绑定域名

  8. 域名文本框输入你准备好的域名,并打开自动添加CNAME记录开关。

  9. 单击确定。

恭喜你!通过精心的准备和一系列的配置工作,你已成功将本地博客迁移到云端。现在,仅需在浏览器中输入你准备好的域名,便可轻松访问你的专属博客了!

这意味着你的创作内容可以以全新的形式,在全球范围内被更多的读者发现和欣赏。不仅如此,借助云平台的稳定性和可扩展性,你的博客站点将能够提供更佳的访问体验,轻松应对访问量的增长。

更新资源栈

更新资源栈的命令与创建相同,当你本地博客内容有更新或新增,执行以下命令以推送到云端:

ros-cdk deploy --sync=true 

更新成功会显示如下信息:

✅ The deployment(sync update stack) has completed!
Status: UPDATE_COMPLETE
StatusReason: Stack successfully updated
StackId: 070932bb-d6d3-4f08-8e6a-2a0740bxxxx
删除资源栈

ROS CDK 不会主动删除目标 Bucket 中的内容,所以需要你手动登陆 OSS 控制台全选并删除存放博客文件的 Bucket 中的所有文件。

完成手动清空 Bucket 内容后,执行以下命令以删除资源栈:

ros-cdk destroy --sync=true 

CDK 会二次确认即将删除的资源栈:

The following stack(s) will be destroyed(Only deployed stacks will be displayed).

DemoStack

Please confirm.(Y/N)

输入 y 并回车,删除成功会显示如下信息:

✅ The task(sync destroy stack) has finished!
status: DELETE_COMPLETE
StatusReason: Stack DELETE completed successfully
StackId: 070932bb-d6d3-4f08-8e6a-2a0740bxxxx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏AI的创造思路-技术基础-深度学习(1)

他来了&#xff0c;他来啦&#xff0c;后面歌词忘了~~~~~ 开谈深度学习&#xff0c;填上一点小坑&#xff0c;可又再次开掘大洞 -.-b 目录 1. 定义 2. 深度学习的发展历史和典型事件 3. 深度学习常用算法 3.1. 卷积神经网络&#xff08;CNN&#xff09; 3.1.1. 算法形成过…

前端必会--浏览器的工作原理与实践

进程与线程 线程 线程分为单线程和多线程 线程是不能单独存在的&#xff0c;它是由进程来启动和管理的。 进程 一个进程就是一个程序的运行实例。详细解释就是&#xff0c;启动一个程序的时候&#xff0c;操作系统会为该程序创建一块内存&#xff0c;用来存放代码、运行中的…

OpenAI扩大版图,收购Mac协作应用巨擘Multi

Multi&#xff0c;这款专为macOS用户打造的多人协作应用&#xff0c;凭借其卓越的低延迟实时协作功能&#xff0c;如共享光标、绘图和键盘控制&#xff0c;在业界享有盛誉。如今&#xff0c;OpenAI宣布成功收购Multi&#xff0c;以进一步扩大其技术生态。Multi公司将停止运营&a…

ppt忘记保存怎么恢复?

朋友们大家好&#xff0c;我是热爱分享电脑知识的资源伙伴~接下来&#xff0c;别忘了点赞、收藏并关注资源伙伴&#xff01;如果你在使用PowerPoint时忘记保存演示文稿&#xff0c;突然关闭程序或电脑出现故障&#xff0c;不用太担心。 PowerPoint和大多数现代Office应用程序都…

将本地项目托管到Github或码云中

最按照打开页面的步骤&#xff0c;一步步生成公钥就&#xff1a; 按照提示完成三次回车&#xff0c;即可生成 ssh key 到C:\Users\登录用户名.ssh下找到文件d_rsa.pub &#xff0c;打开就可以获取到public key 将id_rsa.pub文件中的内容全部复制到设置/SSH页面中&#xff1a; 单…

PWN练习---Stack_1

pwn123 题源&#xff1a;ctfshow–pwn123 知识点&#xff1a;逻辑漏洞引发的数组越界&#xff0c;导致任意地址写&#xff0c;覆盖返回地址。 主要源码 查看ida存在后面函数&#xff0c;可以劫持ctfshow函数的返回值到backdoor获得shell。 查看case 1代码发现并未对数组赋值的…

ThreadLocal 源码浅析

前言 多线程在访问同一个共享变量时很可能会出现并发问题&#xff0c;特别是在多线程对共享变量进行写入时&#xff0c;那么除了加锁还有其他方法避免并发问题吗&#xff1f;本文将详细讲解 ThreadLocal 的使用及其源码。 一、什么是 ThreadLocal&#xff1f; ThreadLocal 是 J…

Ubuntu下Linux最常见归档与解压命令tar的用法备忘

一、tar命令说明&#xff1a; tar是Linux中备份文件的可靠方法&#xff0c;用于打包、压缩与解压文件&#xff0c;可以工作于任何环境&#xff0c;使用权限是所有用户。 二、压缩与解压最常见的打包文档的格式&#xff1a; 三、常见两种压缩格式的说明&#xff1a; 文件名.tar.…

期权义务仓和权利仓有什么区别?怎么使用?

今天带你了解期权义务仓和权利仓有什么区别&#xff1f;怎么使用&#xff1f;与其他保险产品相比&#xff0c;期权提供更大的灵活性&#xff0c;投资者可以根据个人需求和市场状况选择不同类型和到期时间的期权合约&#xff0c;那么期权义务仓和权力仓是什么&#xff1f; 权利…

构建一个检索增强生成(RAG)应用程序

:::tips 此文档是LangChain官方教程的实践总结&#xff1a;https://python.langchain.com/v0.2/docs/tutorials/rag/实践前你需要准备&#xff1a;OPENAI_API_KEY Generator&#xff1a;根据检索到的信息和用户的查询生成自然语言的回答。LANGCHAIN_API_KEY 密切监控和评估您的…

加速度传感器采集时无效数据的产生及消除

1.现象 这是振动传感器的原始采样信号&#xff0c;它有一个明显的上升沿&#xff0c;这个上升沿&#xff0c;看时间轴标尺&#xff0c;大概持续了至少50ms&#xff0c;它是从哪里来的呢&#xff1f; 加速度传感器一般是由恒流源驱动的。而恒流源的原始电源输入是个经由电源模…

3dmax最小细分,最大细分,全局细分倍增怎么设置才合理

在3ds Max中进行高质量渲染时&#xff0c;细分&#xff08;Subdivision&#xff09;是一个至关重要的参数。细分的设置直接影响到渲染结果的细节程度和渲染时间。以下内容详细解释最小细分、最大细分和全局细分倍增的含义及作用&#xff0c;并解释在渲染设置时&#xff0c;怎样…

Llama3应用与RAG的实现

源码见文末 实现效果 1.Llama3安装 官网:https://ollama.com/download/linuxhttps://ollama.com/download/linux 首先,安装ollama, 安装后能够很好下载其模型

如何只用 ClickHouse SQL 实现 K-Means 聚类

本文字数&#xff1a;15474&#xff1b;估计阅读时间&#xff1a;39 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 Meetup活动 ClickHouse 上海首届 Meetup 讲师招募中&#xff0c;欢迎讲师在文末扫码报名&#xff01; 介绍 最…

扫地机器人无故中止问题的TRIZ解决方案

在我们享受智能家居带来的便捷时&#xff0c;扫地机器人无疑是家中不可或缺的“小帮手”。然而&#xff0c;当这个小家伙突然“罢工”&#xff0c;不再听从我们的指令&#xff0c;甚至无故中止工作时&#xff0c;你是否也感到头疼不已&#xff1f;今天&#xff0c;深圳天行健企…

关于ip地址的网页无法访问navigator的gpu、媒体、蓝牙等设备的解决方法

在使用threejs的WebGPURenderer渲染器时&#xff0c;发现localhost以及127.0.0.1才能访问到navigator.gpu&#xff0c;直接使用ip会变成undefined,原因是为了用户的隐私安全&#xff0c;只能在安全的上下文中使用&#xff0c;非安全的上下文就会是undefined&#xff0c;安全上下…

SHAP中使用shap.summary_plot对多分类任务模型中特征重要性绘图

在文心一言中输入&#xff1a; 使用shap.summary_plot展示各个特征对模型输出类别的重要性 其输出的代码为&#xff08;不正确&#xff09;&#xff1a; from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn import svm import …

git clone中的报错问题解决:git@github.com: Permission denied (publickey)

报错&#xff1a; Submodule path ‘kernels/3rdparty/llm-awq’: checked out ‘19a5a2c9db47f69a2851c83fea90f81ed49269ab’ Submodule path ‘kernels/3rdparty/nvbench’: checked out ‘75212298727e8f6e1df9215f2fcb47c8c721ffc9’ Submodule path ‘kernels/3rdparty/t…

为什么 Swift 没有原生的 subArray 方法?

为什么 Swift 没有原生的 subArray 方法&#xff1f; Swift 是一门设计精良的编程语言&#xff0c;以其灵活性和高性能著称。在 Swift 中截取数组的子数组是一个常见的操作&#xff0c;但你可能会发现 Swift 标准库中并没有直接提供一个 subArray 方法。这是为什么呢&#xff…

软考中级软件设计师查成绩:终于合格了。

软考中级软件设计师终于合格了。 考试时间是8&#xff1a;30-12&#xff1a;30&#xff0c;我下午一点多要赶火车。考试的地方很偏僻&#xff0c;离火车站30多里地。所以&#xff0c;我必须提前交卷。客观题有大概10道题都是蒙的C。应用题中的算法考的是哈夫曼算法&#xff0…