【AWS SAM】 Mappings を用いて環境ごとにリソースを切り替えられるようにする
初めに
Slack Bot を AWS Lambda を用いて開発するときに、Dev 環境として自身で作成したワークスペース、Prod 環境として会社のワークスペース を使用したいとします。
この時に、Slack トークンを保存している System Manager のパラメーターストアのパスや、S3 のバケット、SQS 等を簡単に切り替えられたらうれしいですよね。
そんな時にCloudFormation の テンプレートにおける Parameters、Mappings という構文が、デプロイ時の環境を Dev と Prod で分けるときに便利だったのでメモしておきます。
目的
環境ごとのビルド、デプロイをこのようにして切り替えることを目的とします。
sam deploy --config-env dev
sam deploy --config-env prod
Parameters とは
CloudFormationのユーザーサポート[1]より
Template 内で下記のように定義することができます。
Parameters:
ParameterLogicalID:
Description: Information about the parameter
Type: DataType
Default: value
AllowedValues:
- value1
- value2
具体的には、下記のように書くと、
Parameters:
Parameter01:
Type: String
Default: String01
このように使うことができます。(この場合デフォルトパラメーターのままなので、String01 が取得できる)
Ref: Parameter01
もちろんデフォルトでない値を設定することが可能で、今回の記事でも利用しています。
Mappings とは
CloudFormationのユーザーサポート[2]より
Template 内で下記のように定義することができます。
Mappings:
Mapping01:
Key01:
Name: Value01
Key02:
Name: Value02
Key03:
Name: Value03
そして、利用するときは組み込み関数 Fn::FindInMap を用いて、以下のように値を取得できます。
この場合、Value01 が取得できます。
!FindInMap [Mapping01, Key01, Name]
samconfig と上記の Parameters、Mappings を組み合わせた環境分け
Slack Bot を開発する段階で、実際に使用した環境分けを以下で解説します。
今回は SQS の設定に注目して使用例を解説します。
まず、template.yaml 内で、Env を定義します。
Parameters:
Env:
Type: String
Default: dev
samconfig.toml に 下記のように追記することで、テンプレート内で定義された Env の値をデプロイ時の設定 (sam deploy --config-env dev の dev の部分) に対応して書き換えることができます。[3]
[dev]
[dev.deploy.parameters]
parameter_overrides = "Env=dev"
[prod]
[prod.deploy.parameters]
parameter_overrides = "Env=prod"
そのうえで、Mappings を下記のように定義すれば、
※キューの名前、リソース名は一例です。(DreamDiary という Slack Bot のため)
Mappings:
EnvironmentMap:
dev:
QueueName: "DreamDiaryQueue_dev"
prod:
QueueName: "DreamDiaryQueue_prod"
書き換えられた Env を Mapping の Key として以下のように用いることができます。
Resources:
SlackSQSQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !FindInMap [EnvironmentMap, !Ref Env, QueueName]
このように定義することで、使用する SQS のキューの名前を dev、prod で簡単に切り替えることができます。
Discussion