この構成が基本だな。ここから初めて,機能をためして,追加する要素が定まったらtemplateにしていく。
# 1. 変数を定義 PROFILE=default REGION=ap-northeast-1 PREFIX=demo-20240428-01 STACK_NAME=${PREFIX}-VPC # 2. CFnテンプレートを作る。Shellによる変数置換は極力使用しない。値の設定にはParametersを使用する。 cat <<'EOF' > template.yml Parameters: EnvironmentName: Type: String Default: test-environment VpcCIDR: Type: String Default: 10.0.0.0/16 Resources: myVPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCIDR EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Tags: - Key: Name Value: !Ref EnvironmentName EOF # 3. Parametersの値を設定する。こちらはShellの変数置換を使用してもよい。 cat <<EOF >stack-params.cfg EnvironmentName=${PREFIX} VpcCIDR=10.10.0.0/16 EOF # 4. スタックを作る。スタックの操作にはスタック名を使用できる(arnとか使わなくて良い)。 aws cloudformation deploy \ --template-file template.yml \ --stack-name ${STACK_NAME} \ --region ${REGION} \ --parameter-overrides $(cat stack-params.cfg) # 5.AWSリソースから値を取得し,Shell変数に格納する。この値を次のスタック作成に利用する。 VPC_ID=$(aws cloudformation describe-stacks --stack-name ${STACK_NAME} | jq -r '.Stacks[] | .Outputs[] | select(.OutputKey == "Vpc") | .OutputValue ') # この後,作業としては「1.」に戻ることで,複数スタックを効果的に利用できる。Shellを終了した場合は,再び既存スタックから値を取得していけば良い。 # 削除する時は簡単。 aws cloudformation delete-stack --stack-name ${STACK_NAME}
複数のCFnテンプレートを組み合わせるときの最大の課題が,特定スタックで生成した値の再利用。
値の参照方法は提供されていはいるものの,使い勝手が悪い。Nested Stackは結合度が高い。また変更セットとの相性が悪いとの話もある。
CloudFormationの nested stack が使いづらい件 #AWS - Qiita
なので,リソースの作成は極力CFnに任せることで,まとめて管理できるようにしつつ,値の受け渡しはCLIを使うのがよさげ。
CDKはそれなりの言語をインストールする必要がある。1スクリプトファイル程度にまとめて簡単に扱いたい状況でCDKを使うのは本末転倒感がある。
ベストプラクティスは尊重しつつ,よさげな妥協点を見つけていきたい。
AWS CloudFormation のベストプラクティス - AWS CloudFormation