AppSpec 「フック」セクション - AWS CodeDeploy

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。

AppSpec 「フック」セクション

の のコンテンツ 'hooks' セクション( AppSpec file 変化は、 compute platform 導入のお手伝いをします。は、 'hooks' セクション、 EC2/オンプレミス デプロイメントには、デプロイメントライフサイクルイベントフックを1つ以上のスクリプトにリンクするマッピングが含まれます。は、 'hooks' セクション、 Lambda または Amazon ECS 展開は Lambda 導入ライフサイクルイベント中に実行する検証機能。イベントフックが存在しない場合、そのイベントに対してオペレーションは実行されません。このセクションは、デプロイの一部としてスクリプトまたは Lambda 検証の関数を実行する場合のみ必須です。

AppSpec 「フック」セクション: Amazon ECS 展開

のライフサイクルイベントフックのリスト Amazon ECS 展開

A AWS Lambda フックは Lambda 関数は、ライフサイクル イベントの名前の後に新しい行の文字列で指定します。各フックはデプロイごとに 1 回実行されます。以下は、Amazon ECS デプロイ中にフックを実行できるライフサイクルイベントの説明です。

  • BeforeInstall – 置換タスクセットが作成される前にタスクを実行するために使用します。1 つのターゲットグループが元のタスクセットに関連付けられています。オプションのテストリスナーが指定されている場合、それは元のタスクセットに関連付けられます。この時点で、ロールバックはできません。

  • AfterInstall – 置換タスクセットが作成され、ターゲットグループの1つが関連付けられている後にタスクを実行するために使用します。オプションのテストリスナーが指定されている場合、それは元のタスクセットに関連付けられます。このライフサイクルイベントでのフック関数の結果により、ロールバックをトリガーできます。

  • AfterAllowTestTraffic – テスト・リスナーが代替タスク・セットにトラフィックを提供した後にタスクを実行するために使用します。この時点でのフック関数の結果により、ロールバックをトリガーできます。

  • BeforeAllowTraffic – 2 番目のターゲット グループが置換タスク セットに関連づけられた後、トラフィックが置換タスク セットにシフトする前にタスクを実行するために使用します。このライフサイクルイベントでのフック関数の結果により、ロールバックをトリガーできます。

  • AfterAllowTraffic – 2 番目のターゲット グループが代替タスク セットにトラフィックを供給した後にタスクを実行するために使用します。このライフサイクルイベントでのフック関数の結果により、ロールバックをトリガーできます。

詳細については、以下を参照してください。 活動中に起こること Amazon ECS 展開 および チュートリアル をデプロイする Amazon ECS 検証テストを含むサービス.

Amazon ECS デプロイメントでのフックの実行順序

で Amazon ECS イベントフックは次の順序で実行されます。

注記

は、 開始インストールトラフィックのテストトラフィックを許可、および 終了 イベントはスクリプト化できないため、この図では灰色で表示されます。

「フック」セクションの構造

次の例は、'hooks' セクションの構造の例を示します。

YAML の使用:

Hooks: - BeforeInstall: "BeforeInstallHookFunctionName" - AfterInstall: "AfterInstallHookFunctionName" - AfterAllowTestTraffic: "AfterAllowTestTrafficHookFunctionName" - BeforeAllowTraffic: "BeforeAllowTrafficHookFunctionName" - AfterAllowTraffic: "AfterAllowTrafficHookFunctionName"

JSON の使用:

"Hooks": [ { "BeforeInstall": "BeforeInstallHookFunctionName" }, { "AfterInstall": "AfterInstallHookFunctionName" }, { "AfterAllowTestTraffic": "AfterAllowTestTrafficHookFunctionName" }, { "BeforeAllowTraffic": "BeforeAllowTrafficHookFunctionName" }, { "AfterAllowTraffic": "AfterAllowTrafficHookFunctionName" } ] }

サンプル Lambda 「フック」機能

_を使用 'hooks' セクションをクリックして、 Lambda 機能 CodeDeploy に電話をかけて、 Lambda 展開します。同じ関数または別の関数を BeforeInstallAfterInstallAfterAllowTestTrafficBeforeAllowTraffic、および AfterAllowTraffic 展開ライフサイルイベント。バリデーション試験完了後、 Lambda AfterAllowTraffic 関数コールバックカンスウ:コールバック CodeDeploy 結果を出します Succeeded または Failed.

重要

展開は、次の場合に失敗したと見なされます。 CodeDeploy は、によって通知されていません Lambda 検証機能を1時間以内に実行します。

呼び出しの前に Lambda フック機能の場合、サーバーに対して、 putLifecycleEventHookExecutionStatus コマンド。

次に示すのは、Node.js で記述されたサンプルの Lambda フック関数の例です。

'use strict'; const aws = require('aws-sdk'); const codedeploy = new aws.CodeDeploy({apiVersion: '2014-10-06'}); exports.handler = (event, context, callback) => { //Read the DeploymentId from the event payload. var deploymentId = event.DeploymentId; //Read the LifecycleEventHookExecutionId from the event payload var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId; /* Enter validation tests here. */ // Prepare the validation test results with the deploymentId and // the lifecycleEventHookExecutionId for AWS CodeDeploy. var params = { deploymentId: deploymentId, lifecycleEventHookExecutionId: lifecycleEventHookExecutionId, status: 'Succeeded' // status can be 'Succeeded' or 'Failed' }; // Pass AWS CodeDeploy the prepared validation test results. codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) { if (err) { // Validation failed. callback('Validation test failed'); } else { // Validation succeeded. callback(null, 'Validation test succeeded'); } }); };

AppSpec 「フック」セクション: AWS Lambda 展開

のライフサイクルイベントフックのリスト AWS Lambda 展開

A AWS Lambda フックは Lambda 関数は、ライフサイクル イベントの名前の後に新しい行の文字列で指定します。各フックはデプロイごとに 1 回実行されます。以下は、AppSpec ファイルに使用できるフックの説明です。

  • トラフィックを許可する前 – トラフィックが展開済みに移行する前にタスクを実行するために使用します。 Lambda 機能バージョン。

  • 許可後のトラフィック – すべてのトラフィックが展開された にシフトした後にタスクを実行するために使用します。 Lambda 機能バージョン。

Lambda関数バージョンデプロイでのフックの実行順序

サーバーレスの Lambda 関数のバージョンのデプロイでは、イベントフックは次の順序で実行されます。

注記

は、 開始トラフィックを許可、および 終了 イベントはスクリプト化できないため、この図では灰色で表示されます。

「フック」セクションの構造

次の例は、「hooks」セクションの例を示します。

YAML の使用:

hooks: - BeforeAllowTraffic: BeforeAllowTrafficHookFunctionName - AfterAllowTraffic: AfterAllowTrafficHookFunctionName

JSON の使用:

"hooks": [{ "BeforeAllowTraffic": "BeforeAllowTrafficHookFunctionName" }, { "AfterAllowTraffic": "AfterAllowTrafficHookFunctionName" }]

サンプル Lambda 「フック」機能

「フック」セクションを使用して、 Lambda 機能 CodeDeploy に電話をかけて、 Lambda 展開します。同じ関数または別の関数を BeforeAllowTraffic および AfterAllowTraffic 展開ライフサイルイベント。バリデーション試験完了後、 Lambda 検証関数コールバックカクセイカンスウコールバック CodeDeploy 結果を出します Succeeded または Failed.

重要

展開は、次の場合に失敗したと見なされます。 CodeDeploy は、によって通知されていません Lambda 検証機能を1時間以内に実行します。

呼び出しの前に Lambda フック機能の場合、サーバーに対して、 putLifecycleEventHookExecutionStatus コマンド。

次に示すのは、Node.js で記述されたサンプルの Lambda フック関数の例です。

'use strict'; const aws = require('aws-sdk'); const codedeploy = new aws.CodeDeploy({apiVersion: '2014-10-06'}); exports.handler = (event, context, callback) => { //Read the DeploymentId from the event payload. var deploymentId = event.DeploymentId; //Read the LifecycleEventHookExecutionId from the event payload var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId; /* Enter validation tests here. */ // Prepare the validation test results with the deploymentId and // the lifecycleEventHookExecutionId for AWS CodeDeploy. var params = { deploymentId: deploymentId, lifecycleEventHookExecutionId: lifecycleEventHookExecutionId, status: 'Succeeded' // status can be 'Succeeded' or 'Failed' }; // Pass AWS CodeDeploy the prepared validation test results. codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) { if (err) { // Validation failed. callback('Validation test failed'); } else { // Validation succeeded. callback(null, 'Validation test succeeded'); } }); };

AppSpec 「フック」セクション: EC2/オンプレミス 展開

ライフサイクル イベント フックのリスト

A EC2/オンプレミス デプロイメントフックは、インスタンスへのデプロイメントごとに1回実行されます。フックには実行するスクリプトを 1 つまたは複数指定することができます。ライフサイクルイベントの各フックは、文字列で個別の行に指定します。以下は、AppSpec ファイルに使用できるフックの説明です。

デプロイおよびロールバックの種類別の有効なライフサイクルフックの詳細については、「」を参照してください。ライフサイクルイベントフックの可用性.

  • ApplicationStop – このデプロイメント ライフサイクル イベントは、アプリケーション リビジョンがダウンロードされる前でも発生します。アプリケーションを適切に中止するか、現在インストールされているパッケージを削除してデプロイの準備をする場合は、このイベントのスクリプトを指定できます。このデプロイライフサイクルイベントに使用される AppSpec file とスクリプトは、前回正常にデプロイされたアプリケーションリビジョンのものです。

    注記

    A AppSpec file は、配置する前にインスタンスに存在しません。したがって、ApplicationStop フックは、初めてインスタンスにデプロイするときは実行されません。インスタンスに 2 回目にデプロイするときは、ApplicationStop フックを使用できます。

    最後に正常に展開されたアプリケーションリビジョンの場所を決定するには、 CodeDeploy エージェントは、 deployment-group-id_last_successful_install ファイル。このファイルは次の場所にあります。

    /opt/codedeploy-agent/deployment-root/deployment-instructions フォルダ Amazon Linux、 Ubuntu Server、および RHEL Amazon EC2 インスタンス。

    C:\ProgramData\Amazon\CodeDeploy\deployment-instructions フォルダ Windows Server Amazon EC2 インスタンス。

    で障害が発生した配備のトラブルシューティングを行うには、 ApplicationStop デプロイメント ライフサイクル イベント、を参照 失敗した ApplicationStop、BeforeBlockTraffic、および AfterBlockTraffic デプロイライフサイクルイベントのトラブルシューティング.

  • DownloadBundle – このデプロイライフサイクルイベント中に、CodeDeploy エージェントはアプリケーションリビジョンファイルを一時的な場所にコピーします。

    /opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive フォルダ Amazon Linux、 Ubuntu Server、および RHEL Amazon EC2 インスタンス。

    C:\ProgramData\Amazon\CodeDeploy\deployment-group-id\deployment-id\deployment-archive フォルダ Windows Server Amazon EC2 インスタンス。

    このイベントは CodeDeploy 用に予約されていて、スクリプトを実行するために使用することはできません。

    で障害が発生した配備のトラブルシューティングを行うには、 DownloadBundle デプロイメント ライフサイクル イベント、を参照 「不明なエラー: 読み取り用に開いていません」で失敗した DownloadBundle デプロイライフサイクルイベントのトラブルシューティング.

  • BeforeInstall – この導入ライフサイクル イベントは、ファイルの復号化や最新バージョンのバックアップの作成など、プリインストール タスクに使用できます。

  • Install – このデプロイのライフサイクルイベントでは、CodeDeploy エージェントが一時的なロケーションからリビジョンファイルを最終的な送信先フォルダにコピーします。このイベントは CodeDeploy 用に予約されていて、スクリプトを実行するために使用することはできません。

  • AfterInstall – アプリケーションの設定やファイル権限の変更などのタスクに、この導入ライフサイクル イベントを使用できます。

  • ApplicationStart – 通常、このデプロイライフサイクルイベントを使用して、 中に停止されたサービスを再起動します。ApplicationStop.

  • ValidateService – これは、最後のデプロイメントライフサイクルイベントです。デプロイが正常に完了したことを確認するために使用されます。

  • BeforeBlockTraffic – この展開ライフサイクル イベントを使用して、ロード バランサーから登録解除される前にインスタンスでタスクを実行できます。

    で障害が発生した配備のトラブルシューティングを行うには、 BeforeBlockTraffic デプロイメント ライフサイクル イベント、を参照 失敗した ApplicationStop、BeforeBlockTraffic、および AfterBlockTraffic デプロイライフサイクルイベントのトラブルシューティング.

  • BlockTraffic – この展開ライフサイクルイベントの間、インターネットトラフィックは、現在トラフィックを提供しているインスタンスへのアクセスをブロックされます。このイベントは CodeDeploy 用に予約されていて、スクリプトを実行するために使用することはできません。

  • AfterBlockTraffic – この展開ライフサイクル イベントを使用して、ロード バランサーから登録解除されたインスタンスでタスクを実行できます。

    で障害が発生した配備のトラブルシューティングを行うには、 AfterBlockTraffic デプロイメント ライフサイクル イベント、を参照 失敗した ApplicationStop、BeforeBlockTraffic、および AfterBlockTraffic デプロイライフサイクルイベントのトラブルシューティング.

  • BeforeAllowTraffic – この展開ライフサイクル イベントを使用して、ロード バランサーに登録される前にインスタンスでタスクを実行できます。

  • AllowTraffic – この展開ライフサイクルイベント中、インターネットトラフィックは展開後にインスタンスへのアクセスを許可されます。このイベントは CodeDeploy 用に予約されていて、スクリプトを実行するために使用することはできません。

  • AfterAllowTraffic – この導入ライフサイクル イベントを使用して、ロード バランサーに登録した後にインスタンスでタスクを実行できます。

ライフサイクルイベントフックの可用性

次の表に、各デプロイおよびロールバックシナリオで使用できるライフサイクルイベントフックを示します。

ライフサイクルイベント名 インプレースデプロイ¹ ブルー/グリーン展開: Original instances ブルー/グリーン展開: 置換インスタンス ブルー/グリーン展開ロールバック: Original instances ブルー/グリーン展開ロールバック: 置換インスタンス
ApplicationStop
DownloadBundle²
BeforeInstall
Install²
AfterInstall
ApplicationStart
ValidateService
BeforeBlockTraffic
BlockTraffic²
AfterBlockTraffic
BeforeAllowTraffic
AllowTraffic²
AfterAllowTraffic

¹インプレースデプロイのロールバックにも適用されます。

² に予約済み CodeDeploy 操作。スクリプトの実行には使用できません。

デプロイ内のフックの実行順序

インプレースデプロイ

インプレースデプロイのロールバックを含むインプレースデプロイで、イベントフックは次の順序で実行されます。

注記

インプレースデプロイの場合、トラフィックのブロックと許可に関連する6つのフックは、 Classic Load Balancer、 Application Load Balancer、または Network Load Balancer から Elastic Load Balancing 配置グループにあります。

注記

は、 開始バンドルのダウンロードインストール、および 終了 イベントはスクリプト化できないため、この図では灰色で表示されます。ただし、 'files' セクション( AppSpec file でインストールされているものを指定します。 インストール イベント。

Blue/Green デプロイ

Blue/Green デプロイでは、イベントフックは次の順序で実行されます。

注記

は、 開始バンドルのダウンロードインストールブロックトラフィックトラフィックを許可、および 終了 イベントはスクリプト化できないため、この図では灰色で表示されます。ただし、 AppSpec file でインストールされているものを指定します。 インストール イベント。

「フック」セクションの構造

は、 'hooks' セクションには、次の構造があります。

hooks: deployment-lifecycle-event-name: - location: script-location timeout: timeout-in-seconds runas: user-name

次の要素を フック 導入ライフサイクル イベント名の後に次のエントリがあります。

location

必須。リビジョンのスクリプトファイルのバンドルでの位置。

timeout

(オプション) 失敗と見なされる前にスクリプトの実行を許可する秒数。デフォルト値は 3600 秒 (1 時間) です。

注記

3600 秒 (1 時間) は、各デプロイライフサイクルイベントのスクリプト実行で許可される最大の時間です。スクリプトがこの制限を超過した場合、デプロイは停止し、インスタンスへのデプロイは失敗します。で指定した合計秒数を確認してください。 タイムアウト 各デプロイメント ライフサイクル イベントのすべてのスクリプトで、この制限を超えません。

runas

(オプション) スクリプトの実行時に偽装するユーザー。デフォルトでは、これは CodeDeploy インスタンス上で実行されるエージェント。 CodeDeploy はパスワードを保存しないため、 ルナ ユーザーにパスワードが必要です。この要素は次に適用されます: Amazon Linux および Ubuntu Server インスタンスのみ。

フックの環境変数の可用性

各デプロイライフサイクルイベントの間、フックスクリプトは次の環境変数にアクセスできます。

APPLICATION_NAME

のアプリケーション名 CodeDeploy 現在のデプロイメントの一部(たとえば、 WordPress_App)。

DEPLOYMENT_ID

ID CodeDeploy は現在のデプロイメントに割り当てられています(たとえば、 d-AB1CDEF23)。

DEPLOYMENT_GROUP_NAME

展開グループの名前 CodeDeploy 現在のデプロイメントの一部(たとえば、 WordPress_DepGroup)。

DEPLOYMENT_GROUP_ID

の配布グループの ID CodeDeploy 現在のデプロイメントの一部(たとえば、 b1a2189b-dd90-4ef5-8f40-4c1c5EXAMPLE)。

LIFECYCLE_EVENT

現在のデプロイライフサイクルイベントの名前 (例: AfterInstall).

これらの環境変数は各デプロイライフサイクルイベントにローカルです。

次のスクリプトは、Apache HTTPサーバのリスニング ポートを80ではなく9090に変更します。 配備_グループ_名 は次と等しい: Staging。 このスクリプトは、 BeforeInstall デプロイメントライフサイクルイベント:

if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ] then sed -i -e 's/Listen 80/Listen 9090/g' /etc/httpd/conf/httpd.conf fi

次のスクリプト例では、 配備_グループ_名 環境変数が次と等しい: Staging。 このスクリプトは、 BeforeInstall デプロイメントライフサイクルイベント:

if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ] then sed -i -e 's/LogLevel warn/LogLevel debug/g' /etc/httpd/conf/httpd.conf fi

以下のスクリプトの例では、指定されたウェブページを、これらの環境変数の値を表示するテキストで置き換えます。このスクリプトは AfterInstall デプロイライフサイクルイベント中に呼び出される必要があります。

#!/usr/bin/python import os strToSearch="<h2>This application was deployed using CodeDeploy.</h2>" strToReplace="<h2>This page for "+os.environ['APPLICATION_NAME']+" application and "+os.environ['DEPLOYMENT_GROUP_NAME']+" deployment group with "+os.environ['DEPLOYMENT_GROUP_ID']+" deployment group ID was generated by a "+os.environ['LIFECYCLE_EVENT']+" script during "+os.environ['DEPLOYMENT_ID']+" deployment.</h2>" fp=open("/var/www/html/index.html","r") buffer=fp.read() fp.close() fp=open("/var/www/html/index.html","w") fp.write(buffer.replace(strToSearch,strToReplace)) fp.close()

フックの例

これは フック の2つのフックを指定するエントリー AfterInstall ライフサイクルイベント:

hooks: AfterInstall: - location: Scripts/RunResourceTests.sh timeout: 180 - location: Scripts/PostDeploy.sh timeout: 180

は、 Scripts/RunResourceTests.sh スクリプトは、 AfterInstall 導入プロセスの段階です。スクリプトの実行に 180 秒 (3 分) 以上かかる場合、デプロイは成功しません。

「hooks」セクションで指定するスクリプトの場所は、アプリケーションリビジョンバンドルのルートに相対的な位置です。前述の例では、 RunResourceTests.sh は、という名前のディレクトリにあります Scripts。 は、 Scripts ディレクトリはバンドルのルートレベルにあります。詳細については、「」を参照してください。CodeDeploy のリビジョンの計画.