[AWS CDK]cdk deployコマンドのオプションを順番に試してみる~其の①
前提
同設定×3を用意しています。CfnVPCはL1なので素のCfnでVPCを作っているのと同じです。
#!/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,
}),
});
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"
試しに上記一行を削除して実行してみた所、注意されました。
$ 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にして実行
↓記事の内容と重複しますが、デプロイ時に不要なメタデータを出力させたくありません。
普通にデプロイすると、メタデータが含まれる為とても長くて見づらいです↓(畳んであります。)普通にデプロイした結果の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