AWS CloudFormationの書き方

記事タイトルとURLをコピーする

はじめに

こんにちは。プロセスエンジニアリング部の谷です。
前回受けたAWS認定試験でCloudFormationの問題がわからなかったので、勉強したいと思います。

AWS CloudFormationとは

プログラミング言語やテキストファイルを使用してAWSリソースを自動で構築するサービスです。
JSON、YAML形式のテンプレートを作成し、それをもとにCloudFormationがリソースの設定、プロビジョニングを自動でおこなってくれます。
テンプレート化しておくことで、別環境に同様の構成を用意することが簡単になります。

テンプレートセクション

YAML形式のテンプレートを例にします。
(コメント機能など JSON にはない一部の機能がYAMLには初めから提供されています。)

YAML形式の例

AWSTemplateFormatVersion: "2010-09-09"
Description: A sample template
Resources:
  MyEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties: 
      ImageId: "ami-0ff8a91507f77f867"
      InstanceType: t2.micro
      KeyName: testkey
      BlockDeviceMappings:
        -
          DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20

AWSTemplateFormatVersion

テンプレートが準拠している AWS CloudFormation テンプレートバージョンのことです。 "2010-09-09"が唯一の有効な値です。

Description

テンプレートに関するコメントを書くことができます。

Metadata

テンプレートに対する追加情報を記載することができます。

メタデータキー

  • AWS::CloudFormation::Init:インスタンス起動後にパッケージのインストールやファイル作成、コマンド実行を含めることができる。

  • AWS::CloudFormation::Interface:パラメーターのグループ化と順序を定義できる。

  • AWS::CloudFormation::Designer:AWS CloudFormation デザイナーを使用すると自動追加される。

Parameters

実行時に、テンプレートに渡すことができる値です。
項目を変数化するイメージです。 変数にすることで再利用しやすくなります。
Srtring型、Number型、List型、Systems Manager パラメーターストアを使用するタイプなどがあります。

設定すると[スタック]の[パラメータ]タブに追加されます。

f:id:swx-tani:20220228230246p:plain

Rules

スタックの作成またはスタックの更新時に、テンプレートに渡されたパラメーターを検証します。
この二つを使います。

  • RuleCondition:ルールがいつ有効になるかを決定します。

  • Assertions (必須):特定のパラメーターにユーザーが指定できる値を示します。

これらを定義するために組み込み関数を使用します。

Rules:
  testInstanceType:
    RuleCondition: !Equals 
      - !Ref Environment
      - prod
    Assertions:
      - Assert:
          "Fn::Contains" : [["m1.large", "m1.small"], {"Ref" : "InstanceType"}]
        AssertDescription: 'For a test environment, the instance type must be a1.medium or '

上記は、Environmentパラメーターがprodの時、InstanceTypeパラメーターが"m1.large"あるいは"m1.small"であるかを検証することができます。

他にも検証を行う組み込み関数があります。

docs.aws.amazon.com

Mappings

キーと関連する値の対応づけを行います。
組み込み関数Fn::FindInMapを使用することで、キーと対応する値を一致させることができます。

Parameters:  
    EnvironmentType: 
      Description: The environment type
      Type: String
      Default: test
      AllowedValues: 
        - prod
        - test
      ConstraintDescription: must be a prod or test
  Mappings: 
    RegionAndInstanceTypeToAMIID: 
      us-east-1: 
        test: "ami-8ff710e2"
        prod: "ami-f5f41398"
      us-west-2: 
        test: "ami-eff1028f"
        prod: "ami-d0f506b0"

  Resources:
     xxxxxxxxx
  Outputs: 
    TestOutput: 
      Description: Return the name of the AMI ID that matches the region and environment type keys
      Value: !FindInMap [RegionAndInstanceTypeToAMIID, !Ref "AWS::Region", !Ref EnvironmentType]

Parametersセクションでtestかprod文字列が入るEnvironmentTypeパラメーターを設定します。
Mappingsセクションでリージョン(us-east-1、us-west-2)と環境(test、prod)それぞれのAMIIDを対応づけます。
Outputsセクションでリージョンと環境に合わせたAMI IDを返します。(us-west-2のtestはami-eff1028f)
このようにリージョンごとやAWSアカウントごとに設定する値を変えたい場合に利用します。

Conditions

作成または設定される状況(条件)を定義します。

次の組み込み関数を使用して条件を定義できます。

  • Fn::And

  • Fn::Equals

  • Fn::If

  • Fn::Not

  • Fn::Or

Parameters:
  EnvType:
    Description: Environment type.
    Default: test
    Type: String
    AllowedValues:
      - prod
      - test
    ConstraintDescription: must specify prod or test.
Conditions:
  CreateProdResources: !Equals 
    - !Ref EnvType
    - prod

EnvTypeパラメーターがprodと等しい場合にその後の処理が行われます。

Resources

必須項目です。
スタックリソースとそのプロパティを指定します。

Resources:
  MyEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-0ff8a91507f77f867"

リソースタイプ一覧 docs.aws.amazon.com

Outputs

他のスタックにインポートする際に使用します。

補足

Ref関数

指定したパラメーターまたはリソースの値を返します。

AWSTemplateFormatVersion: '2010-09-09'
Resources:
    KenshoVpc:                                   
        Type: AWS::EC2::VPC                
        Properties:                        
            CidrBlock: 10.0.0.0/16
            EnableDnsHostnames: true
            EnableDnsSupport: true
            InstanceTenancy: default
            Tags:
                - Key: Name
                  Value: kensho-vpc
 
    KenshoSubnetPublicA:                            
        Type: AWS::EC2::Subnet                
        Properties:                           
            CidrBlock: 10.0.0.0/24
            VpcId: !Ref KenshoVpc
            AvailabilityZone: ap-northeast-1a
            Tags:
                - Key: Name
                  Value: kensho-subnetPublicA

18行目のVpcId: !Ref KenshoVpcは実行時、KenshoVpcのIDに置き換えれらます。
Refで置き換えられる値はリソースによってバラバラです。(ARNや名前など)
SQSのキューの場合、キューのURLを返します。

まとめ

それぞれのセクションの役割が明確になりました。