何
- CloudFormationテンプレートについて、文法を勉強したので小さな構成でメモする。
- EC2インスタンスをひとつ立てて、各文法でOutputsすることで動作を確認している。
- 全体的に、思い出し用のとっかかり程度の内容です。
テンプレート
- リージョンは「バージニア北部」で実施する想定で書いている。
template.yaml
---
# 任意の Mappings セクションでは、キーと名前付きの一連の値とが対応付けられます。
Mappings: 
  RegionMap: 
    us-east-1: 
      Name1: Value01
      Name2: Value02
    other: 
      Name1: Value03
      Name2: Value04
# オプションの Parameters セクションを使用して、テンプレートをカスタマイズします。
# パラメーターを使用すると、スタックを作成または更新するたびにテンプレートにカスタム値を入力できます。
Parameters:
  EnvType: 
    Description: Environment type.
    Default: test
    Type: String
    AllowedValues: 
      - prod
      - test
    ConstraintDescription: must specify prod or test.      
# オプションの Conditions セクションには、エンティティが作成または設定される状況を定義する文が含まれています。
Conditions: 
  CreateProdResources: !Equals [ !Ref EnvType, prod ]      
# 必須の Resources セクションでは、スタックに含める AWS リソース (Amazon EC2 インスタンスや Amazon S3 バケットなど) を宣言します。
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: us-east-1a
      ImageId: ami-a4c7edb2
      InstanceType: t2.micro
# オプションの Outputs セクションは、他のスタックにインポートする (クロススタック参照を作成)、応答として返す (スタック呼び出しについて記述)、
# または、AWS CloudFormation コンソールで表示する出力値を宣言します。
Outputs:
  # 組み込み関数 Ref は、指定したパラメータまたはリソースの値を返します。
  ByRef:
    Description: Ref
    Value: !Ref MyInstance
    # Export: クロススタック参照にエクスポートされるリソース出力の名前。
    Export:
      Name: MyInstanceId
  # Fn::GetAtt 組み込み関数は、テンプレートのリソースから属性の値を返します
  ByGetAtt: 
    Description: GetAtt
    Value: !GetAtt MyInstance.AvailabilityZone
  # 組み込み関数 Fn::Sub は特定した値の入力文字列にある変数の代わりになります。
  BySub: 
    Description: Sub
    Condition: CreateProdResources
    Value: !Sub
      - ${A}-${B}
      - { A: !FindInMap [RegionMap, !Ref "AWS::Region", Name1], B: !Ref MyInstance }
  # 組み込み関数 Fn::Join は、一連の値を特定の区切り文字で区切って 1 つの値に追加します。
  ByJoin:
    Description: Join
    Value: !Join [ ":", [ a, b, z ] ]
出力
メモ
- パラメータはRefで参照する。
- exportはこの例では必要なかったが、文法の確認用に行った(※Nameはリージョン内で一意である必要がある)
- RefとGetAttの違いが分かりにくかったが、リソースリファレンスで該当する項目の戻り値をみると違いや属性の種類がわかった。
- 完全名関数と短縮形では、文法が結構違う。
Fn::GetAtt: [ logicalNameOfResource, attributeName ]
!GetAtt logicalNameOfResource.attributeName
