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

news2024/11/23 21:37:35

引言

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

别害怕,现在你手头有了一本魔法书——阿里云资源编排服务(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及以上

初始化工程项目

首先让我们获取魔杖(安装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=typescript --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 项目时所需的依赖。

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

{
  "name": "demo",
  "version": "0.1.0",
  "bin": {
    "demo": "bin/demo.js"
  },
  "scripts": {
    "build": "tsc",
    "test": "jest"
  },
  "devDependencies": {
    "@types/jest": "^25.2.1",
    "@types/node": "10.17.5",
    "typescript": "^3.9.7",
    "jest": "^25.5.0",
    "ts-jest": "^25.3.1",
    "ts-node": "^8.1.0",
    "babel-jest": "^26.6.3",
    "@babel/core": "^7.12.9",
    "@babel/preset-env": "7.12.7",
    "@babel/preset-typescript": "^7.12.7",
    "@alicloud/ros-cdk-assert": "^1.0.27"
  },
  "dependencies": {
    "@alicloud/ros-cdk-core": "^1.0.29",
    "@alicloud/ros-cdk-oss": "^1.0.27",
    "@alicloud/ros-cdk-ossdeployment": "^1.0.27"
  }
}

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

npm install
添加资源

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

  • 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计算费用
  • 日志服务计费(可选)

进入项目目录,并修改 lib/demo-stack.ts 的内容如下:

import * as ros from '@alicloud/ros-cdk-core';
import * as oss_deployment from '@alicloud/ros-cdk-ossdeployment';
import * as oss from '@alicloud/ros-cdk-oss';
import * as fs from "fs";
import * as path from "path";


/**
 * Recursively reads all files in a directory including subdirectories.
 * @param dirPath The directory path to read.
 * @returns An array containing paths of all files.
 */
function getAllFiles(dirPath: string): oss_deployment.ISource[] {
  dirPath = dirPath.endsWith('/') ? dirPath : dirPath + '/';
  const result: oss_deployment.ISource[] = [];
  const files = fs.readdirSync(dirPath);
  for (const file of files) {
    const curPath = path.join(dirPath, file);
    if (fs.lstatSync(curPath).isDirectory()) {
      result.push(...getAllFiles(curPath));
    } else {
      const objectPrefix = path.dirname(curPath).substring(
          path.dirname(curPath).indexOf('/out') + '/out'.length) + '/';
      result.push(oss_deployment.Source.asset(curPath, {}, objectPrefix.substring(1)));
    }
  }
  return result;
}


export class DemoStack extends ros.Stack {
  constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
    super(scope, id, props);

    const blogPath = "your-blog-project-path/out";  // 本地文件夹路径
    const ossBucketName = "my-blog";  // OSS bucket名称

    const filePaths = getAllFiles(blogPath);
    new ros.RosInfo(this, ros.RosInfo.description, "Deploy the blog to OSS.");

    const destBucket = new oss.Bucket(this, 'SampleDestBucket', {
      bucketName: ossBucketName
    });

    new oss_deployment.BucketDeployment(this, 'SampleFileDeployment', {
      sources: filePaths,
      destinationBucket: destBucket,
      timeout: 300,
      logMonitoring: true,  // 是否开启日志监控,设为false则不开启
    });
  }
}

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

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

import * as ros from '@alicloud/ros-cdk-core';
import * as oss_deployment from '@alicloud/ros-cdk-ossdeployment';
import * as oss from '@alicloud/ros-cdk-oss';
import * as fs from "fs";
import * as path from "path";


/**
 * Recursively reads all files in a directory including subdirectories.
 * @param dirPath The directory path to read.
 * @returns An array containing paths of all files.
 */
function getAllFiles(dirPath: string): oss_deployment.ISource[] {
  dirPath = dirPath.endsWith('/') ? dirPath : dirPath + '/';
  const result: oss_deployment.ISource[] = [];
  const files = fs.readdirSync(dirPath);
  for (const file of files) {
    const curPath = path.join(dirPath, file);
    if (fs.lstatSync(curPath).isDirectory()) {
      result.push(...getAllFiles(curPath));
    } else {
      const objectPrefix = path.dirname(curPath).substring(
          path.dirname(curPath).indexOf('/out') + '/out'.length) + '/';
      result.push(oss_deployment.Source.asset(curPath, {}, objectPrefix.substring(1)));
    }
  }
  return result;
}


export class DemoStack extends ros.Stack {
  constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
    super(scope, id, props);

    const blogPath = "your-blog-project-path";  // 本地文件夹路径
    const ossBucketName = "my-blog";  // OSS bucket名称

    const filePaths = getAllFiles(blogPath);
    new ros.RosInfo(this, ros.RosInfo.description, "Deploy the blog to OSS.");

    new oss_deployment.BucketDeployment(this, 'SampleFileDeployment', {
      sources: filePaths,
      destinationBucket: ossBucketName,
      timeout: 300,
      logMonitoring: true,  // 是否开启日志监控,设为false则不开启
    });
  }
}

并将 ossBucketName 变量赋值为你想要存放博客项目文件的 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/1862498.html

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

相关文章

吉时利 Keithley2440 数字源表

Keithley2440吉时利SMU数字源表 Keithley2440 - 40V、5A、50W源表 吉时利数字源表系列专用于要求紧密结合源和测量 的测试应用。全部数字源表型号都提供精密电压源和电 流源以及测量功能。每款数字源表既是高度稳定的直流 电源也是真仪器级的6位半万用表。此电源的特性包括 低…

Android副屏多屏异显原来如此简单

省流介绍 安卓副屏开发&#xff0c;直接继承dialog&#xff0c;会写dialog&#xff0c;直接指定屏幕显示完事&#xff0c;模拟器和手机开发者里面支持单屏幕调试 详细看文章尾部 public class Presentation extends Dialog class Screen2 : Presentation {constructor(outer…

go语言day06 数组 切片

数组 : 定长且元素类型一致,在索引逻辑上连续存储,数组的内存地址是存储的第一个元素的内存地址 几种创建方式: 仅声明 var nums [ 3 ] int 声明并赋值 var nums [ 2 ] string {"武沛齐","alex"} 声明并按下标赋值 var nums [ 3 ] int {0:88,2:1 } 省略…

机器人控制系列教程之运动规划(2)

简介 在笛卡尔坐标空间中轨迹规划时&#xff0c;首先用位置矢量和旋转矩阵表示所有相应的机器人节点&#xff0c;其次在所有路径段插值计算相对的位置矢量和旋转矩阵&#xff0c;依次得出笛卡尔坐标空间中的轨迹序列通过求解运动学逆问题得到相应关节位置参数。 优点&#xf…

绘制图形

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前3节的实例中&#xff0c;我们一直绘制的都是直线&#xff0c;实际上&#xff0c;海龟绘图还可以绘制其他形状的图形&#xff0c;如圆形、多边形等…

通过frp实现内外网映射

frp介绍和使用方法可以参考官网:安装 | frp 1、准备两台服务器&#xff0c;一台内网服务器A&#xff0c;一台有公网ip的外网服务器B(47.12.13.15) 2、去官方仓库下载frp安装包&#xff1a;Releases fatedier/frp GitHub 下载包根据自己服务系统选择 ​ 3、先在外网服务器…

类的默认成员函数——拷贝构造函数

1.概念引入 在现实生活中&#xff0c;如果有两个兄弟长得一模一样&#xff0c;我们就称其为双胞胎 当我们创建了一个新的对象&#xff0c;需要用同类型的对象拷贝并初始化&#xff0c;就要用到拷贝构造函数 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类…

2024 年 8 款最佳建筑 3D 渲染软件

你现在使用的3D 渲染软件真得适合你吗&#xff1f; 在建筑和室内渲染当中&#xff0c;市面上有许多3D渲染软件可供选择。然而&#xff0c;并不是每款软件都适合你的需求。本指南将重点介绍2024年精选的8款最佳建筑3D渲染软件&#xff0c;帮助你了解不同的选项&#xff0c;并选…

STM32的SPI通信

1 SPI协议简介 SPI&#xff08;Serial Peripheral Interface&#xff09;协议是由摩托罗拉公司提出的通信协议&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间&#xff0c;使用于对通信速率要求较高的场合。 …

基于Java的宠物领养管理系统【附源码】

摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;宠物管理系统利用计算机网络实现信息化管理&#xff0c;使整个宠物领养的发展和服务水平有显著提升。 本文拟采用IDEA开发工具…

Live Wallpaper Themes 4K Pro for Mac v19.9 超高清4K动态壁纸

Live Wallpaper & Themes 4K Pro for Mac v19.7 是一款专为Mac用户设计的超高清4K动态壁纸应用程序。它凭借出色的视觉效果和丰富的个性化设置&#xff0c;为用户带来全新的桌面体验。 这款软件提供了大量精美的动态壁纸供用户选择&#xff0c;涵盖了各种风格和主题&#…

考个嵌入式中级证书吧,有大用!

随着物联网、人工智能的蓬勃发展&#xff0c;嵌入式行业迎来了前所未有的发展机遇&#xff1a;物联网的万物互联需求&#xff0c;为嵌入式系统开拓了广阔的应用场景&#xff1b;人工智能的融入促使嵌入式设备向更智能、更自主的方向进化。然而&#xff0c;行业的火爆&#xff0…

都2024年了,现在互联网行情怎样?

都2024年了&#xff0c;互联网行情是怎样的&#xff1f; 很直白的说&#xff0c;依旧是差得很&#xff0c;怎么说&#xff1f; 我刚在掘金上看到一个掘友写的文章&#xff0c;他是四月领了大礼包&#xff0c;据他的描述如下&#xff1a; 互联网行情依旧是差得很&#xff0c;很…

通过迭代器删除容器中的元素

通过之前的介绍我们知道通过迭代器来遍历单例集合的操作仍然需要借助于循环结构。而且我们知道在单例集合中调用iterator方法返回的Iterator对象中还有一个remove方法我们没有介绍&#xff0c;它的作用是删除容器中的元素。说道这里应该有人会发现一个很明显的问题&#xff0c;…

第28课 绘制原理图——绘制导线

概述 放置完元器件之后&#xff0c;接着就要用导线将元器件的管脚一个一个连起来了。 绘制导线的方法 点击快速工具条上的“线”命令&#xff0c;进入绘制导线的过程。 点击选择某个管脚或电源端口&#xff0c;作为导线的起始端。 再点击选择另一个管脚或电源端口&#xff0c…

MT6989(天玑9300)芯片性能参数_MTK联发科5G处理器

MT6989是联发科Dimensity旗舰系列的成员&#xff0c;旨在为旗舰5G智能手机供应商提供最先进的技术和性能。MT6989也是联发科目前最具创新和强大的5G智能手机芯片&#xff0c;具有领先的功耗效率&#xff0c;无与伦比的计算架构&#xff0c;有史以来最快和最稳定的5G调制解调器&…

动物常见图像的图像分类数据集

常见动物图像分类数据集 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1zZnCUZuNlX6MjuZImlDjTw?pwd03b9 提取码&#xff1a;03b9 数据集信息介绍&#xff1a; 文件夹 大象 中的图片数量: 1446 文件夹 松鼠 中的图片数量: 1862 文件夹 河马 中的图片数量:…

YOLOv8/v10项目使用教程

根据改好的YOLOv8.yaml改yolov10.yaml教程 打开ultralytics/cfg/models/v8路径&#xff0c;找到需要移植的yaml文件&#xff0c;从其中复制相关的模块。打开一个YOLOv10的yaml文件。 注释掉之前相应位置的模块&#xff0c;并粘贴上面复制的模块&#xff0c;完成。 其余使用步骤…

upload-labs第14关

upload-labs第14关 第十四关一、源代码分析代码审计 二、绕过分析a. 制作图片码首先需要一个照片&#xff0c;然后其次需要一个eval.php。 b.上传图片码上传成功 c.结合文件包含漏洞进行访问访问&#xff1a;http://192.168.1.110/upload-labs-master/include.php?filehttp://…

SNEC天合储能秀:全球首发多元场景一站式工商业储能融合解决方案

6月13日-15日&#xff0c;SNEC2024光伏与智慧能源展在上海隆重举行&#xff0c;来自全球95个国家和地区3000家国内外展商齐聚展会&#xff0c;5000行业专家共话产业发展。致力于成为全球光储智慧能源解决方案的领导者&#xff0c;天合光能&#xff08;展位号&#xff1a;7.2H-E…