CloudFormation テンプレートで待機条件を作成する
重要
Amazon EC2 および Auto Scaling リソースについては、待機条件ではなく CreationPolicy 属性を使用することをお勧めします。CreationPolicy 属性をこれらのリソースに追加し、インスタンス作成プロセスが正常に完了したときにシグナルを送信するために cfn-signal ヘルパースクリプトを使用します。
詳細については、「CreationPolicy 属性」または「Amazon EC2 にアプリケーションをデプロイする」を参照してください。
AWS::CloudFormation::WaitConditionHandle
リソースおよび CreationPolicy 属性 属性を使用して、次のようなことができます。
-
スタックリソースの作成をスタック作成以外の構成アクションとコーディネートする
-
構成プロセスのステータスを追跡する
たとえば、アプリケーション構成の一部が完了した後に別のリソースの作成を開始したり、インストールおよび構成プロセス中にシグナルを送信して進行状況を追跡できます。
待機条件ハンドルの使用
注記
[VPC endpoint] (VPC エンドポイント) 機能を使用する場合、待機条件に応答する VPC のリソースには、AWS CloudFormation 固有の Amazon Simple Storage Service (Amazon S3) バケットへのアクセス権が必要です。リソースは、署名付き Amazon S3 URL に応答する待機条件を送信する必要があります。Amazon S3 に応答を送信できない場合、AWS CloudFormation は応答を受信せず、スタックオペレーションは失敗となります。詳細については、「インターフェイスエンドポイント (AWS PrivateLink) を使用して CloudFormation にアクセスする」と「Amazon S3 の VPC エンドポイント用のバケットポリシーの例」を参照してください。
待機条件および待機条件ハンドルを使用して、AWS CloudFormation にスタックの作成を一時停止させ、シグナルを待ってから作成を続行させることができます。たとえば、Amazon EC2 インスタンスの作成を完了させる前に、その Amazon EC2 インスタンスでアプリケーションをダウンロードおよび設定する場合があります。
次のリストは、待機条件ハンドルを伴う待機条件の動作の概要を示します。
-
AWS CloudFormation は、他のリソースと同じように待機条件を作成します。AWS CloudFormation は、待機条件を作成するときに待機条件のステータスを CREATE_IN_PROGRESS としてレポートし、必要な数の成功シグナルを受信するか、待機条件のタイムアウト期間が経過するまで待機します。AWS CloudFormation が、タイムアウト期間が経過する前に必要な数の成功シグナルを受け取った場合は、スタックの作成が続行されます。そうでない場合は、待機条件のステータスが
CREATE_FAILED
に設定され、スタックがロールバックされます。 -
Timeout
プロパティは、必要な数の成功シグナルを AWS CloudFormation が待機する期間を決定します。Timeout
は、最小許容プロパティです。つまり、タイムアウトは、指定した時間の経過直後に発生しますが、間を置いて発生する可能性があります。指定できる最大時間は 43,200 秒 (12 時間) です。 -
通常、待機条件は特定のリソース (Amazon EC2 インスタンス、RDS DB インスタンス、Auto Scaling グループなど) の作成直後に開始されることが望まれます。そのためには、待機条件に DependsOn 属性を追加します。待機条件に
DependsOn
属性を追加するときに、特定のリソースの作成が完了した後にだけ待機条件が作成されるように指定します。待機条件が作成されるときに、AWS CloudFormation はタイムアウト期間を開始し、成功シグナルを待機します。 -
他のリソースの
DependsOn
属性も使用できます。例えば、Amazon RDS DB インスタンスが作成され、そのDB インスタンス上のデータベースが設定されてから、そのデータベースを使用する EC2 インスタンスを作成したい場合があります。この場合は、DB インスタンスを指定するDependsOn
属性を持つ待機条件を作成し、待機条件を指定するDependsOn
属性を持つ EC2 インスタンスリソースを作成します。そうすることで、EC2 インスタンスは、DB インスタンスと待機条件の完了直後にのみ作成されるようになります。 -
AWS CloudFormation は、スタックの作成を続行して待機条件のステータスを
CREATE_COMPLETE
に設定する前に、待機条件に対する指定された回数の成功シグナルを受信する必要があります。待機条件のCount
プロパティは、成功シグナルの数を指定します。何も設定されていない場合、デフォルトは 1 です。 -
待機条件には、シグナリングメカニズムとして使用される署名済み URL をセットアップするための待機条件ハンドルが必要です。署名済み URL を使用すると、自分の AWS 認証情報を指定せずにシグナルを送信できます。この署名済み URL を使用して、成功または失敗のシグナルを送信します。これは、JSON ステートメントにカプセル化されます。その JSON ステートメントの形式については、「待機条件シグナルの JSON 形式」を参照してください。
-
待機条件が、タイムアウト期間が経過する前に必要な数 (Count プロパティで定義) の成功シグナルを受信した場合、AWS CloudFormation は待機シグナルを
CREATE_COMPLETE
としてマークし、スタックの作成を続行します。そうでない場合、AWS CloudFormation は待機条件を失敗させ、スタックをロールバックします (例えば、必要な成功シグナルを受信せずにタイムアウト期間が経過したり、失敗シグナルを受信したりした場合)。
スタックで待機条件を使用するには:
-
スタックのテンプレートで
AWS::CloudFormation::WaitConditionHandle
リソースを宣言します。待機条件ハンドルには、プロパティがありません。ただし、WaitConditionHandle
リソースへの参照は、WaitCondition
に成功または失敗のシグナルを送信するために使用できる署名済み URL に解決されます。例:"myWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle", "Properties" : { } }
-
スタックのテンプレートで
AWS::CloudFormation::WaitCondition
リソースを宣言します。WaitCondition
リソースには、2 つの必須プロパティがあります。Handle
はテンプレートで宣言されているWaitConditionHandle
への参照で、Timeout
は AWS CloudFormation が待機する数秒です。オプションで、Count
プロパティを設定できます。このプロパティは、AWS CloudFormation がスタックの作成を再開するために待機条件が受信しなければならない成功シグナルの数を決定します。待機条件がいつトリガーされるかを制御するには、待機条件の
DependsOn
属性を設定します。DependsOn
句は、リソースを待機条件に関連付けます。AWS CloudFormation は、DependsOn
リソースの作成後、次のいずれかのイベントが発生するまでスタックリソースの作成をブロックします。a) タイムアウト期間が経過した b) 必要な数の成功シグナルを受信した c) 失敗シグナルを受信した。以下の待機条件の例は、
Ec2Instance
リソースの作成が成功した後に開始され、myWaitHandle
リソースをWaitConditionHandle
として使用します。タイムアウトは 4500 秒で、デフォルトCount
は 1 です (Count
プロパティが指定されていないため)。"myWaitCondition" : { "Type" : "AWS::CloudFormation::WaitCondition", "DependsOn" : "Ec2Instance", "Properties" : { "Handle" : { "Ref" : "myWaitHandle" }, "Timeout" : "4500" } }
-
シグナル送信に使用する署名済み URL を取得します。
テンプレートで署名済み URL を取得するには、Ref 組み込み関数に
AWS::CloudFormation::WaitConditionHandle
リソースの論理名を渡します。例えば、AWS::EC2::Instance
リソースのUserData
プロパティを使用して、署名済み URL を Amazon EC2 インスタンスに渡すと、そのインスタンスで実行されているスクリプトまたはアプリケーションが成功または失敗のシグナルを AWS CloudFormation に送信できます。"UserData" : { "Fn::Base64" : { "Fn::Join" : [ "", ["SignalURL=", { "Ref" : "myWaitHandle" } ] ] } }
注意: AWS Management Console または AWS CloudFormation コマンドラインツールでは、署名済み URL は待機条件ハンドルリソースの物理 ID として表示されます。
-
スタックがいつ待機条件に入るかを検出する方法を選択します。
通知を有効にしてスタックを作成した場合、AWS CloudFormation はすべてのスタックイベントの通知を指定のトピックに発行します。ユーザーまたはアプリケーションがそのトピックにサブスクライブしている場合は、待機条件ハンドル作成イベントの通知を監視し、通知メッセージから署名済み URL を取得できます。
AWS Management Console、AWS CloudFormation コマンドラインツール、または AWS CloudFormation API を使用して、スタックのイベントをモニタリングすることもできます。
-
署名済み URL を使用して、成功または失敗のシグナルを送信します。
シグナルを送信するには、署名済み URL を使用して HTTP リクエストメッセージを送信します。リクエスト方法は
PUT
である必要があります。Content-Type
ヘッダーは空の文字列であるか省略される必要があります。リクエストメッセージは、「待機条件シグナルの JSON 形式」で指定されている形式の JSON 構造である必要があります。AWS CloudFormation によってスタックの作成が続行されるようにするには、
Count
プロパティで指定された数の成功シグナルを送信する必要があります。Count
が 1 より大きい場合、各シグナルのUniqueId
値は、特定の待機条件に送信されるすべてのシグナルにわたって一意である必要があります。UniqueId
は任意の英数字の文字列です。curl
コマンドは、シグナルを送信する方法の 1 つです。次の例は、待機条件に成功のシグナルを送信するcurl
コマンドラインを示しています。$
curl -T /tmp/a \ "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3A
aws-region
%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"ファイル /tmp/a には、次の JSON 構造が格納されます。
{ "Status" : "SUCCESS", "Reason" : "Configuration Complete", "UniqueId" : "ID1234", "Data" : "Application has completed configuration." }
この例は、同じ成功のシグナルを送信する
curl
コマンドラインを示していますが、コマンドラインのパラメータとして JSON 構造を送信している点が異なります。$
curl -X PUT \ -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' \ "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3A
aws-region
%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
待機条件シグナルの JSON 形式
待機条件にシグナルを送信する場合は、以下の JSON 形式を使用する必要があります。
{ "Status" : "StatusValue", "UniqueId" : "Some UniqueId", "Data" : "Some Data", "Reason" : "Some Reason" }
コードの説明は以下のとおりです。
StatusValue は、以下のいずれかの値である必要があります。
-
SUCCESS は成功のシグナルを示します。
-
FAILURE は失敗のシグナルを示しており、失敗した待機条件およびスタックのロールバックをトリガーします。
UniqueId
は AWS CloudFormation へのシグナルを識別します。待機条件の Count
プロパティが 1 より大きい場合、UniqueId
値は特定の待機条件に送信されるすべてのシグナルにわたって一意でなければなりません。そうでない場合、AWS CloudFormation は同じ UniqueId
のシグナルを以前に送信されたものの再送信であると見なして、そのシグナルを無視します。
Data
は、シグナルとともに返送する任意の情報です。Data
値には、テンプレート内で Fn::GetAtt 関数を呼び出すことによってアクセスできます。例えば、待機条件 mywaitcondition
に対して次の出力値を作成する場合、aws cloudformation describe-stacks
コマンド、DescribeStacks
API 操作、または AWS CloudFormation コンソールの [出力] タブを使用すると、AWS CloudFormation に送信された有効なシグナルにより送信された Data
を表示できます。
"WaitConditionData" : { "Value" : { "Fn::GetAtt" : [ "mywaitcondition", "Data" ]}, "Description" : "The data passed back as part of signalling the WaitCondition" },
Fn::GetAtt 関数は、JSON 構造内の名前と値のペアとして UniqueId
と Data
を返します。以下に、上で定義されている WaitConditionData
出力値によって返される Data
属性の例を示します。
{"Signal1":"Application has completed configuration."}
Reason は、内容に関して JSON コンプライアンス以外の制限がない文字列です。