参考资料:
https://bobbyhadz.com/blog/aws-cdk-tutorial-typescript

1、认识CDK

CDK 只是 CloudFormation 的一个包装器。CDK 使我们能够使用编程语言(TypeScript、 Python、 Java)而不是配置语言(yaml、 json)提供基础设施。CDK 的全部意义在于通过提供比 CloudFormation 更易于维护的基础设施配置方法,提高开发人员的经验。

在执行 CDK 部署之前,我们的 CDK 代码会被编译成 CloudFormation 代码。部署 CloudFormation 代码之后,我们可以在 CloudFormation 控制台中查看堆栈。

2、创建一个CDK应用

//查看starter列表
cdk init --list
output:
Available templates:
* app: Template for a CDK Application└─ cdk init app --language=[csharp|fsharp|go|java|javascript|python|typescript]
* lib: Template for a CDK Construct Library└─ cdk init lib --language=typescript
* sample-app: Example CDK Application with some constructs└─ cdk init sample-app --language=[csharp|fsharp|go|java|javascript|python|typescript]

可见我们能够启动三种template

  • app:基础启动template
  • lib:创建cdk构造库的template
  • sample-app:具有一些构造器的starter
//注意此处使用cdk@2.0以上版本,cdk@1.0版本有些模块出现变化,可能带来不必要的错误
mkdir cdk-app && cd cdk-app
cdk init app --language=typescript

3、项目结构

根目录下的配置文件

  • package.json:管理node包和脚本
  • jest.config.js:测试
  • tsconfig.json:typescript配置
  • cdk.json:
    • app: “npx ts-node --prefer-ts-exts bin/cdk-app.ts”,cdk命令是调用ts-node指令编译运行的
    • context:开启或关闭aws cdk版本的一些变动

每个 CDK 应用程序可以包含一个或多个栈。可以将堆栈视为部署单元。例如,我们可以有一个用于开发环境的堆栈和一个用于产品环境的堆栈,两者都可以在同一个 CDK 应用程序的作用域中创建。如果您熟悉 CloudFormation 中的栈,那么它们是一样的。

更新 bin/cdk-app. ts 文件中的 CdkAppStack 类

const app = new cdk.App();
new CdkAppStack(app, 'CdkAppStack', {env: {//env 属性允许我们指定部署堆栈的 AWS 环境(帐户和区域)account: process.env.CDK_DEFAULT_ACCOUNT,region: process.env.CDK_DEFAULT_REGION,},
});

4、constructs

为了使用 CDK 提供资源,我们必须在 CDK 堆栈中定义 Constructs。

constructs是云组件,为我们提供:

  • sane method:不必深入研究 CloudFormation 文档,除非我们需要偏离默认行为
  • helper methods:辅助方法
  • concise and maintainable way to define infrastructure

如果使用cdk@2.0版本,则大部分的依赖库都已经转移到了aws-cdk-lib中而非@aws-cdk/core

5、创建资源

lib/cdk-app-stack. ts 文件中实例化我们的第一个构造,我们将创建一个 S3 bucket 和一个 Dynamodb 表:

  • 使用 Bucket 构造定义 S3 Bucket 资源
  • 使用 Table 结构定义一个 Dynamodb 表资源。我们已经将桌面的收费模式设置为 PAY per request,以避免产生任何费用
  • 默认情况下,有状态资源的支持(S3 bucket、数据库)被设置为RETAIN
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as cdk from 'aws-cdk-lib'
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'export class CdkAppStack extends Stack {constructor(scope: Construct, id: string, props?: StackProps) {super(scope, id, props);const bucket = new s3.Bucket(this,'avatars-bucket',{removalPolicy:cdk.RemovalPolicy.DESTROY //当删除堆栈时,s3桶也会被删除});const table = new dynamodb.Table(this,'todos-table',{partitionKey:{name:'todoId',type:dynamodb.AttributeType.NUMBER},billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,removalPolicy:cdk.RemovalPolicy.DESTROY //删除堆栈式,table也会被删除});}
}

construct的构造参数:

  • Scope 参数指定在其中初始化子构造的父构造。在 JavaScript 中,我们使用 this 这个关键词,在 Python self 中,等等。
  • Id 参数——范围内必须唯一的标识符。
  • props参数-键-值对用于为资源设置配置选项,即构造规定。请注意,不同结构的支持是不同的。

此时可以运行cdk diff命令查看更改

cdk diff
output:
Stack CdkAppStack
Resources
[+] AWS::S3::Bucket avatars-bucket avatarsbucketE3043F49
[+] AWS::DynamoDB::Table todos-table todostableCA1914CD

Cdk diff 命令比较堆栈的部署版本和本地版本。因为我们还没有部署我们的堆栈,它只是告诉我们,如果我们现在就部署,我们会提供2个资源。

在迭代和更新基础结构时,这是一个非常方便的命令,因为如果您做了任何可能删除或更新资源的更改,您将立即看到 cdk diff 输出中的更改。

使用cdk ls可以列出当前堆栈,CDK 列表命令列出了 CDK 应用程序中所有栈的名称。堆栈的名称是从 id prop 推断出来的,在 bin/cdk-app. ts 中实例化堆栈时传递:

CDK 列表命令中一个非常方便的标志是 – long 标志,它包含有关 CDK 应用程序的环境(帐户、区域)的信息:

cdk list --long
output:
- id: CdkAppStackname: CdkAppStackenvironment:account: "xxxxxxxxx"region: cn-north-1name: aws://xxxxxxxx/cn-north-1

6、生成cloudcormation模板

我们将在 lib/cdk-app-stack. ts 中编写的栈的基础上,合成一个 CloudFormation 模板。

在运行 synth 命令之后,我们可以看到与堆栈等价的 CloudFormation

cdk synth
output:
Resources:avatarsbucketE3043F49:Type: AWS::S3::BucketUpdateReplacePolicy: DeleteDeletionPolicy: DeleteMetadata:aws:cdk:path: CdkAppStack/avatars-bucket/ResourcetodostableCA1914CD:Type: AWS::DynamoDB::TableProperties:KeySchema:- AttributeName: todoIdKeyType: HASHAttributeDefinitions:- AttributeName: todoIdAttributeType: "N"BillingMode: PAY_PER_REQUESTUpdateReplacePolicy: DeleteDeletionPolicy: DeleteMetadata:aws:cdk:path: CdkAppStack/todos-table/ResourceCDKMetadata:Type: AWS::CDK::MetadataProperties:Analytics: v2:deflate64:H4sIAAAAAAAA/zPSM9AzUEwsL9ZNTsnWzclM0qsOLklMztYBCsVXFxvrVTuVJmenlug4p+VBWLU6KZV5ibn5KUClIYlJOakgKTCjtlYnKLU4v7QoGSwGY9fq5OWnpOplFeuXGZrpGRoD7csqzszULSrNK8nMTdULgtAAbg60MIoAAAA=Metadata:aws:cdk:path: CdkAppStack/CDKMetadata/Default

cdk命令会执行typesctipt代码,并在生成cdk.out/cdk-stack-dev.template.json模板文件

7、部署stack

执行cdk deploy命令部署stack

在部署 CloudFormation 堆栈之前,应该不会花很长时间。您可以访问 CloudFormation 控制台来查看详细信息。

8、更新stack

我们决定 Dynamodb 表的分区键名应该是 id,而不是 todoId。

//lib/cdk-app-stack.ts
const table = new dynamodb.Table(this, 'todos-table', {- partitionKey: {name: 'todoId', type: dynamodb.AttributeType.NUMBER},
+ partitionKey: {name: 'id', type: dynamodb.AttributeType.NUMBER},billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,removalPolicy: cdk.RemovalPolicy.DESTROY,
})
cdk diff
output :
Stack CdkAppStack
Resources
[~] AWS::DynamoDB::Table todos-table todostableCA1914CD replace├─ [~] AttributeDefinitions (may cause replacement)│   └─ @@ -1,6 +1,6 @@│      [ ] [│      [ ]   {│      [-]     "AttributeName": "todoId",│      [+]     "AttributeName": "id",│      [ ]     "AttributeType": "N"│      [ ]   }│      [ ] ]└─ [~] KeySchema (requires replacement)└─ @@ -1,6 +1,6 @@[ ] [[ ]   {[-]     "AttributeName": "todoId",[+]     "AttributeName": "id",[ ]     "KeyType": "HASH"[ ]   }[ ] ]

9、添加Outputs

我们将把 output 添加到 CDK 堆栈中,这些值可以导入到其他堆栈中,或者在本例中重定向到本地文件系统中的文件。

例如,资源标识符(比如 bucket name,API URL)必须在后端和前端代码之间保持同步。通过将输出重定向到文件系统上的 json 文件,我们使前端代码能够导入属性并使用它们。

我们将向 cdk deploy 命令添加一个新标志。Output-file 标志允许我们将在堆栈中定义的输出写入本地文件系统上的文件。

export class CdkAppStack extends Stack {constructor(scope: Construct, id: string, props?: StackProps) {super(scope, id, props);const bucket = new s3.Bucket(this,'avatars-bucket',{removalPolicy:cdk.RemovalPolicy.DESTROY});const table = new dynamodb.Table(this,'todos-table',{partitionKey:{name:'id',type:dynamodb.AttributeType.NUMBER},billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,removalPolicy:cdk.RemovalPolicy.DESTROY});new cdk.CfnOutput(this, 'bucketName', {value: bucket.bucketName,});new cdk.CfnOutput(this, 'tableName', {value: table.tableName});}
}
cdk deploy --outputs-file ./cdk-outputs.json

项目根目录中的 cdk-outputs.json 文件会包含output

10、创建第二个stack

cdk-stack-dev 中没有任何差异,但是如果我们部署 cdk-stack-prod,那么 Bucket 和 Table 资源将被创建

大多数实际应用程序中,您将不得不管理多个堆栈

const app = new cdk.App();new CdkAppStack(app, 'cdk-stack-dev', {stackName: 'cdk-stack-dev',env: {account: process.env.CDK_DEFAULT_ACCOUNT,region: process.env.CDK_DEFAULT_REGION,},
});new CdkAppStack(app, 'cdk-stack-prod', {stackName: 'cdk-stack-prod',env: {account: process.env.CDK_DEFAULT_ACCOUNT,region: process.env.CDK_DEFAULT_REGION,},
});

11、删除堆栈

为了删除我们提供的栈,我们必须使用 destroy 命令:

npx cdk destroy [stackname]

延伸阅读

  • aws cdk中的token
  • aws cdk中的Constructs(包括cfn的3个level)
  • 如何获取accountId和region

aws cdk 理解和使用cdk创建堆栈(typescript)相关推荐

  1. 深入理解Java内存(图解堆栈)

    转载:深入理解Java内存(图解堆栈) - 万物为铜 - 博客园 深入理解Java内存(图解) 进入正题前首先要知道的是Java程序运行在JVM(Java Virtual  Machine,Java虚 ...

  2. 深入理解Java的栈与堆栈

    我想这篇足以让大家很清晰理解Java的栈和堆栈的区别.下面的是我收集了好多网友的资料加以整理的. Java 中的堆和栈  Java把内存划分成两种:一种是栈内存,一种是堆内存. 1.栈(stack)与 ...

  3. 修炼内功——理解函数栈帧创建和销毁

    函数栈帧 1. 全局观: 今天我们讲的是栈区,以下的图上方是低地址,下方是高地址,跟上图相反,因此使用顺序是从下方到上方,跟上图本质上一致. 2. 函数的调用关系 ebp,esp这两个寄存器中存放的是 ...

  4. 2021最新版-AWS亚马逊云RDS创建Aurora MySQL集群

    AWS亚马逊云RDS创建Aurora MySQL集群 文章目录 AWS亚马逊云RDS创建Aurora MySQL集群 1.进入AWS-RDS控制台创建数据库 2.选择你要创建的数据库 3.Amazon ...

  5. 搭建环境,创建vue3+typescript+vuetify项目

    使用场景 使用Vue框架创建 vue3+typescript+vuetify3 项目: 一. Node下载安装及配置 1. node官网下载地址: https://nodejs.org/en/ 2. ...

  6. aws appsync 理解和使用appsync为前端应用创建api接口

    参考资料 https://docs.amazonaws.cn/appsync/latest/devguide/quickstart-launch-a-sample-schema.html 在 AWS ...

  7. 亚马逊云科技 Build On - 理解和使用 stepfunction 创建 serverless 应用

    荣幸参与和csdn和aws联合举办的buildon实验活动,主要目的还是学习stepfucntion的使用,这个服务能够集成大量aws service感觉可以出现很多有趣的用法.官方给出的文档已经非常 ...

  8. AWS入门指南之一:怎样创建免费的AWS账号

    从今天起,打算慢慢写一系列关于aws的文章.主要集中于AWS的一些基本知识和操作指南.这其中会穿插于介绍一些云和分布式系统的知识,但是以AWS的实现为主.可能会带有少量的代码,但是主体操作应该会使用A ...

  9. aws cloudformation 理解自定义资源的使用

    资料 AWS::CloudFormation::CustomResource cfn-response module 自定义资源的逻辑 cloudformation只能对aws service进行部署 ...

最新文章

  1. 海思全力部署智能城市NB-IoT应用
  2. LeetCode Wiggle Subsequence(动态规划)
  3. mysql5717开发设置怎么调回来_华为手机这几个默认设置,一定要关闭,再也不卡顿...
  4. 洛谷 P1968 美元汇率
  5. phpsduty环境下,使用composer安装报错
  6. Java NIO (十四)NIO 和 IO 的区别和适用场景分析
  7. git编译安装与常见问题解决
  8. 关于python 和C++使用cv画矩形并填充颜色同时填充文字
  9. 50个linux初学者必须掌握的命令
  10. Windows Server 2008 R2之活动目录回收站
  11. Mac/Linux 安装联邦学习 Fate 框架单机部署所需的依赖(填坑大全)
  12. java 送参数_关于java:如何以编程方式发送带参数的HTTP请求?
  13. linux命令行效率,聊聊那些可以提高工作效率的Linux命令
  14. Tableau Desktop 安装与破解
  15. mysql调查问卷_mysql – 解密数据库ER图用于问卷调查
  16. 二手房数据分析预测系统
  17. java程序设计概念对象先行_《Java程序设计概念:对象先行》【摘要 书评 在线阅读】-苏宁易购图书...
  18. Instructions on EINT configuration for SIM hot swap for MT6575/MT6577 platforms
  19. 网站SEO优化方案 全面详细的写法
  20. 知识科普:5G是什么

热门文章

  1. 使用JavaScript调用本地打印机
  2. Failed to initialize end point associated with ProtocolHandler [“http-bio-9088“] 问题已解决
  3. 西联汇款(Adsense)
  4. rabbitmq问题解决方法汇总
  5. JAX-WS之旅(一)
  6. 雷达卫星参数学习汇总
  7. Excel VBA系列:实现奖金比例计算+4种公式法
  8. LeetCode刷题进阶之换酒问题(1518)
  9. 基于Stm32的RFID-RC522模块的对RFID读写使用
  10. 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)