2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CloudFormationのFn::FindInMapとFn::Subの合わせ技で環境別テンプレートを一元管理

Posted at

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を自動更新する、など。

テンプレート管理に関して、ほかにももっと良い方法あるよって方はぜひ教えてください。

参考ページ

テンプレートのサンプル
https://github.com/awslabs/aws-cloudformation-templates/blob/master/aws/services/CloudFormation/FindInMap_Inside_Sub.yaml

FindInMap
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-findinmap.html

Sub
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?