K's Atelier

個人的な学習記録

AWS CLI & CloudFormation

この構成が基本だな。ここから初めて,機能をためして,追加する要素が定まったら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