
【CloudFormation】Fn::FindInMapを使ってAWSアカウントごとに異なるパラメータを指定する
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS CloudFormation(CFn)は AWSリソースを JSON, YAML形式で表現するためのサービスです。 AWSリソースをコード(テンプレート) で表現することで構成管理を容易にしたり、 再利用性の向上などに役立ちます。
CFnの機能として、テンプレート内にいくつかの 組み込み関数 を記述することができます。
文字列内に変数の値を代入する Fn::Sub や、
他のCFnテンプレートで作られたリソース(スタック)を参照するための Fn::ImportValue
などがよく使われます。
今回は組み込み関数 Fn::FindInMap を使って AWSアカウント毎に異なるパラメータを指定する CFnテンプレートを作成してみます。
目次
- 組み込み関数 Fn::FindInMap
- 擬似パラメータ AWS::AccountId
- AWSアカウント毎に異なるパラメータを指定したい
- 例: アカウント毎に異なるCIDR/Nameの VPCを作成する
- 74xxxxxxxxxx上でスタック作成したとき
- 44xxxxxxxxxx上でスタック作成したとき
- おわりに
組み込み関数 Fn::FindInMap
組み込み関数
Fn::FindInMapは、Mappingsセクションで宣言された 2 つのレベルのマッピングのキーに対応する値を返します。
CFnテンプレートの Mappings セクションに記述したマップ情報を参照するための組み込み関数です。
Mappings セクションに以下のような記述があったとします。
Mappings: 
  Mapping01: 
    Key01: 
      Name: Value01
    Key02: 
      Name: Value02
    Key03: 
      Name: Value03
このとき、 Mapping01 > Key01 > Name の値 Value01 を表現したい場合、
Fn::FindInMap によって次のように表せます。
- Fn::FindInMap: [ Mapping01, Key01, Name ]
- または !FindInMap [ Mapping01, Key01, Name ](短縮形の場合)
擬似パラメータ AWS::AccountId
擬似パラメーター は CFnによって事前に定義されたパラメータです。
擬似パラメータの1つに AWS::AccountId があります。
スタックが作成されるAWSアカウントのID 12桁を返すものです。
AWSアカウント毎に異なるパラメータを指定したい
前述の 組み込み関数 Fn::FindInMap 、 擬似パラメータ AWS::AccountId を活用して
要件を満たすテンプレートを作成できます。
以下のようなテンプレートです。
AWSTemplateFormatVersion: "2010-09-09"
Mappings: 
  AccountToParams:
    "111111111111":
      SomeParameter1: Foo
      SomeParameter2: Hoge
    "222222222222":
      SomeParameter1: Bar
      SomeParameter2: Fuga
Resources: 
  SomeResource: 
    Type: "AWS::XXX::YYY"
    Properties: 
      SomeProperty: !FindInMap [AccountToParams, !Ref "AWS::AccountId", SomeParameter1]
- AWSアカウント 111111111111上でこのテンプレートからスタックを作成したとき、SomeResourceのSomeProperty値は Foo に、
- AWSアカウント 222222222222上でこのテンプレートからスタックを作成したとき、SomeResourceのSomeProperty値は Bar になります
例: アカウント毎に異なるCIDR/Nameの VPCを作成する
AWSTemplateFormatVersion: "2010-09-09"
Mappings: 
  AccountToParams:
    "74xxxxxxxxxx":
      VpcCidr: 10.0.1.0/24
      VpcName: AAA-VPC
    "44xxxxxxxxxx":
      VpcCidr: 10.0.2.0/24
      VpcName: BBB-VPC
Resources: 
  Vpc:
    Type: AWS::EC2::VPC
    Properties: 
      CidrBlock: !FindInMap [AccountToParams, !Ref "AWS::AccountId", VpcCidr]
      Tags: 
        - Key: Name
          Value: !FindInMap [AccountToParams, !Ref "AWS::AccountId", VpcName]
74xxxxxxxxxx 上でスタック作成したとき
Mappings で記述した「10.0.1.0/24」「AAA-VPC」になっています。

44xxxxxxxxxx 上でスタック作成したとき
Mappings で記述した「10.0.2.0/24」「BBB-VPC」になっています。

おわりに
CFnテンプレートで AWSアカウント毎に異なるパラメータを指定する1例を書いてみました。
複数アカウントで一部パラメータを変更して再利用したい場合や、 複数アカウントにCFnスタックをデプロイできる CloudFormation StackSets を利用する ときに役に立つかもしれません。
少しでもどなたかのお役に立てば幸いです。











