【CloudFormation】!FindInMapの使い方をわかりやすく解説!

AWS CloudFormationでは、テンプレートを柔軟にするためにさまざまな「組み込み関数(Intrinsic Functions)」が用意されています。その中でも、環境やリージョンによって値を切り替えたいときに便利なのが「!FindInMap(FindInMap関数)」です。

この記事では、「!FindInMap(FindInMap関数)」の仕組み・構文・使い方をサンプルコードを用いてわかりやすく解説します。

!FindInMapとは?(FindInMap関数)

!FindInMapMappingsセクションに定義した値を参照するための関数です。

たとえば次のようなケースで役立ちます。

  • リージョンごとに設定を変えたい
  • 開発環境(dev)と本番環境(prod)で設定を変えたい
  • OSの種類ごとに設定を変えたい

!FindInMapの基本構文は以下のようになっています。

基本構文

!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]

引数の意味は以下の通りです。

引数説明
MapNameMappingsセクションで定義したマップの名前
TopLevelKeyマップ内の最初のキー(例:リージョン名や環境名)
SecondLevelKeyさらにその中のサブキー(例:AMIInstanceType

なお、!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については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

環境ごとに設定を切り替える例(dev / prod)

MappingsParametersを組み合わせると、環境(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]

上記の例では、

  • EnvTypedev の場合 → t2.micro, 8GB
  • EnvTypeprod の場合 → t3.large, 20GB

が自動的に選択されます。このように、テンプレートを1つ用意しておけば、パラメータ値を変えるだけで環境設定を自動で切り替えられます。

!FindInMapと!Refの組み合わせ

!FindInMapは、!Refと組み合わせることで柔軟なテンプレートが作れます。たとえば次のように、!Refでパラメータ値を受け取り、その値を!FindInMapTopLevelKeyとして使うケースが一般的です。

!FindInMap [RegionMap, !Ref "AWS::Region", AMI]
!FindInMap [EnvConfig, !Ref EnvType, InstanceType]
!FindInMap [EnvConfig, !Ref EnvType, VolumeSize]

このようにすることで、環境パラメータを変えるだけで設定を自動で切り替えることができます。

本記事のまとめ

この記事ではCloudFormationの!FindInMapについて、以下の内容を説明しました。

  • !FindInMapMappingsセクションから値を取得する関数
  • リージョンや環境ごとに値を切り替えるときに便利
  • !Refと組み合わせることで動的に設定を変更できる

お読みいただきありがとうございました。

スポンサーリンク