【小ネタ】利用中のCloudFormationのテンプレートとパラメータをAWS CLIで一括取得する

AWS CloudFormation

こんにちは、コカコーラ好きなカジです。

最近、AWS CLIを使った作業前後の確認をすることに魅了されています。w

本番環境で利用中のCloudFormationのテンプレートをダウンロードし手元の検証環境でテストしたかったので、AWS CLIで一括ダウンロードするスクリプト作成しました。 これからCloudFormationのテンプレートファイルをGithubなどのバージョン管理したい時などにも使えると思います。

スクリプト

AWS CLIが利用でき、取得に必要なIAM権限を持っていることを前提としています。

$ cat cfn-download.sh
#!/bin/bash
DATE=`date +%Y%m%d_%H-%M-%S`

# StackName List Create
aws cloudformation describe-stacks --query 'Stacks[].StackName[]' | egrep -v '\[|\]' | sed 's/    "//g' | sed 's/"//g' | sed 's/,//g' > StackName-list-${DATE}.txt

# Cfn Template & Parameter Download
cat StackName-list-${DATE}.txt | while read LINE
 do
  aws cloudformation get-template --stack-name ${LINE} --query 'TemplateBody' > ${LINE}_${DATE}.template
  aws cloudformation describe-stacks --stack-name ${LINE} --output table > ${LINE}-parameter_${DATE}.txt
done

注意点

パラメータについては、個人的な好みでJSONではなくTable形式で出力しています。

Create Stackした時のCloudFormationテンプレートファイルや、Management Consoleのテンプレートタブで参照したテンプレートファイルと上記スクリプトで出力されたCloudFormationのテンプレートファイルは、中身の順番が変わります。

そのため、変更後の差分比較する場合に順番が違いすぎて綺麗に比較できません。 比較する場合はjqコマンドのオプション「-S」でそれぞれSortしてから比較すると良いです。

<例>

$ cat before.template | jq . -S > test.txt
$ cat after.template | jq . -S > test2.txt
% diff test.txt test2.txt
72c72
<       "Type": "List<AWS::EC2::SecurityGroup::Id>"
---
>       "Type": "AWS::EC2::SecurityGroup::Id"

まとめ

1つぐらいなら、Mnagement Consoleからコピーアンドペーストでも良いのですが、量がある場合はAWS CLIだと簡単ですね。 どなたかのお役に立てれば幸いです。

AWS Cloud Roadshow 2017 福岡