Skip to content

CDKインフラストラクチャ

AWS CDKはAWS CloudFormationを通じてクラウドインフラストラクチャをコードで定義するフレームワークです。

TypeScriptインフラストラクチャジェネレータは、TypeScriptで記述されたAWS CDKインフラストラクチャアプリケーションを作成します。生成されたアプリケーションにはCFN Guardチェックによるセキュリティベストプラクティスが含まれています。

インフラストラクチャプロジェクトの生成

Section titled “インフラストラクチャプロジェクトの生成”

新しいインフラストラクチャプロジェクトは2つの方法で生成できます:

  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>ディレクトリに以下のプロジェクト構造を作成します:

    • Directorysrc
      • main.ts デプロイするCDKステージをインスタンス化するアプリケーションエントリポイント
      • Directorystages CDKステージ定義
        • application-stage.ts ステージでデプロイするスタックの集合を定義
      • Directorystacks CDKスタック定義
        • application-stack.ts メインアプリケーションスタック
    • cdk.json CDK設定ファイル
    • project.json プロジェクト設定とビルドターゲット

    CDKインフラストラクチャの実装

    Section titled “CDKインフラストラクチャの実装”

    src/stacks/application-stack.ts内でCDKインフラストラクチャの記述を開始できます。例:

    src/stacks/application-stack.ts
    import { Stack, StackProps } from 'aws-cdk-lib';
    import { Bucket } from 'aws-cdk-lib/aws-s3'
    import { Construct } from 'constructs';
    export class ApplicationStack extends Stack {
    constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    // インフラストラクチャをここに記述
    new Bucket(this, 'MyBucket');
    }
    }

    トップレベルのsrc/main.tsファイルが<namespace>-sandboxという名前のCDKステージをインスタンス化していることに気付くでしょう。このステージは開発とテスト用に設計されています。

    src/main.ts
    new ApplicationStage(app, 'project-sandbox', {
    env: {
    account: process.env.CDK_DEFAULT_ACCOUNT,
    region: process.env.CDK_DEFAULT_REGION,
    },
    });

    betaprodステージを追加して別々の環境にデプロイすることも可能です:

    src/main.ts
    new ApplicationStage(app, 'project-beta', {
    env: {
    account: '123456789012', // betaアカウント
    region: 'us-west-2',
    },
    });
    new ApplicationStage(app, 'project-prod', {
    env: {
    account: '098765432109', // prodアカウント
    region: 'us-west-2',
    },
    });

    ステージはアプリケーションを構成するスタックの集合を定義します。ステージ内で任意の数のスタックをインスタンス化できます:

    src/stages/application-stage.ts
    import { Stage, StageProps } from 'aws-cdk-lib';
    import { Construct } from 'constructs';
    import { BackendStack } from '../stacks/backend-stack.js';
    import { FrontendStack } from '../stacks/frontend-stack.js';
    /**
    * アプリケーションを構成するCDKスタックの集合を定義
    */
    export class ApplicationStage extends Stage {
    constructor(scope: Construct, id: string, props?: StageProps) {
    super(scope, id, props);
    new BackendStack(this, 'Backend', {
    crossRegionReferences: true,
    })
    new FrontendStack(this, 'Frontend', {
    crossRegionReferences: true,
    });
    }
    }

    tRPC APIまたはFastAPIジェネレータを使用して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', {
    integrations: MyApi.defaultIntegrations(this).build(),
    });
    }
    }

    ウェブサイトインフラストラクチャ

    Section titled “ウェブサイトインフラストラクチャ”

    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アカウントのブートストラップ

    Section titled “AWSアカウントのブートストラップ”

    初めて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 <my-infra>-sandbox/*

    CI/CDパイプラインでのAWSデプロイ

    Section titled “CI/CDパイプラインでのAWSデプロイ”

    CI/CDパイプラインでAWSにデプロイする場合はdeploy-ciターゲットを使用します。

    Terminal window
    pnpm nx run <my-infra>:deploy-ci my-stage/*

    このターゲットは通常のdeployターゲットと異なり、事前合成済みのクラウドアセンブリを使用します。これによりパッケージバージョンの変更による非決定性の問題を回避し、すべてのパイプラインステージで同一のクラウドアセンブリを使用してデプロイできます。

    destroyターゲットを使用してリソースを削除します:

    Terminal window
    pnpm nx run <my-infra>:destroy <my-infra>-sandbox/*

    CDKの詳細についてはCDK開発者ガイドAPIリファレンスを参照してください。