AWS: CloudFormationの概要、マッピング、FindInMap組み込み関数

こんにちは。AWS CloudFormationの機能を自分のためにおさらいしつつ、マッピング周りの機能を追ってみました。

CloudFormationとは

AWS CloudFormationとは、AWSのさまざまなリソースの設定をYAML形式やJSON形式の「テンプレートファイル」で統一的に記述する仕組みです。組み合わせたリソースは「リソースセット」と呼ばれます。

テンプレートファイルはスクラッチで書くことも可能ですが、既存のテンプレートファイルを必要に応じて修正する形で作成する方が楽でしょう。

作成したテンプレートファイルをCloudFormationにアップロードすることで、設定の反映が完了します。

テンプレートファイルはテキストベースで作成・編集できます。

また、CloudFormationデザイナーというテンプレート編集支援のツールもあり、こちらはGUIのような形で編集できるのですが、私はうまくオブジェクトが切り替わらなかったりでイマイチうまく使いこなせませんでした。なので専らテキスト形式で編集しています。

※CloudFormationはAWSでしか利用できないので、大規模案件などでGCPやAzureといった別のクラウドと設定を共有したいのであれば、Terraformなどを検討する必要があります。

CloudFormationがなかった頃

CloudFormationがなかった頃は、AWSのEC2やRDSといったリソースを個別に設定・管理しなければならず、リソース数が増えると煩雑になってしまいます。今ではサービスの構築にAWSリソースを多数組み合わせることも珍しくないので、同じ設定を別のアカウントや別のリージョンに展開したい場合に、同じ設定作業を繰り返す必要がありました。

テンプレートファイルの構成

テンプレートの分析にはMetadataConditionsなどさまざまなセクションについて記述されていますが、主に使うのは以下です。

  1. Parametersセクション
  2. Mappingsセクション
  3. Resourcesセクション(必須
  4. Outputsセクション

Resourcesセクションは省略できません。

Parameters:
  parameterのセット

Mappings:
  mappingのセット

Resources:
  resourceのセット

Outputs:
  outputのセット

マッピングとFindInMap組み込み関数

テンプレートファイルで関数を上手に利用することで、記述量を減らせます。

以下ではYAMLファイルでのマッピングとFindInMapについてのみメモします。

CloudFormationテンプレートのJSONまたはYAMLファイルにはMappingsというセクションがあり、設定に使うキーと値をここで対応付けます(キーバリュー)。

そのバリュー(値)を参照するときには、FindInMap関数を使います。

キーはネストできます

# yaml
Mappings:
  第1キー:
    第2キー:
      第3キー: 値

値は下記のように取得します。Fn::FindInMapが完全な関数名ですが、以下のように!FindInMapという省略形で書けます。

# !FindInMapで検索して値を返す。
!FindInMap ["第1キー","第1キー","第3キー"]

例として、マッピング名(第1キー)、リージョン(第2キー)とアーキテクチャ(32bit/64bit、第3キー)に基づくami-id値を取得する場合を考えます。

# yaml
# マッピングセクション開始
Mappings: 
  # 第1キー マッピング名 今回はRegionMap
  # この中のami-idが値。
  RegionMap:
    # 第2キー リージョン名
    us-east-1:
      # 第3キー: 値
      "32": "ami-64vvvvvv"
      "64": "ami-7awwwwww"
    us-west-1: 
      "32": "ami-c9xxxxxx"
      "64": "ami-cfyyyyyy"
# マッピングセクション終了
Resources: 
  myEC2Instance: 
    Type: "AWS::EC2::Instance"
    Properties: 
      # !FindInMapで検索してvalueを返す。
      # !FindInMap ["第1キー","第2キー","第3キー"]
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", 32]
      InstanceType: m1.small
      # !Ref "AWS::Region"は次の「疑似パラメータ」参照

擬似パラメータ参照

擬似パラメータは、AWS CloudFormationによって事前定義されたパラメータです。

  • マッピングやパラメータと異なり、擬似パラメータはテンプレートでは宣言しません。
  • 通常のパラメータ同じように、Ref関数の引数として使用します。
Outputs:
  MyStacksRegion:
    # 形式
    # Ref関数 疑似パラメータ
    # 今回はリージョン(us-west-1など)を取得することができる。
    Value: !Ref "AWS::Region"

参考情報

関連記事

AWS: EC2作成時に「ユーザーデータ」を使ってEFSをマウントする方法

Webアプリの基礎とさまざまな実行環境を理解する#1(社内勉強会)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

kotetsu75

kotetsu75の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ