🚢

[AWS CDK]cdk deployコマンドのオプションを順番に試してみる~其の①

2023/08/31に公開

前提

同設定×3を用意しています。CfnVPCはL1なので素のCfnでVPCを作っているのと同じです。

bin/cdk-sample.ts
#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import { DefaultStackSynthesizer } from 'aws-cdk-lib';
import { 
    CdkSampleStack,
    CdkSampleStack2,
    CdkSampleStack3,
} from '../lib/cdk-sample-stack';

const app = new cdk.App();
new CdkSampleStack(app, 'CdkSampleStack', {
    synthesizer: new DefaultStackSynthesizer({
        fileAssetsBucketName: 'cdk-sample-assets', // bootstrapのバケット名を指定
        generateBootstrapVersionRule: false,
    }),
});
new CdkSampleStack2(app, 'CdkSampleStack2', {
    synthesizer: new DefaultStackSynthesizer({
        fileAssetsBucketName: 'cdk-sample-assets', // bootstrapのバケット名を指定
        generateBootstrapVersionRule: false,
    }),
});
new CdkSampleStack3(app, 'CdkSampleStack3', {
    synthesizer: new DefaultStackSynthesizer({
        fileAssetsBucketName: 'cdk-sample-assets', // bootstrapのバケット名を指定
        generateBootstrapVersionRule: false,
    }),
});
lib/cdk-sample-stack.ts
import { Duration, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const vpc = new ec2.CfnVPC(this, 'Vpc', {
      cidrBlock: '10.0.0.0/16',
    });
  }
}
export class CdkSampleStack2 extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const vpc = new ec2.CfnVPC(this, 'Vpc', {
      cidrBlock: '10.0.0.0/16',
    });
  }
}
export class CdkSampleStack3 extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const vpc = new ec2.CfnVPC(this, 'Vpc', {
      cidrBlock: '10.0.0.0/16',
    });
  }
}

※スタックを指定してコマンド実行をする場合、各項目で選択しているスタックに特別な意味はありません。


順に試してみる

まずは--helpをつけてオプション一覧を確認

実行結果
$ cdk deploy --help
cdk deploy [STACKS..]

Deploys the stack(s) named STACKS into your AWS account

Options:
  -a, --app                  REQUIRED WHEN RUNNING APP: command-line for
                             executing your app or a cloud assembly directory
                             (e.g. "node bin/my-app.js"). Can also be specified
                             in cdk.json or ~/.cdk.json                 [string]
      --build                Command-line for a pre-synth build         [string]
  -c, --context              Add contextual string parameter (KEY=VALUE) [array]
  -p, --plugin               Name or path of a node package that extend the CDK
                             features. Can be specified multiple times   [array]
      --trace                Print trace for stack warnings            [boolean]
      --strict               Do not construct stacks with warnings     [boolean]
      --lookups              Perform context lookups (synthesis fails if this is
                             disabled and context lookups need to be performed)
                                                       [boolean] [default: true]
      --ignore-errors        Ignores synthesis errors, which will likely produce
                             an invalid output        [boolean] [default: false]
  -j, --json                 Use JSON output instead of YAML when templates are
                             printed to STDOUT        [boolean] [default: false]
  -v, --verbose              Show debug logs (specify multiple times to increase
                             verbosity)                 [count] [default: false]
      --debug                Enable emission of additional debugging
                             information, such as creation stack traces of
                             tokens                   [boolean] [default: false]
      --profile              Use the indicated AWS profile as the default
                             environment                                [string]
      --proxy                Use the indicated proxy. Will read from HTTPS_PROXY
                             environment variable if not specified      [string]
      --ca-bundle-path       Path to CA certificate to use when validating HTTPS
                             requests. Will read from AWS_CA_BUNDLE environment
                             variable if not specified                  [string]
  -i, --ec2creds             Force trying to fetch EC2 instance credentials.
                             Default: guess EC2 instance status        [boolean]
      --version-reporting    Include the "AWS::CDK::Metadata" resource in
                             synthesized templates (enabled by default)[boolean]
      --path-metadata        Include "aws:cdk:path" CloudFormation metadata for
                             each resource (enabled by default)        [boolean]
      --asset-metadata       Include "aws:asset:*" CloudFormation metadata for
                             resources that uses assets (enabled by default)
                                                                       [boolean]
  -r, --role-arn             ARN of Role to use when invoking CloudFormation
                                                                        [string]
      --staging              Copy assets to the output directory (use
                             --no-staging to disable the copy of assets which
                             allows local debugging via the SAM CLI to reference
                             the original source files)[boolean] [default: true]
  -o, --output               Emits the synthesized cloud assembly into a
                             directory (default: cdk.out)               [string]
      --notices              Show relevant notices                     [boolean]
      --no-color             Removes colors and other style from console output
                                                      [boolean] [default: false]
      --ci                   Force CI detection. If CI=true then logs will be
                             sent to stdout instead of stderr
                                                      [boolean] [default: false]
      --version              Show version number                       [boolean]
      --all                  Deploy all available stacks
                                                      [boolean] [default: false]
  -E, --build-exclude        Do not rebuild asset with the given ID. Can be
                             specified multiple times      [array] [default: []]
  -e, --exclusively          Only deploy requested stacks, don't include
                             dependencies                              [boolean]
      --require-approval     What security-sensitive changes need manual
                             approval
                         [string] [choices: "never", "any-change", "broadening"]
      --notification-arns    ARNs of SNS topics that CloudFormation will notify
                             with stack related events                   [array]
  -t, --tags                 Tags to add to the stack (KEY=VALUE), overrides
                             tags from Cloud Assembly (deprecated)       [array]
      --execute              Whether to execute ChangeSet (--no-execute will NOT
                             execute the ChangeSet) (deprecated)
                                                          [deprecated] [boolean]
      --change-set-name      Name of the CloudFormation change set to create
                             (only if method is not direct)             [string]
  -m, --method               How to perform the deployment. Direct is a bit
                             faster but lacks progress information
                [string] [choices: "direct", "change-set", "prepare-change-set"]
  -f, --force                Always deploy stack even if templates are identical
                                                      [boolean] [default: false]
      --parameters           Additional parameters passed to CloudFormation at
                             deploy time (STACK:KEY=VALUE) [array] [default: {}]
  -O, --outputs-file         Path to file where stack outputs will be written as
                             JSON                                       [string]
      --previous-parameters  Use previous values for existing parameters (you
                             must specify all parameters on every deployment if
                             this is disabled)         [boolean] [default: true]
      --toolkit-stack-name   The name of the existing CDK toolkit stack (only
                             used for app using legacy synthesis)       [string]
      --progress             Display mode for stack activity events
                                             [string] [choices: "bar", "events"]
      --rollback             Rollback stack to stable state on failure. Defaults
                             to 'true', iterate more rapidly with --no-rollback
                             or -R. Note: do **not** disable this flag for
                             deployments with resource replacements, as that
                             will always fail                          [boolean]
      --hotswap              Attempts to perform a 'hotswap' deployment, but
                             does not fall back to a full deployment if that is
                             not possible. Instead, changes to any
                             non-hotswappable properties are ignored.Do not use
                             this in production environments           [boolean]
      --hotswap-fallback     Attempts to perform a 'hotswap' deployment, which
                             skips CloudFormation and updates the resources
                             directly, and falls back to a full deployment if
                             that is not possible. Do not use this in production
                             environments                              [boolean]
      --watch                Continuously observe the project files, and deploy
                             the given stack(s) automatically when changes are
                             detected. Implies --hotswap by default    [boolean]
      --logs                 Show CloudWatch log events from all resources in
                             the selected Stacks in the terminal. 'true' by
                             default, use --no-logs to turn off. Only in effect
                             if specified alongside the '--watch' option
                                                       [boolean] [default: true]
      --concurrency          Maximum number of simultaneous deployments
                             (dependency permitting) to execute.
                                                           [number] [default: 1]
      --asset-parallelism    Whether to build/publish assets in parallel
                                                                       [boolean]
      --asset-prebuild       Whether to build all assets before deploying the
                             first stack (useful for failing Docker builds)
                                                       [boolean] [default: true]
  -h, --help                 Show help                                 [boolean]
翻訳

cdk deploy [STACKS...]を実行します。

STACKSという名前のスタックをAWSアカウントにデプロイします。


Option


-a, --app

アプリ実行時に必要: アプリまたはクラウドアセンブリディレクトリを実行するためのコマンドラインです。 (例:"node bin/my-app.js")
cdk.json または ~/.cdk.jsonのように指定することもできます。
[string]


--build

Command-line合成前ビルドのためのコマンドライン。
[string]


-c, --context

コンテキスト文字列パラメータ(KEY=VALUE)を追加します。
[array]


-p, --plugin

CDKの機能を拡張するノードパッケージの名前またはパス。
複数回指定可能。
[array]


--trace

スタック警告のトレースを表示する。
[boolean]


--strict

警告を含むスタックを構築しない
[boolean]


--lookups

コンテキストの検索を実行する。
(これが無効の場合、合成は失敗する。コンテキスト検索を実行する必要があります。)
[boolean]
[default: false]


--ignore-errors

合成エラーを無視する。
無効な出力を生成する可能性があります。
[boolean]
[default: false]


-j, --json

テンプレートがSTDOUTに出力されるとき、YAMLの代わりにJSON出力を使用する。
[boolean]
[default:false]


-v, --verbose

デバッグログを表示する (複数回指定すると冗長性が増す)
[count]
[default: false]


--debug

トークンの作成スタック・トレースなど、追加のデバッグ情報の出力を有効にする。
[boolean]
[default: false]


--profile

指定したAWSプロファイルをデフォルト環境として使用する。
[string]


--proxy

指定されたプロキシを使用します。
指定されていなければ HTTPS_PROXY環境変数から読み込まれる
[string]


--ca-bundle-path

HTTPSリクエストの検証時に使用するCA証明書へのパス。
指定しない場合、AWS_CA_BUNDLE 環境変数から読み込みます。
[string]


-i, --ec2creds

EC2 インスタンスの認証情報を強制的に取得する。
デフォルト:EC2インスタンスのステータスを推測する。
[boolean]


--version-reporting

合成したテンプレートに "AWS::CDK::Metadata "リソースを含める。
(デフォルトで有効)
[boolean]


--path-metadata

各リソースに "aws:cdk:path "CloudFormationメタデータを含める。
(デフォルトで有効)
[boolean]


--asset-metadata

"aws:asset:*"を含める。のCloudFormationメタデータを含める。
(デフォルトで有効)
[boolean]


-r, --role-arn

CloudFormationを起動する際に使用するRoleのARN。
[string]


--staging

アセットを出力ディレクトリにコピーする。
(--no-stagingを使用してアセットのコピーを無効にし、SAM CLI によるローカルデバッグで元のソースファイルを参照できるようにします。)
[boolean]
[default: true]


-o, --output

合成したクラウドアセンブリを以下のディレクトリに出力します。
(デフォルト: cdk.out)
[string]


--notices

関連する通知を表示する。
[boolean]


--no-color

コンソール出力から色やその他のスタイルを削除します。
[boolean]
[default: false]


--CI

CIを強制的に検出する。
CI=trueの場合、ログは標準エラーではなく標準出力に送られる
[boolean]
[default: false]


--version

バージョン番号を表示する。
[boolean]


--all

利用可能なすべてのスタックをデプロイする。
[boolean]
[default: false]


-E, --build-exclude

指定した ID のアセットを再構築しません。
複数回指定可能。
[array]
[default: []]。


-e, --exclusively

要求されたスタックのみを展開し、依存関係は含めない。
[boolean]


--require-approval

セキュリティ上重要な変更で、手動による承認。
[string]
[選択肢:"never"、"any-change"、"broadening"]


--notification-arns

CloudFormation がスタック関連のイベントを通知する SNS トピックの ARN。
[array]


-t, --tags

スタックに追加するタグ (KEY=VALUE)。
クラウドアセンブリからのタグ (非推奨)
[array]


--execute

ChangeSet を実行するかどうか。
(--no-execute は ChangeSetを実行しない)(非推奨)
[boolean]


--change-set-name

作成するCloudFormation変更セットの名前。
(メソッドが直接でない場合のみ)
[string]


-m, --method

デプロイの実行方法。直接の方がより高速ですが、進捗情報がありません。
[string]
[選択肢: "direct"、"change-set"、"prepare-change-set"]


-f, --force

テンプレートが同一でも常にスタックをデプロイする。
[boolean]
[デフォルト:false]。


--parameters

デプロイ時にCloudFormationに渡される追加パラメータ (STACK:KEY=VALUE)
[array]
[default: {}]


-O, --outputs-file

スタックの出力が書き込まれるファイルへのパス。JSON。
[string]


--previous-parameters

既存のパラメータには以前の値を使用します。
(これが無効になっている場合、すべてのデプロイメントですべてのパラメータを指定する必要があります。)
[boolean]
[default: true]


--toolkit-stack-name

既存のCDKツールキットスタックの名前。
(レガシー合成を使用するアプリのみ)
[string]


--progress

スタックのアクティビティイベントの表示モード。
[string]
[選択肢: "bar", "events"]


--rollback

失敗時にスタックを安定状態にロールバックする。
デフォルトは'true'で、--no-rollback や -R を使ってより高速に繰り返します。
注意: リソースの置き換えを伴うデプロイメントでは、このフラグを無効にしないでください。
常に失敗します。
[boolean]。


--hotswap

ホットスワップ」デプロイメントを実行しようとする。
それが不可能な場合は完全な展開にフォールバックしない。
代わりに、ホットスワップ不可能な への変更は無視されます。
本番環境では使用しないでください。
[boolean]


--hotswap-fallback

CloudFormationをスキップしてリソースを更新する「ホットスワップ」デプロイメントの実行を試みます。できない場合はフルデプロイメントにフォールバックします。
本番環境では使用しないでください。
[boolean]


--watch

プロジェクトファイルを継続的に監視し、変更があったときに指定されたスタック(複数可)を自動的にデプロイする。
デフォルトでは--hotswapを暗示する。
[boolean]


--logs

選択したスタックのすべてのリソースからの CloudWatch ログイベントをターミナルに表示する。
デフォルトでは'true'。オフにするには--no-logsを使う。
有効なのは--watchオプションと同時に指定した場合のみ有効です。
[boolean]
[デフォルト:true]。


--concurrency

同時デプロイの最大数。(依存関係許可) を実行する最大数。
[number]
[デフォルト: 1]

--asset-parallelism

アセットを並行して構築/公開するかどうか。
[boolean]


--asset-prebuild

最初のスタックをデプロイする前にすべてのアセットをビルドするかどうか。
(Dockerビルドに失敗したときに便利)
[boolean]
[デフォルト: true]


--h, --help

ヘルプを表示する。
[boolean]


素で実行

素で実行した所、複数スタックが含まれている場合は --allをつけてねと言われました。

$ cdk deploy

Since this app includes more than a single stack, specify which stacks to use (wildcards are supported) or specify `--all`
Stacks: CdkSampleStack · CdkSampleStack2 · CdkSampleStack3

※勿論、↓のように指定して実行(初回デプロイや、変更デプロイ)する事も可能です。

$ cdk deploy CdkSampleStack2

--allをつけて実行

$ cdk deploy --all

✨  Synthesis time: 4.15s

CdkSampleStack
CdkSampleStack: deploying... [1/3]
CdkSampleStack: creating CloudFormation changeset...

 ✅  CdkSampleStack

✨  Deployment time: 24.07s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack/e3b83df0-4712-11ee-aeff-0e801f1f2d75

✨  Total time: 28.22s

CdkSampleStack2
CdkSampleStack2: deploying... [2/3]
CdkSampleStack2: creating CloudFormation changeset...

 ✅  CdkSampleStack2

✨  Deployment time: 27.93s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack2/f2272860-4712-11ee-8e48-0e4ac61c8a11

✨  Total time: 32.08s

CdkSampleStack3
CdkSampleStack3: deploying... [3/3]
CdkSampleStack3: creating CloudFormation changeset...

 ✅  CdkSampleStack3

✨  Deployment time: 28.06s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack3/03430a60-4713-11ee-94b8-06dd515cdbe1

✨  Total time: 32.21s

直列に実行されデプロイが完了しました。


--concurrencyをつけて実行

一度お掃除(destroy)した後、--concurrency(同時実行)オプションをつけて再実行してみます。

$ cdk deploy --all --concurrency 3

✨  Synthesis time: 3.84s

CdkSampleStack
CdkSampleStack2
CdkSampleStack3
CdkSampleStack: deploying... [1/3]
CdkSampleStack2: deploying... [2/3]
CdkSampleStack3: deploying... [3/3]
CdkSampleStack: creating CloudFormation changeset...
CdkSampleStack3: creating CloudFormation changeset...
CdkSampleStack2: creating CloudFormation changeset...
CdkSampleStack3 | 0/2 | 6:00:53 PM | REVIEW_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack3 User Initiated
CdkSampleStack3 | 0/2 | 6:00:59 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack3 User Initiated
CdkSampleStack3 | 0/2 | 6:01:02 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc
CdkSampleStack3 | 0/2 | 6:01:04 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc Resource creation Initiated
CdkSampleStack2 | 0/2 | 6:00:53 PM | REVIEW_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack2 User Initiated
CdkSampleStack2 | 0/2 | 6:00:59 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack2 User Initiated
CdkSampleStack2 | 0/2 | 6:01:01 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc
CdkSampleStack2 | 0/2 | 6:01:03 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc Resource creation Initiated
CdkSampleStack | 0/2 | 6:00:53 PM | REVIEW_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack User Initiated
CdkSampleStack | 0/2 | 6:00:59 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack User Initiated
CdkSampleStack | 0/2 | 6:01:02 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc
CdkSampleStack | 0/2 | 6:01:04 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc Resource creation Initiated
CdkSampleStack2 | 1/2 | 6:01:14 PM | CREATE_COMPLETE      | AWS::EC2::VPC | Vpc
CdkSampleStack3 | 1/2 | 6:01:15 PM | CREATE_COMPLETE      | AWS::EC2::VPC | Vpc
CdkSampleStack3 | 2/2 | 6:01:16 PM | CREATE_COMPLETE      | AWS::CloudFormation::Stack | CdkSampleStack3
CdkSampleStack2 | 2/2 | 6:01:15 PM | CREATE_COMPLETE      | AWS::CloudFormation::Stack | CdkSampleStack2
CdkSampleStack | 1/2 | 6:01:15 PM | CREATE_COMPLETE      | AWS::EC2::VPC | Vpc
CdkSampleStack | 2/2 | 6:01:16 PM | CREATE_COMPLETE      | AWS::CloudFormation::Stack | CdkSampleStack

 ✅  CdkSampleStack3

✨  Deployment time: 28.97s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack3/b9615ae0-4713-11ee-aeff-0e801f1f2d75

✨  Total time: 32.8s


 ✅  CdkSampleStack

✨  Deployment time: 29.02s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack/b9621e30-4713-11ee-9892-0a9b72840d1f

✨  Total time: 32.86s


 ✅  CdkSampleStack2

✨  Deployment time: 29.06s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack2/b9630890-4713-11ee-8360-0ac1309dec59

✨  Total time: 32.9s

並列実行されました。早いです。


--appをつけて実行

ちなみに今更ですが--appオプションはなくても動きます。
cdk.jsonというファイルの中に↓のような記述がcdk init時にされているからだそうです。

"app": "npx ts-node --prefer-ts-exts bin/cdk-sample.ts"

試しに上記一行を削除して実行してみた所、注意されました。

--appは、コマンドライン、cdk.json、または~/.cdk.jsonのいずれかが必要です。
$ cdk deploy CdkSampleStack2

--app is required either in command-line, in cdk.json or in ~/.cdk.json

この状態で--appをつけて実行してみます。
私はここの理解が完全ではない為、ひとまず先ほどcdk.jsonにあった文字列をそのまま適用してみます。

$ cdk deploy CdkSampleStack2 --app npx ts-node --prefer-ts-exts bin/cdk-sample.ts

✨  Synthesis time: 0.77s

CdkSampleStack2:  start: Building 86dab15278c760a8d0f7993c0febff7d25164c0f8b7d093dbffee851f6a8fc9e:current_account-current_region
CdkSampleStack2:  success: Built 86dab15278c760a8d0f7993c0febff7d25164c0f8b7d093dbffee851f6a8fc9e:current_account-current_region
CdkSampleStack2:  start: Publishing 86dab15278c760a8d0f7993c0febff7d25164c0f8b7d093dbffee851f6a8fc9e:current_account-current_region
CdkSampleStack2:  success: Published 86dab15278c760a8d0f7993c0febff7d25164c0f8b7d093dbffee851f6a8fc9e:current_account-current_region
CdkSampleStack2: deploying... [1/1]
CdkSampleStack2: creating CloudFormation changeset...

 ✅  CdkSampleStack2

✨  Deployment time: 28.35s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack2/4afe8c70-473c-11ee-8360-0ac1309dec59

✨  Total time: 29.12s

問題なく完了しました。
見た感じだけですが、以下も問題なく実行出来たように思います。

$ cdk deploy CdkSampleStack2 --app npx bin/cdk-sample.ts
$ cdk deploy CdkSampleStack2 --app npx ts-node bin/cdk-sample.ts

--appオプションにそのまま bin/cdk-sample.ts を渡してみた方はダメでした。

$ cdk deploy CdkSampleStack --app bin/cdk-sample.ts
/bin/sh: bin/cdk-sample.ts: Permission denied

Subprocess exited with error 126

改めて調べてみましたが、

「npx」= Node Package executorの略語であり、Node.jsパッケージの実行を一時的に行うためのコマンドラインツール。とのことです。

またこちらのページに、

ts-node: TypeScriptを変換してそのままNode.jsで実行する処理系。

とあります。また--prefer-ts-extsについては字面だけですが、extsはextentionsであると想定して「TypeScriptのエクステンションの方を好む」といった意味合いのオプションでしょうか。

現状、書いてある事の雰囲気を掴むだけですみません。
これ以降、cdk.jsonの"app"項目を元に戻します。


--version-reporting と --path-metadata をfalseにして実行

↓記事の内容と重複しますが、デプロイ時に不要なメタデータを出力させたくありません。
https://zenn.dev/mjxo/articles/86a7e01992400d
普通にデプロイすると、メタデータが含まれる為とても長くて見づらいです↓(畳んであります。)

普通にデプロイした結果のJsonテンプレートをCFnコンソールから確認。

※generateBootstrapVersionRule: falseは別途appに指定済み。

{
 "Resources": {
  "Vpc": {
   "Type": "AWS::EC2::VPC",
   "Properties": {
    "CidrBlock": "10.0.0.0/16"
   },
   "Metadata": {
    "aws:cdk:path": "CdkSampleStack/Vpc"
   }
  },
  "CDKMetadata": {
   "Type": "AWS::CDK::Metadata",
   "Properties": {
    "Analytics": "v2:deflate64:H4sIAAAAAAAA/zPSszDXM1BMLC/WTU7J1s3JTNKrDi5JTM7WAQrFpyYb6Tmn5YUFOOsAqaDU4vzSouRUENs5Py8lsyQzP69WJy8/JVUvq1i/zMhAz1TPUDGrODNTt6g0ryQzN1UvCEIDANEI+cVnAAAA"
   },
   "Metadata": {
    "aws:cdk:path": "CdkSampleStack/CDKMetadata/Default"
   },
   "Condition": "CDKMetadataAvailable"
  }
 },
 "Conditions": {
  "CDKMetadataAvailable": {
   "Fn::Or": [
    {
     "Fn::Or": [
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "af-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-east-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-northeast-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-northeast-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ca-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "cn-north-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "cn-northwest-1"
       ]
      }
     ]
    },
    {
     "Fn::Or": [
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-north-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-west-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-west-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-west-3"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "me-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "sa-east-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-east-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-east-2"
       ]
      }
     ]
    },
    {
     "Fn::Or": [
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-west-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-west-2"
       ]
      }
     ]
    }
   ]
  }
 }
}

ここから、余分なメタデータを削除する為に↓2つオプションをつけて実行します。

$ cdk deploy CdkSampleStack --version-reporting false --path-metadata false


可読性を下げるメタデータを非出力に出来ました。

{
 "Resources": {
  "Vpc": {
   "Type": "AWS::EC2::VPC",
   "Properties": {
    "CidrBlock": "10.0.0.0/16"
   }
  }
 }
}

↓の書き方でも同じになります。

$ cdk deploy CdkSampleStack --no-version-reporting --no-path-metadata

--rollback falseをつけて実行

ec2.CfnVPCにおいて必須指定プロパティであるcidrBlockをコメントアウトしてみます。

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const vpc = new ec2.CfnVPC(this, 'Vpc', {
      // cidrBlock: '10.0.0.0/16',
    });
  }
}

エラーが発生してロールバックしました。

$ cdk deploy CdkSampleStack

✨  Synthesis time: 3.83s

CdkSampleStack: deploying... [1/1]
CdkSampleStack: creating CloudFormation changeset...
[··························································] (0/2)

1:53:35 PM | CREATE_FAILED        | AWS::EC2::VPC | Vpc
Resource handler returned message: "Either CIDR Block or IPv4 IPAM Pool and IPv4 Netmask Length mu
st be provided" (RequestToken: a5faf601-e8ac-375c-5fbd-14924313e605, HandlerErrorCode: InvalidRequ
est)
1:53:35 PM | ROLLBACK_IN_PROGRESS | AWS::CloudFormation::Stack | CdkSampleStack
The following resource(s) failed to create: [Vpc]. Rollback requested by user.
1:53:35 PM | ROLLBACK_IN_PROGRESS | AWS::CloudFormation::Stack | CdkSampleStack
The following resource(s) failed to create: [Vpc]. Rollback requested by user.

~ 後略 ~

--rollback falseをつけて実行してみます。

$ cdk deploy CdkSampleStack --rollback false

✨  Synthesis time: 3.74s

CdkSampleStack: deploying... [1/1]
CdkSampleStack: creating CloudFormation changeset...
1:57:43 PM | CREATE_FAILED        | AWS::EC2::VPC | Vpc
Resource handler returned message: "Either CIDR Block or IPv4 IPAM Pool and IPv4 Netmask Length mu
st be provided" (RequestToken: 4c968017-c8ce-2586-ca9b-97e69d4418c7, HandlerErrorCode: InvalidRequ
est)


 ❌  CdkSampleStack failed: Error: The stack named CdkSampleStack failed to deploy: CREATE_FAILED (The following resource(s) failed to create: [Vpc]. ): Resource handler returned message: "Either CIDR Block or IPv4 IPAM Pool and IPv4 Netmask Length must be provided" (RequestToken: 4c968017-c8ce-2586-ca9b-97e69d4418c7, HandlerErrorCode: InvalidRequest)
    at FullCloudFormationDeployment.monitorDeployment (/Users/hogeuser/.npm-global/lib/node_modules/aws-cdk/lib/index.js:443:10236)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Object.deployStack2 [as deployStack] (/Users/hogeuser/.npm-global/lib/node_modules/aws-cdk/lib/index.js:446:153718)
    at async /Users/hogeuser/.npm-global/lib/node_modules/aws-cdk/lib/index.js:446:137166

 ❌ Deployment failed: Error: The stack named CdkSampleStack failed to deploy: CREATE_FAILED (The following resource(s) failed to create: [Vpc]. ): Resource handler returned message: "Either CIDR Block or IPv4 IPAM Pool and IPv4 Netmask Length must be provided" (RequestToken: 4c968017-c8ce-2586-ca9b-97e69d4418c7, HandlerErrorCode: InvalidRequest)
    at FullCloudFormationDeployment.monitorDeployment (/Users/hogeuser/.npm-global/lib/node_modules/aws-cdk/lib/index.js:443:10236)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Object.deployStack2 [as deployStack] (/Users/hogeuser/.npm-global/lib/node_modules/aws-cdk/lib/index.js:446:153718)
    at async /Users/hogeuser/.npm-global/lib/node_modules/aws-cdk/lib/index.js:446:137166

The stack named CdkSampleStack failed to deploy: CREATE_FAILED (The following resource(s) failed to create: [Vpc]. ): Resource handler returned message: "Either CIDR Block or IPv4 IPAM Pool and IPv4 Netmask Length must be provided" (RequestToken: 4c968017-c8ce-2586-ca9b-97e69d4418c7, HandlerErrorCode: InvalidRequest)

Cfnコンソール上にも画像のような表示が出ました。

↓以下でも同じです。

$ cdk deploy CdkSampleStack --no-rollback

テンプレート起因である場合は修正して「更新」ボタンで読み込ませUpdate、そうでない場合はそのまま「再試行」ボタンを、一時停止したロールバックの再会を希望する場合は「ロールバック」をクリックする流れのようです。

※これらにそれぞれ対応する専用のコマンドが存在するか、或いは既存のコマンドのどれにあたるかは今回調査していません。


--require-approval [never | any-change | broadening]をつけて実行

ここは公式ドキュメントの通りでした。

承認が必要な変更レベルを指定できます。

never
承認は不要です

any-change
IAM security-group-related または変更には承認が必要

broadening(デフォルト)
IAM ステートメントまたはトラフィックルールが追加される場合は承認が必要ですが、削除には承認は必要ありません


--forceをつけて実行

既に一度デプロイしてCdkSampleStackはCfnコンソール上に存在する状態です。

-- forceをつけて実行した場合。

$ cdk deploy CdkSampleStack --force

✨  Synthesis time: 3.8s

CdkSampleStack:  start: Building 3356f609a61c2f9e4dfac81e31e17015b4fc4526a9db00958f256c8a071947f0:current_account-current_region
CdkSampleStack:  success: Built 3356f609a61c2f9e4dfac81e31e17015b4fc4526a9db00958f256c8a071947f0:current_account-current_region
CdkSampleStack:  start: Publishing 3356f609a61c2f9e4dfac81e31e17015b4fc4526a9db00958f256c8a071947f0:current_account-current_region
CdkSampleStack:  success: Published 3356f609a61c2f9e4dfac81e31e17015b4fc4526a9db00958f256c8a071947f0:current_account-current_region
CdkSampleStack: deploying... [1/1]
CdkSampleStack: creating CloudFormation changeset...

 ✅  CdkSampleStack (no changes)

✨  Deployment time: 1.41s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack/f068ae40-47bc-11ee-94b5-06a27d353247

✨  Total time: 5.21s

2連続で実行してみましたが、毎回以下のように(no changes)とせず、BuiltとPublishを行うようでした。

-- forceをつけず実行した場合

$ cdk deploy CdkSampleStack

✨  Synthesis time: 3.82s

CdkSampleStack: deploying... [1/1]

 ✅  CdkSampleStack (no changes)

✨  Deployment time: 0.78s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack/f068ae40-47bc-11ee-94b5-06a27d353247

✨  Total time: 4.6s

--versionをつけて実行

$ cdk deploy --version
2.93.0 (build 724bd01)

以下と同じ結果でした。

$ cdk --version
2.93.0 (build 724bd01)

--progress[bar | events]をつけて実行

それぞれ実行してみます。

$ cdk deploy CdkSampleStack3 --progress bar

✨  Synthesis time: 3.77s

CdkSampleStack3: deploying... [1/1]
CdkSampleStack3: creating CloudFormation changeset...
[██████████████████████████████████████████████████████████] (2/2)

~ 後略 ~
$ cdk deploy CdkSampleStack2 --progress events

✨  Synthesis time: 3.7s

CdkSampleStack2: deploying... [1/1]
CdkSampleStack2: creating CloudFormation changeset...
CdkSampleStack2 | 0/2 | 2:42:06 PM | REVIEW_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack2 User Initiated
CdkSampleStack2 | 0/2 | 2:42:11 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack2 User Initiated
CdkSampleStack2 | 0/2 | 2:42:14 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc
CdkSampleStack2 | 0/2 | 2:42:15 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc Resource creation Initiated
CdkSampleStack2 | 1/2 | 2:42:26 PM | CREATE_COMPLETE      | AWS::EC2::VPC | Vpc
CdkSampleStack2 | 2/2 | 2:42:27 PM | CREATE_COMPLETE      | AWS::CloudFormation::Stack | CdkSampleStack2

 ✅  CdkSampleStack2

✨  Deployment time: 27.98s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack2/1e4ee050-47c1-11ee-9892-0a9b72840d1f

✨  Total time: 31.67s

上の結果からデフォルトはbarのようです。


--verboseをつけて実行

普段隠してある詳細も表示しながらデプロイしてくれます。

長いので畳みます。

それでも長いので中間省略します。

$ cdk deploy CdkSampleStack --verbose
[14:51:40] CDK toolkit version: 2.93.0 (build 724bd01)
[14:51:40] Command line arguments: {
  _: [ 'deploy' ],
  verbose: 1,
  v: 1,
  lookups: true,
  'ignore-errors': false,
  ignoreErrors: false,
  json: false,
  j: false,
  debug: false,
  ec2creds: undefined,
  i: undefined,
  'version-reporting': undefined,
  versionReporting: undefined,
  'path-metadata': undefined,
  pathMetadata: undefined,
  'asset-metadata': undefined,
  assetMetadata: undefined,
  'role-arn': undefined,
  r: undefined,
  roleArn: undefined,
  staging: true,
  'no-color': false,
  noColor: false,
  ci: false,
  all: false,
  'build-exclude': [],
 
 ~ 中略 ~

[14:51:54] Waiting for stack CdkSampleStack to finish creating or updating...
[14:51:55] Stack CdkSampleStack has an ongoing operation in progress and is not stable (CREATE_IN_PROGRESS (User Initiated))
CdkSampleStack | 0/2 | 2:51:49 PM | REVIEW_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack User Initiated
CdkSampleStack | 0/2 | 2:51:54 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack | CdkSampleStack User Initiated
CdkSampleStack | 0/2 | 2:51:57 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc
CdkSampleStack | 0/2 | 2:51:58 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC | Vpc Resource creation Initiated
[14:52:00] Stack CdkSampleStack has an ongoing operation in progress and is not stable (CREATE_IN_PROGRESS)
[14:52:05] Stack CdkSampleStack has an ongoing operation in progress and is not stable (CREATE_IN_PROGRESS)
CdkSampleStack | 1/2 | 2:52:09 PM | CREATE_COMPLETE      | AWS::EC2::VPC | Vpc
[14:52:10] Stack CdkSampleStack has an ongoing operation in progress and is not stable (CREATE_IN_PROGRESS)
CdkSampleStack | 2/2 | 2:52:10 PM | CREATE_COMPLETE      | AWS::CloudFormation::Stack | CdkSampleStack
[14:52:16] Stack CdkSampleStack has completed updating

 ✅  CdkSampleStack

✨  Deployment time: 28.23s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkSampleStack/79d7aff0-47c2-11ee-b3a9-0e20a149a329

✨  Total time: 33.69s

[14:52:16] Reading cached notices from /Users/hogeuser/.cdk/cache/notices.json

--tags Name=hogeをつけて実行

$ cdk deploy CdkSampleStack --tags Name=hoge


無事タグ付け出来ているようです。


--ignore-errors trueをつけて実行

ファイル内にエラーを仕込んで、以下を実行した結果を載せるつもりでしたが、何をやってもignoreしてもらえませんでした。(私がsynthesisエラーを理解していない可能性があります。)

$ cdk deploy CdkSampleStack --ignore-errors true

--no-color trueをつけて実行

つけないで実行した場合

つけて実行した場合

色が白黒になりました。


其の②に続きます

想像していた以上に長くなって来た為、①はここまでにします。
後ほど②を公開したいと思います。お読みいただき有難うございました。

Discussion