テンプレートでの待機条件の作成 - AWS CloudFormation

テンプレートでの待機条件の作成

重要

Amazon EC2 および Auto Scaling リソースについては、待機条件ではなく CreationPolicy 属性を使用することをお勧めします。CreationPolicy 属性をこれらのリソースに追加し、インスタンス作成プロセスが正常に完了したときにシグナルを送信するために cfn-signal ヘルパースクリプトを使用します。

詳細については、「CreationPolicy 属性」または「AWS CloudFormation を使用して 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 CloudFormation の VPC エンドポイントの設定」と「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 は待機条件を失敗させ、スタックをロールバックします (例えば、必要な成功シグナルを受信せずにタイムアウト期間が経過したり、失敗シグナルを受信したりした場合)。

スタックで待機条件を使用するには:
  1. スタックのテンプレートで AWS::CloudFormation::WaitConditionHandle リソースを宣言します。待機条件ハンドルには、プロパティがありません。ただし、WaitConditionHandle リソースへの参照は、WaitCondition に成功または失敗のシグナルを送信するために使用できる署名済み URL に解決されます。例:

    "myWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle", "Properties" : { } }
  2. スタックのテンプレートで 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" } }
  3. シグナル送信に使用する署名済み 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 として表示されます。

  4. スタックがいつ待機条件に入るかを検出する方法を選択します。

    通知を有効にしてスタックを作成した場合、AWS CloudFormation はすべてのスタックイベントの通知を指定のトピックに発行します。ユーザーまたはアプリケーションがそのトピックにサブスクライブしている場合は、待機条件ハンドル作成イベントの通知を監視し、通知メッセージから署名済み URL を取得できます。

    AWS Management Console、AWS CloudFormation コマンドラインツール、または AWS CloudFormation API を使用して、スタックのイベントをモニタリングすることもできます。

  5. 署名済み 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%3Aus-east-2%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%3Aus-east-2%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 構造内の名前と値のペアとして UniqueIdData を返します。以下に、上で定義されている WaitConditionData 出力値によって返される Data 属性の例を示します。

{"Signal1":"Application has completed configuration."}

Reason は、内容に関して JSON コンプライアンス以外の制限がない文字列です。