💡

CloudFormationテンプレート Mappings 解説

2022/09/12に公開約2,200字

はじめに

Mappingsセクションを活用すると、条件によってAWSリソースの作成を制御することができます。
これによりテンプレートに変更を加えずに、別環境、別プロジェクト等、幅広く活用できるようになります。
役割はConditionsセクションに似ていて、どちらを使ってもいいのですが、私はMappingセクションの方がメンテナンス性が高く感じるのでよく採用してます。
この記事では「基本」から「現場でのユースケース」まで紹介したいと思います。

Mappingsセクションの使い方

サンプルのCloudFormationテンプレート

template.yaml
AWSTemplateFormatVersion: 2010-09-09
Mappings:
  EnvMap:
    dev:
      ReadCapacityUnits: 10
      WriteCapacityUnits: 10
    stg:
      HashAttributeName: 10
      RangeAttributeName: 10
    prd:
      HashAttributeName: 100
      RangeAttributeName: 100
Parameters:
  EnvPrefix:
    Type: String
    AllowedValues:
      - dev
      - stg
      - prd
Resources: 
  dynamodbTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: HashAttributeName
          AttributeType: S
        - AttributeName: RangeAttributeName
          AttributeType: S
      KeySchema:
        - AttributeName: HashAttributeName
          KeyType: HASH
        - AttributeName: RangeAttributeName
          KeyType: RANGE
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: !FindInMap [EnvMap,!Ref EnvPrefix, ReadCapacityUnits]
        WriteCapacityUnits: !FindInMap [EnvMap,!Ref EnvPrefix, WriteCapacityUnits]
      TableName: TableName

このサンプル例では、DynamoDBの書き込みキャパシティユニットと読み込みキャパシティユニットをパラメータのEnvPrefixによって動的に設定しています。
Mappingsの定義はMappings > Mapのキー > Mapの値 > キー > 値という形式でできます。
Mappingsで定義した値を参照するにはFindInMap関数を利用して、!FindInMap [Mapのキー,Mapの値,キー]という形式で配列を定義すればOKです。

メリット

環境毎の設定差分を一箇所に集約できる

MappingsではなくConditionsでもIF関数を使えば開発、検証、商用環境の設定を動的に行えます。
しかしConditionsはテンプレートの複数箇所で値の設定を行うことになるので、環境差分の規模が大きくなるにつれて、メンテナンス性が悪くなります。
一箇所に集約できるのは管理が容易になるので、ありがたいです。

Parametersの冗長化を防げる

Parametersの数が多い場合はMappingsに全てまとめて環境名をキーにすることで、スタック操作時、環境名を入力するだけで詳細設定をハンドリングすることができます。上記のサンプルテンプレートがその例です。毎回スタック操作時にパラメータを入れるのが面倒なので、私は普段この運用をしています。

デメリット

テンプレートがステートフルになってしまう

サンプルのEnvMapのような環境毎の設定をハードコードすると、他のプロジェクトで使用する際に修正しないといけなくなります。
様々なプロジェクトで流用するようなテンプレートでは、Parametersの方が便利かもしれません。

最後に

同一プロジェクト内の複数環境で利用するテンプレートの場合は、Mappingsセクションをかなり重宝すると思います。
皆さんも本記事を参考にぜひ導入してみてください。
最後までお読みいただきありがとうございました😊

Discussion

ログインするとコメントできます