【CloudFormation】Fn::FindInMapを使ってAWSアカウントごとに異なるパラメータを指定する
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 を利用する ときに役に立つかもしれません。
少しでもどなたかのお役に立てば幸いです。