こんにちは。AWS CloudFormationの機能を自分のためにおさらいしつつ、マッピング周りの機能を追ってみました。
CloudFormationとは
AWS CloudFormationとは、AWSのさまざまなリソースの設定をYAML形式やJSON形式の「テンプレートファイル」で統一的に記述する仕組みです。組み合わせたリソースは「リソースセット」と呼ばれます。
テンプレートファイルはスクラッチで書くことも可能ですが、既存のテンプレートファイルを必要に応じて修正する形で作成する方が楽でしょう。
作成したテンプレートファイルをCloudFormationにアップロードすることで、設定の反映が完了します。
テンプレートファイルはテキストベースで作成・編集できます。
また、CloudFormationデザイナーというテンプレート編集支援のツールもあり、こちらはGUIのような形で編集できるのですが、私はうまくオブジェクトが切り替わらなかったりでイマイチうまく使いこなせませんでした。なので専らテキスト形式で編集しています。
※CloudFormationはAWSでしか利用できないので、大規模案件などでGCPやAzureといった別のクラウドと設定を共有したいのであれば、Terraformなどを検討する必要があります。
CloudFormationがなかった頃
CloudFormationがなかった頃は、AWSのEC2やRDSといったリソースを個別に設定・管理しなければならず、リソース数が増えると煩雑になってしまいます。今ではサービスの構築にAWSリソースを多数組み合わせることも珍しくないので、同じ設定を別のアカウントや別のリージョンに展開したい場合に、同じ設定作業を繰り返す必要がありました。
テンプレートファイルの構成
テンプレートの分析にはMetadata
やConditions
などさまざまなセクションについて記述されていますが、主に使うのは以下です。
Parameters
セクションMappings
セクションResources
セクション(必須)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"