
AWS:cloudformation~FindMappingについて
みなさん、こんばんは。ちゃみみです。
久しぶりにCloudformationでの書き方で汎用性が高いなーこれクロスアカウント設計をするときに使えるなーと思った書き方をさらっと残していきたいと思います。
具体的にはMappingというセクションの書き方とJoinの使い方がポイントになるのですが、変数ちっくな使い方あたりは!Subに近いですがこちらも面白いので載せておこうと思います。
CFnの構成として
~~~~
AWSTemplateFormatVersion
Description
Parameters
Resources
Outputs
がある流れかと思いますが、ここでMappingは
Parameters
Mappings (←このセクションを追加します)
Resources
~~~~~
Mappingsで追加しておくことは例えばですが、今回の例でいくとクロスアカウント構成をするため例えばAアカウントでStackを作成したときにリソースの名前をAアカウント独自のものに設定したい!だけど、他のアカウントでも同じテンプレートを流用したいのだけれど、Aアカウントと同じリソースの名前になるのは嫌だ!というケースとかですね。
ナレッジを見る限りRegionMapで書いているケースもありますが例えばこんな感じですね。
Mappings:
AccountMap:
'AアカウントID': ←このアカウントIDでStackを構成したら、下の設定値が利用される形に
enviroment: prd ←ここで環境を定義してあげたりします。
user: operation ←ここでは使うユーザーの種類なんかを定義したりします。
・・・・・
'BアカウントID':
enviroment: dev
user: manager
さながら実戦形式での書き方となりましたが、正しいひな形としては以下のようなイメージですね。
Mappings:
Mapping01:
Key01:
Name: Value01
Key02:
Name: Value02
Key03:
Name: Value03
で、ここでMappingの記載を終えただけではアカウント独自の設定にはならないので次にそれと合致する項目を作ってあげる必要があります。
↑のAccountMapで設定したのなら、最近で面白いと思ったのがCloudtrailやS3バケットなんかで名前を設定するときに以下のような感じで!Joinでくっつける手法が流行っているようですね。
Cloudtrailの例となります
Resources:
CloudtrailLogicalName:
Type: "AWS::CloudTrail::Trail"
Properties:
TrailName: !Join ←名称をくっつけたい場合は用いる必要があります
- "-" ←FindInMapで引っ張ってきた値などをくっつけるときに用いる文字を定義しています。
- - !FindInMap [AccountMap, !Ref 'AWS::AccountId', enviroment]
- !FindInMap [AccountMap, !Ref 'AWS::AccountId', user]
←このFindInMapでMappingsセクションで定義をした値が引っ張られてくるような仕様となります。
- 'cloudtrail'
今回の例でいうと、Aアカウントでこのテンプレートを実行した結果としてCloudtrailの名前は最終的にこうなります。
【prd-operation-cloudtrail】
!SubでもAccountIdを引っ張ってくるようなやり方はできますが、Mappingsで定義をしたものを引っ張ってくることはできないのでこれはこれで使いようがあると思っています。
こういった比較的自由度の高い書き方というのは中々Terraformでは実現できないので個人的にはやはりAWSはCFnで推したいところですね!!
2022年03月19日
以下、宣伝です。
仲間も募集中なので、気になる方は↓の記事を覗いてみてくださいませ。
いい会社だと思いますよ。