AWS CDK Tipsシリーズの記事。
はじめに
CDK Pipelinesで管理されたStackを、Pipelineを介さずにローカル環境などから直にデプロイしたいことがある。
本記事ではこの方法を紹介する。
方法
次のように cdk deploy
コマンドを実行すれば良い。
npx cdk deploy <PipelineがあるStackの名前>/<Stageの名前>/<Stackの名前>
例えば以下のコードを考える。
import * as cdk from '@aws-cdk/core';
import * as pipelines from 'aws-cdk-lib/aws-pipelines';
const app = new cdk.App();
// CDK Pipelinesを定義するStack
const pipelineStack = new cdk.Stack(app, 'PipelineStack');
const pipeline = new pipelines.CodePipeline(pipelineStack, 'Pipeline', {
synth, //put some step here,
});
// CDK PipelinesでデプロイするStage
const devStage = new cdk.Stage(pipelineStack, "DevStage");
// Stageの中のStack
new cdk.Stack(devStage, "SomeStack");
pipeline.addStage(devStage);
この時DevStage
の中の SomeStack
は通常 CDK Pipelines からデプロイされる。
一方で、以下のコマンドにより、ローカル環境からも直接 Stack をデプロイすることができる。
npx cdk deploy PipelineStack/DevStage/SomeStack
なお、もちろんコマンドを実行する環境に適切な権限が必要なことには注意!
また、StageのConstruct tree内の位置によっては、上記のコマンドではうまく行かない場合がある。
例えば、下記のようにStageをStack直下ではなく他のConstructの下に配置した場合を考える。
...
// pipelineStack直下に何らかのConstructがあると仮定する
const someConstruct = new Construct(pipelineStack, "SomeConstruct");
// devStageのscopeをSomeConstructにしたとする
const devStage = new cdk.Stage(someConstruct, "DevStage");
...
この場合、デプロイコマンドは下記のようにする必要がある。
npx cdk deploy PipelineStack/SomeConstruct/DevStage/SomeStack
但し書き
CI/CD パイプラインで管理されたものをローカルからいじると、ややこしい考慮事項が増えそう。
最後の手段にとどめておいたほうが良いと思う。
CDKでは稀に、Stack間の依存関係を無視して特定のStackだけをデプロイしたい状況が発生するので、そのようなときに使えるかも。 (参考: --exclusively
を付ける)
その他
この方法はドキュメントには記載されていない気がするが、ここで見つけた。
cdk.devのSlackチャンネルに入っているとこういった情報を見つけやすくなるので、良い!