この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWSに於いて環境構築を行う上で、『AWS CloudFormation』はとても強力なツールです。弊社AWSチームでも当然欠かせないものであり、習得必須の要素となっています。
AWS公式ドキュメントを見てみると、実に多彩かつ便利な仕組みや機能が用意されています。一度に全てを覚えるのは大変なので、当ブログでそれらリファレンスの内容について少しずつ読み解いて行ければと思います。
まずはメインの各インスタンス生成の際に使える便利機能から。
このセクションでは、リソースに追加する事が出来る"行動や関連性を制御する"属性について詳しく解説して行きます。
目次
削除ポリシー(DeletionPolicy)
対象のリソースにDeletionPolicyを追加する事で、そのスタックが削除された時にAWS CloudFormationがリソースをどのように処理するかを制御出来ます。
デフォルトでは、DeletionPolicyが設定されていない場合はそのままAWS CloudFormationは対象スタックを削除します。Retainを指定する事で、その要素を消さないようにする事が出来ます。リソースに対するスナップショットが必要となるもの、例えばAWS::RDS::DBInstanceやAWS::EC2::Volumeのような場合はSnapshotを指定する事で、AWS CloudFormationが削除を行う前にリソースのスナップショットを取る事が出来るようになります。
例えば以下例では、Amazon S3バケットリソースにRetainポリシーが設定されています。このスタックが削除される際は、AWS CloudFormationはバケットを削除せずに残しておくようになります。
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Resources" : {
"myS3Bucket" : {
"Type" : "AWS::S3::Bucket",
"DeletionPolicy" : "Retain"
}
}
}
削除ポリシー 設定オプション
- Delete
- デフォルト値。スタック削除と共にリソースの全ての内容を削除します。任意のリソースタイプにこの削除ポリシーを追加する事が出来ます。注)S3バケットの場合、バケットが空の場合のみ削除処理は成功します。
- Retain
- スタックの削除中に、必要に応じてリソースまたはその内容を削除せずにリソースを保持させる際に指定。任意のリソースタイプに追加する事が出来ます。AWS CloudFormation上では、(リソースが保持されていても)ステータスがDelete_Completeとなるので注意してください。また、保持ポリシーを持つリソースが存在し続けているので、削除するまで該当する料金が発生している事にも注意してください。
- Snapshot
- このポリシーは、スナップショット機能をサポートしているリソース:AWS::RDS::DBInstance、AWS::EC2::Volume.に設定が可能です。このポリシーを指定する事で、削除時にスナップショットを作成する事が出来ます。Retain指定時同様、削除実行時のステータスがDelete_Completeとなる事、スナップショットを取った指定要素の利用料金が掛かる点には注意してください。
依存性(DependsOn)
DependsOn属性は、特定リソースの作成を指定した他のリソースの後に行うように指示する事ができます。
リソースにDependsOn属性を指定すると、そのリソースはDependsOn属性で指定したリソースの作成後に作成されます。DependsOn属性はあらゆるリソースに指定する事が出来ます。以下の様なケースが想定されるでしょう。
- 待ち条件が有効になるタイミングを決定するために、別のリソースにDependsOn属性を使用。
- その他詳細についてはCreating Wait Conditions in a Templateをご参照ください。
- リソースの作成時、更新時、削除時にデフォルトの並列処理をオーバーライド。
- AWS CloudFormationはリソースを作成、更新、削除を可能な限り並行して行っています。テンプレート内のリソースが並行処理されるか、またどのリソースが依存しており、他のリソースに対する処理が終わるまで待たねばならないかは自動的に決定されます。あなたはDependsOnを明示的に使う事で、デフォルトの並列処理を無効にし、指定の順序でCloudFormationがリソースを操作するように依存関係を指定する事が出来ます。
シンタックス
DependsOn属性は、単一の文字列または文字列リストを値に取ります。
"DependsOn" : [ String, ... ]
記述例
以下例はAWS::EC2::Instanceリソースに対して、AWS::RDS::DBInstanceインスタンスであるmyDBをDependsOn対象とした設定を行っています。AWS CloudFormationがこのスタックを作成する際は、まずmyDBが作成され、次いでEC2インスタンスが作成されます。
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Mappings" : {
"RegionMap" : {
"us-east-1" : { "AMI" : "ami-76f0061f" },
"us-west-1" : { "AMI" : "ami-655a0a20" },
"eu-west-1" : { "AMI" : "ami-7fd4e10b" },
"ap-northeast-1" : { "AMI" : "ami-8e08a38f" },
"ap-southeast-1" : { "AMI" : "ami-72621c20" }
}
},
"Resources" : {
"Ec2Instance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"ImageId" : {
"Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]
}
},
"DependsOn" : "myDB"
},
"myDB" : {
"Type" : "AWS::RDS::DBInstance",
"Properties" : {
"AllocatedStorage" : "5",
"DBInstanceClass" : "db.m1.small",
"Engine" : "MySQL",
"EngineVersion" : "5.5",
"MasterUsername" : "MyName",
"MasterUserPassword" : "MyPassword"
}
}
}
}
メタデータ(Metadata)
メタデータ属性は、リソースと構造化されたデータを関連付ける事が出来ます。
リソースへのメタデータ属性を追加する事で、リソース宣言にJSON形式のデータを追加する事が出来ます。また、それらの解釈値を追加するメタデータ属性内の組み込み関数(例えばGetAttやRef等)は、パラメータ、及び擬似パラメータを使用する事が出来ます。
AWS CloudFormationはメタデータ属性内のJSONを検証しません。
これらのデータは、describe-stack-resourceまたはDescribeStackResourceアクションで取得する事が出来ます。
記述例
以下テンプレートはAmazon S3バケットリソースにMetadata属性を付加したものです。
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Resources" : {
"MyS3Bucket" : {
"Type" : "AWS::S3::Bucket",
"Metadata" : { "Object1" : "Location1", "Object2" : "Location2" }
}
}
}
更新ポリシー(UpdatePolicy)
UpdatePolicy属性は、どのようにAWS CloudFormationが特定リソースのためにローリングアップデートを処理するかを指定する事が出来ます。
現在、UpdatePolicyをサポートするリソースは唯一、AWS::AutoScaling::AutoScalingGroupのみです。
オートスケーリンググループの場合、起動設定(launch configuration)またはオートスケーリンググループの
サブネットグループに紐付いている更新ポリシーを変更する事によって呼び出されます。
シンタックス
"UpdatePolicy" : {
"AutoScalingRollingUpdate" : {
"MaxBatchSize" : String,
"MinInstancesInService" : String,
"PauseTime" : String
}
}
更新ポリシー 設定オプション
UpdatePolicyは以下ポリシー設定を指定可能な、埋め込みオブジェクトのAutoScalingRollingUpdateを含んでいます。
- MaxBatchSize
- 与えられた時間で終了されるインスタンスの最大値。文字列型、デフォルト値:"1"。任意設定。
- MinInstancesInService
- 廃止されたインスタンスが終了されている間に、オートスケーリンググループ内で稼働中に起動されていなければならないインスタンスの最小値。文字列型、デフォルト値:"0"。任意設定。
- PauseTime
- 変更がリソースに対して行われる前に止める時間。例えば、スケールアップまたはオートスケーリンググループ内のインスタンスを終了する時にオートスケーリングのインスタンスを追加または削除する前など。
- この値は、ISO8601の形式に従った形でなければなりません。("PT#H#M#S") それぞれの#は時間、分、そして秒です。休止時間を指定出来る時間の最大値は1時間("PT1H")です。文字列型、デフォルト値: "PT0S"。任意設定。
記述例
以下例ではUpdatePolicyをオートスケーリンググループに設定しています。
"ASG1" : {
"UpdatePolicy" : {
"AutoScalingRollingUpdate" : {
"MinInstancesInService" : "1",
"MaxBatchSize" : "1",
"PauseTime" : "PT12M5S"
}
},
"Type" : "AWS::AutoScaling::AutoScalingGroup",
"Properties" : {
"AvailabilityZones" : { "Fn::GetAZs" : { "Ref" : "AWS::Region" } },
"LaunchConfigurationName" : { "Ref" : "ASLC" },
"MaxSize" : "3",
"MinSize" : "1"
}
}