🦉

【AWS SAM】 Mappings を用いて環境ごとにリソースを切り替えられるようにする

2024/09/05に公開

初めに

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 を定義します。

template.yamlより
Parameters:
  Env:
    Type: String
    Default: dev

samconfig.toml に 下記のように追記することで、テンプレート内で定義された Env の値をデプロイ時の設定 (sam deploy --config-env dev の dev の部分) に対応して書き換えることができます。[3]

samconfig.tomlより
[dev]
[dev.deploy.parameters]
parameter_overrides = "Env=dev"
samconfig.tomlより
[prod]
[prod.deploy.parameters]
parameter_overrides = "Env=prod"

そのうえで、Mappings を下記のように定義すれば、
※キューの名前、リソース名は一例です。(DreamDiary という Slack Bot のため)

Mappingsの定義
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 で簡単に切り替えることができます。

まとめ

脚注
  1. https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html ↩︎

  2. https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/mappings-section-structure.html ↩︎

  3. https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html ↩︎

Fusic 技術ブログ

Discussion