はじめに
こんにちは。プロセスエンジニアリング部の谷です。
前回受けた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 パラメーターストアを使用するタイプなどがあります。
設定すると[スタック]の[パラメータ]タブに追加されます。
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"であるかを検証することができます。
他にも検証を行う組み込み関数があります。
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を返します。
まとめ
それぞれのセクションの役割が明確になりました。