AWS CloudFormationでは、テンプレートを柔軟にするためにさまざまな「組み込み関数(Intrinsic Functions)」が用意されています。その中でも、環境やリージョンによって値を切り替えたいときに便利なのが「!FindInMap(FindInMap関数)」です。
この記事では、「!FindInMap(FindInMap関数)」の仕組み・構文・使い方をサンプルコードを用いてわかりやすく解説します。
!FindInMapとは?(FindInMap関数)
!FindInMapはMappingsセクションに定義した値を参照するための関数です。
たとえば次のようなケースで役立ちます。
- リージョンごとに設定を変えたい
- 開発環境(
dev)と本番環境(prod)で設定を変えたい - OSの種類ごとに設定を変えたい
!FindInMapの基本構文は以下のようになっています。
基本構文
!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]引数の意味は以下の通りです。
| 引数 | 説明 |
|---|---|
MapName | Mappingsセクションで定義したマップの名前 |
TopLevelKey | マップ内の最初のキー(例:リージョン名や環境名) |
SecondLevelKey | さらにその中のサブキー(例:AMIやInstanceType) |
なお、!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]は短縮形の構文です。短縮形を使わない場合は、次のように記述します。
Fn::FindInMap: [ MapName, TopLevelKey, SecondLevelKey ]Mappingsセクションの定義
!FindInMapを使うためには、Mappingsセクションを定義する必要があります。例として、リージョンごとに異なるAMI IDを設定したMappingsセクションを見てみましょう。
Mappings:
RegionMap: # ← MapName
ap-northeast-1: # ← TopLevelKey
AMI: ami-0123456789abcdef0 # ← SecondLevelKey
us-east-1: # ← TopLevelKey
AMI: ami-0abcdef1234567890 # ← SecondLevelKeyこのように「リージョン(TopLevelKey)」ごとに「AMI(SecondLevelKey)」を定義しておくことで、あとから!FindInMapを使って自動的に対応する値を取得できます。
!FindInMapの使い方
次に、!FindInMapを使ったシンプルなサンプルコードを以下に示します。このサンプルコードでは、現在のリージョンに応じてAMI IDを切り替えています。
Mappings:
RegionMap:
ap-northeast-1:
AMI: ami-0123456789abcdef0
us-east-1:
AMI: ami-0abcdef1234567890
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI]
InstanceType: t2.microこのサンプルコードでは次のような動きになります。
!Ref "AWS::Region"→ 現在のリージョン(例:ap-northeast-1)を取得!FindInMap [RegionMap, ap-northeast-1, AMI]→ 該当リージョンのAMI IDを返す
結果的に、リージョンがap-northeast-1ならami-0123456789abcdef0が使われます。
あわせて読みたい
続きを見る!Refについては下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。 
【CloudFormation】!Refと!Subの「違い」と「使い分け」を解説!
環境ごとに設定を切り替える例(dev / prod)
MappingsとParametersを組み合わせると、環境(dev / prod)によって自動的に設定を切り替えることも可能です。
Mappings:
EnvConfig:
dev:
InstanceType: t2.micro
VolumeSize: 8
prod:
InstanceType: t3.large
VolumeSize: 20
Parameters:
EnvType:
Type: String
Default: dev
AllowedValues:
- dev
- prod
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !FindInMap [EnvConfig, !Ref EnvType, InstanceType]
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeSize: !FindInMap [EnvConfig, !Ref EnvType, VolumeSize]上記の例では、
EnvTypeがdevの場合 →t2.micro, 8GBEnvTypeがprodの場合 →t3.large, 20GB
が自動的に選択されます。このように、テンプレートを1つ用意しておけば、パラメータ値を変えるだけで環境設定を自動で切り替えられます。
!FindInMapと!Refの組み合わせ
!FindInMapは、!Refと組み合わせることで柔軟なテンプレートが作れます。たとえば次のように、!Refでパラメータ値を受け取り、その値を!FindInMapのTopLevelKeyとして使うケースが一般的です。
!FindInMap [RegionMap, !Ref "AWS::Region", AMI]
!FindInMap [EnvConfig, !Ref EnvType, InstanceType]
!FindInMap [EnvConfig, !Ref EnvType, VolumeSize]このようにすることで、環境パラメータを変えるだけで設定を自動で切り替えることができます。
本記事のまとめ
この記事ではCloudFormationの!FindInMapについて、以下の内容を説明しました。
!FindInMapはMappingsセクションから値を取得する関数- リージョンや環境ごとに値を切り替えるときに便利
!Refと組み合わせることで動的に設定を変更できる
お読みいただきありがとうございました。