跳转到内容

CDK基础设施

AWS CDK 是一个通过代码定义云基础设施并通过 AWS CloudFormation 进行部署的框架。

TypeScript 基础设施生成器会创建一个用 TypeScript 编写的 AWS CDK 基础设施应用程序。生成的应用程序通过 CFN Guard 检查包含安全最佳实践。

您可以通过两种方式生成新的基础设施项目:

  1. 安装 Nx Console VSCode Plugin 如果您尚未安装
  2. 在VSCode中打开Nx控制台
  3. 点击 Generate (UI) 在"Common Nx Commands"部分
  4. 搜索 @aws/nx-plugin - ts#infra
  5. 填写必需参数
    • 点击 Generate
    参数 类型 默认值 描述
    name 必需 string - The name of the application.
    ruleSet string aws_prototyping Rule set to validate your AWS resources with.
    directory string packages The directory of the new application.

    生成器将在 <directory>/<name> 目录下创建以下项目结构:

    • 文件夹src
      • main.ts 应用程序入口点,实例化要部署的CDK堆栈
      • 文件夹stacks CDK堆栈定义
        • application-stack.ts 主应用堆栈
    • cdk.json CDK配置
    • project.json 项目配置和构建目标

    您可以在 src/stacks/application-stack.ts 中开始编写CDK基础设施代码,例如:

    src/stacks/application-stack.ts
    import * as cdk from 'aws-cdk-lib';
    import { Bucket } from 'aws-cdk-lib/aws-s3'
    import { Construct } from 'constructs';
    export class ApplicationStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // 在此声明您的基础设施
    new Bucket(this, 'MyBucket');
    }
    }

    如果您使用过 tRPC APIFastAPI 生成器创建API,您会注意到在 packages/common/constructs 中已有现成的构造体可用于部署。

    例如,如果您创建了一个名为 my-api 的tRPC API,只需导入并实例化该构造体即可添加部署所需的所有基础设施:

    src/stacks/application-stack.ts
    import * as cdk from 'aws-cdk-lib';
    import { Construct } from 'constructs';
    import { MyApi } from ':my-scope/common-constructs';
    export class ApplicationStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // 添加API基础设施
    new MyApi(this, 'MyApi');
    }
    }

    如果您使用过 CloudScape网站 生成器,您会注意到在 packages/common/constructs 中已有现成的构造体可用于部署。例如:

    src/stacks/application-stack.ts
    import * as cdk from 'aws-cdk-lib';
    import { Construct } from 'constructs';
    import { MyWebsite } from ':my-scope/common-constructs';
    export class ApplicationStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // 添加网站基础设施
    new MyWebsite(this, 'MyWebsite');
    }
    }

    请确保在声明网站构造体之前声明所有API构造体,这样网站的 运行时配置 才能包含所有API配置。

    作为 build 目标的一部分,除了运行 默认的编译、代码检查和测试目标 外,您的基础设施项目会被_合成_为CloudFormation模板。也可以通过单独执行 synth 目标来运行:

    Terminal window
    pnpm nx run <my-infra>:synth

    合成后的云装配件将位于根目录的 dist 文件夹中,路径为 dist/packages/<my-infra-project>/cdk.out

    如果是首次向某个AWS账户部署CDK应用,需要先进行账户初始化。

    首先确保已 配置AWS账户凭证

    然后使用 cdk bootstrap 命令:

    Terminal window
    npx cdk bootstrap aws://<account-id>/<region>

    更多细节请参考 CDK文档

    构建完成后,可以使用 deploy 目标将基础设施部署到AWS。

    首先确保已 配置AWS账户凭证

    然后运行部署目标:

    Terminal window
    pnpm nx run <my-infra>:deploy --all

    在CI/CD流水线中部署时请使用 deploy-ci 目标:

    Terminal window
    pnpm nx run <my-infra>:deploy-ci my-stack

    该目标与常规 deploy 目标的区别在于:它会确保部署预先生成的云装配件,而不是动态生成。这有助于避免因软件包版本变化导致的非确定性问题,确保流水线每个阶段都使用相同的云装配件进行部署。

    有关CDK的更多信息,请参考 CDK开发者指南API参考文档