AWS CDK の実行時に StackName を動的に指定する


はじめに

AWS CDK のエントリーポイントを見ると、以下の様に実行するスタック名がハードコーディングされている。

app.py
app = core.App()
CdkPythonStack(app, "CdkPythonStack")

しかし、例えば「開発環境」と「本番環境」同一のテンプレートを使って複数のスタックを構築したい場合もあると思う。 そのような場合にスタック名を動的に指定して環境構築をしたい。

解決策

同様の質問が StackOverflow で見つかった。

こちらでは、システムの環境変数を使って実行時に引き渡す方法を採っている。
もうちょっといい方法はないかと思って cdk コマンドを探したり、app.pyargparse を追加してみたが、調べた限りではコマンドラインの値をそのまま app.py に引き渡す方法は見当たらなかった。 そのため、上記質問の回答に倣って環境変数を使う方法で対処する。

app.py
import os

STACK_NAME = os.environ.get('STACK_NAME') or 'CDKPythonStack'

app = cdk.App()
CdkPythonStack(app, 'CDKPythonStack', stack_name=STACK_NAME)

Python で書くとスタック生成時のパラメータとして stack_name を渡せばよい。 ここでは単に環境変数を使っているが、さらに踏み込んで環境変数をベースにメタファイルを読み込んで名前を決定してもよい。

# スタック名指定
$ export STACK_NAME=CustomNameStack && pipenv run cdk deploy

# スタック名未指定 (デフォルトを利用)
$ export STACK_NAME= && pipenv run cdk deploy

これら2つを実行することで、別名のスタックを作成できた。