CloudFormationのテンプレート管理の課題
環境ごとに作成するAWSのリソースは同じだが、設定値など環境ごとに値を変えたい場合があると思います。
そのようなとき、一般的にはparameterを設定し、全環境で同じテンプレートを使用できるようにすると思います。
しかし、その場合個人的には以下の課題があるなと感じました。
- CloudFormation実行時にparameterを渡すのが手間
- parameterが数10またはそれ以上あると余計に大変
- stack作成・更新時にparameterに渡す値をミスる可能性がある
- CLIやAWS SDKを使用してstack作成・更新を行う場合、parameterの追加・削除ごとに処理を修正する必要がある
環境ごとにテンプレートを用意する、という解決策もありますが、管理が冗長になり、環境によってテンプレートの更新漏れなどが生じる可能性もあります
ではどうすればよいのか。
解決策
Fn::FindInMapとFn::Subをうまく活用することで、上記課題を解決できることができます!
以下、AWS SecretsManagerのテンプレートを例に挙げます。
Parameters:
EnvName:
Default: dev
Type: String
Mappings:
Map:
Test1:
dev: 'test1-dev'
stg: 'test1-stg'
prod: 'test1-prod'
Test2:
dev: 'test2-dev'
stg: 'test2-stg'
prod: 'test2-prod'
Resources:
AutomationTest:
Type: 'AWS::SecretsManager::Secret'
Properties:
Name: !Sub test/${EnvName}
SecretString: !Sub
- |
{
"TEST1":"${Test1}",
"TEST2":"${Test2}"
}
- {
Test1: !FindInMap [Map, Test1, !Ref EnvName],
Test2: !FindInMap [Map, Test2, !Ref EnvName]
}
上記のようにすることで、CloudFormation実行時に渡すparameterは1つになり、課題を解決することができます。
環境ごとに差分がある値が増えたとしても、その値を上記のMapに追加し、SubとFindInMapを使用しその値を参照できるようにすればparameterの追加は不要で環境差分にも対応できます。
特に、以下の課題が解決できるので、自動更新の仕組みを構築しやすくなると思います。
CLIやAWS SDKを使用したstack作成・更新を行う場合、parameter変更ごとに処理を修正する必要がある
自動更新の仕組みは、例えば
GitHubでテンプレートを管理し、テンプレートが更新されるとGitHub ActionsのワークフローからAWS CLI呼び出してstackを自動更新する、など。
テンプレート管理に関して、ほかにももっと良い方法あるよって方はぜひ教えてください。