【CloudFormation】Fn::FindInMapを使ってAWSアカウントごとに異なるパラメータを指定する

2020.04.27

AWS CloudFormation(CFn)は AWSリソースを JSON, YAML形式で表現するためのサービスです。 AWSリソースをコード(テンプレート) で表現することで構成管理を容易にしたり、 再利用性の向上などに役立ちます。

CFnの機能として、テンプレート内にいくつかの 組み込み関数 を記述することができます。

文字列内に変数の値を代入する Fn::Sub や、 他のCFnテンプレートで作られたリソース(スタック)を参照するための Fn::ImportValue などがよく使われます。

今回は組み込み関数 Fn::FindInMap を使って AWSアカウント毎に異なるパラメータを指定する CFnテンプレートを作成してみます。

目次

  1. 組み込み関数 Fn::FindInMap
  2. 擬似パラメータ AWS::AccountId
  3. AWSアカウント毎に異なるパラメータを指定したい
  4. 例: アカウント毎に異なるCIDR/Nameの VPCを作成する
  5. 74xxxxxxxxxx 上でスタック作成したとき
  6. 44xxxxxxxxxx 上でスタック作成したとき
  7. おわりに

 

組み込み関数 Fn::FindInMap

組み込み関数 Fn::FindInMap は、 Mappings セクションで宣言された 2 つのレベルのマッピングのキーに対応する値を返します。

– 引用: Fn::FindInMap | AWSドキュメント

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 上でこのテンプレートからスタックを作成したとき、 SomeResourceSomeProperty 値は Foo に、
  • AWSアカウント 222222222222 上でこのテンプレートからスタックを作成したとき、 SomeResourceSomeProperty 値は 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 を利用する ときに役に立つかもしれません。

少しでもどなたかのお役に立てば幸いです。