Skip to content

Setup

Setup (aws-vault)

  • AdministratorAccessをアタッチしたロール role-cdk を作成。
  • role-cdk にAssumeRoleするためのロール role-assumed をを作成。
  • IAM ユーザー cli-user を作成。ロールに role-assumed をアタッチ。
  • アクセスキーを作成
  • aws-vault で アクセスキーを登録。

    # シークレットの登録
    aws-vault add cli
    
    # セッション情報の確認
    aws-vault exec cli -- env | grep AWS
    

  • ${HOME}/.aws/config にcdkのプロファイルを作成

# created by aws-vault
[profile cli]


# add
[profile cdk]
source_profile=cli
role_arn=arn:aws:iam::${AWS:AccountId}:role/role-cdk
role_session_name=cdk-session
  • 確認
    # 確認
    aws-vault exec cli -- env | grep AWS
    
    # セッション開始
    aws-vault exec cdk
    

Command

カスタムコンストラクタ

カスタムコンストラクタの作成

カスタムコンストラクタをローカルモジュールとしてインストールする。

npm install --save ../path/to/mymodule
  • 環境新規作成

    aws-vault exec atsuw0-cdk
    

  • 環境ごとで実行したい場合は、必ず Bootstrap コマンドを実行する。

    # Get the account ID
    aws sts get-caller-identity
    
    # Bootstrap the account
    cdk bootstrap aws://ACCOUNT-NUMBER/REGION
    

  • デプロイまで

# 差分確認
cdk diff

# テンプレート一覧
cdk list 

# Cfnテンプレート生成
cdk synth --no-version-reporting

# Cfnテンプレート生成(スタック指定)
cdk synth [StackName] --no-version-reporting

# Cfnテンプレート生成(console.logの部分だけ出力)
cdk synth [StackName] --quiet 

# Contextの指定(各環境ごと)
cdk synth [StackName] --context EnvName=prd

# デプロイ
cdk deploy

# 全スタックをデプロイ
cdk deploy --all

# スタックを指定してデプロイ
cdk deploy [StackName]

# デストロイ
cdk destroy

基本

CDK プロジェクトのアーキテクチャ

  • App ... AppはCDKプロジェクト全体を総称。App内で複数StackのデプロイやStack間の依存関係を定義。
  • Stack ... Cfnスタックと同義。Cfnスタック内で複数のConstructを定義。
  • Construct ... 作成するリソース単位をconstructという。

コンストラクタ

  • L1 Construct (CloudFormation-only) ... Low Layer のコンストラクタ。Cfnのように、1つ1つのリソースを定義することが可能。Cfnというクラス名が付けられている。

  • L2 Construct (Curated)

  • L3 Construct (Patterns)

  • L1, L2を組み合わせたコンストラクタ。ECSやサーバレス構成など一般的なパターンを定義。patternsというライブラリ名を指定。

コンストラクタ階層

カスタムコンストラクト

CDK deploy時の挙動

App lifecycleを参照。

https://docs.aws.amazon.com/images/cdk/v2/guide/images/Lifecycle.png

Test

Test 基本

Assertionモジュール aws-cdk-lib.assertions を使用して実施。 

  • assert
  • snapshot test ... 前回実施分のCfnテンプレートとの変更の差分を確認。
  • Fine-grained Assertions ... 作成したリソースの設定値がただしく設定されているかを確認。

テストコマンド

  • package.jsonを確認。今回はjestが使用されている想定で話を展開する。

      "scripts": {
            :
            :
        "test": "jest",
            :
            :
      },
    

  • jest.config.jsを編集。 ./test/*.test.tsのファイルがテスト対象。

    module.exports = {
      testEnvironment: 'node',
      roots: ['<rootDir>/test'],
      testMatch: ['**/*.test.ts'],
      transform: {
        '^.+\\.tsx?$': 'ts-jest'
      }
    };
    

  • Modify cdk-demo.test.ts

  • test command
npm test

# テンプレートをアップデート
npm test -- -u

役に立つ? Construct Library、カスタムパッケージ など

ConstructHubから、探す。

  • コンテナ
  • ecspresso v2 ... Terraform とかで ECSを利用するなら、入れたほうがいい。
  • cdk-ecr-deployment
  • cdk-docker-image-deployment

    • ECRへコンテナのBuild〜Pushまでをワンストップで実施(切り戻し、タグ付も可)。 小規模だと開発とインフラが同じチームというのもあるので、小規模向けだとこれでもいい気が。
  • s3

  • [aws-s3-deployment] ... CDKプロジェクト内で、静的コンテンツなどをデプロイ。

  • Lambda

  • CDK Watch ... TypeScriptなどコンパイルが必要なソースに対しては、一々コンパイル → デプロイがじっしされるが、CDK Watch を導入することで、変更を検知して、デプロイしてくれる。--hotswapをオプション指定することで、Cfnを介さず爆速でデプロイを実施することができる。

  • cdk-nag

  • ベストプラクティスに則っているかなどリソースをスキャン。
  • suppress ... スキャンによってルールに則らないリソースの作成を中止する。

メリット/デメリット

メリット

- CfnやTerraformと異なり、高階層やpackagesコンストラクタを定義することで、リソースを一つ一つ作成せずに、定義することが可能。

デメリット

  • Terraform のignore_changesのように、リソース管理対象からコンストラクタを除外することができない。

リファレンス