Amazon EC2 Auto Scaling CodeDeploy との統合 - AWS CodeDeploy

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon EC2 Auto Scaling CodeDeploy との統合

CodeDeploy はAmazon EC2 Auto Scaling をサポートします。これは、定義した条件に従って Amazon EC2 インスタンスを自動的に起動する AWS サービスです。これらの条件には、指定された時間間隔にわたる CPU 使用率やディスクの読み取りまたは書き込み、インバウンド/アウトバウンドのネットワークトラフィックの制限の超過が含まれます。Amazon EC2 Auto Scaling は、インスタンスが不要になったときに、それを終了します。詳細については、「Amazon EC2 Auto Scaling ユーザーガイド」の「Amazon EC2 Auto Scaling とは」を参照してください。

新しい Amazon EC2 インスタンスが Amazon EC2 Auto Scaling グループの一部として起動されると、 はリビジョンを新しいインスタンスに自動的にデプロイ CodeDeploy できます。Elastic Load Balancing ロードバランサーに登録されている Amazon EC2 Auto Scaling インスタンスを使用して、 でのデプロイ CodeDeployを調整することもできます。 Auto Scaling 詳細については、「Integrating CodeDeploy with Elastic Load Balancing」および「 CodeDeploy Amazon EC2 デプロイ用の Elastic Load Balancing でロードバランサーを設定する」を参照してください。

注記

複数のデプロイグループを 1 つの Amazon EC2 Auto Scaling グループに関連付けると、問題が発生する可能性があります。例えば、1 つのデプロイが失敗すると、インスタンスはシャットダウンを開始しますが、実行中の他のデプロイはタイムアウトに 1 時間かかる可能性があります。詳細については、複数のデプロイグループを 1 つの Amazon EC2 Auto Scaling グループに関連付けることは避ける「」および「Under the hood: CodeDeploy 」およびAmazon EC2 Auto Scaling 統合」を参照してください。

Amazon EC2 Auto Scaling グループに CodeDeploy アプリケーションをデプロイする

CodeDeploy アプリケーションリビジョンを Amazon EC2 Auto Scaling グループにデプロイするには:

  1. Amazon EC2 Auto Scaling グループが Amazon S3 での作業を許可する IAM インスタンスプロファイルを作成または検索します。詳細については、「ステップ 4: Amazon EC2 インスタンス用の IAM インスタンスプロファイルを作成する」を参照してください。

    注記

    を使用して CodeDeploy 、 GitHub リポジトリから Amazon EC2 Auto Scaling グループにリビジョンをデプロイすることもできます。Amazon EC2 インスタンスには引き続き IAM インスタンスプロファイルが必要ですが、リポジトリからデプロイするための追加のアクセス許可は必要ありません GitHub 。

  2. Amazon EC2 Auto Scaling グループを作成または使用し、起動設定またはテンプレートで、IAM インスタンスプロファイルを指定します。詳細については、「Amazon EC2 インスタンスで実行されるアプリケーションに対する IAM ロール」を参照してください。

  3. が Amazon EC2 Auto Scaling グループを含むデプロイグループを作成 CodeDeploy できるようにするサービスロールを作成または検索します。

  4. を使用してデプロイグループを作成し CodeDeploy、Amazon EC2 Auto Scaling グループ名、サービスロール、およびその他のいくつかのオプションを指定します。詳細については、インプレースデプロイ用のデプロイグループを作成する (コンソール)またはインプレースデプロイ用のデプロイグループを作成する (コンソール)を参照してください。

  5. CodeDeploy を使用して、Amazon EC2 Auto Scaling グループを含むデプロイグループにリビジョンをデプロイします。

詳細については、「チュートリアル: CodeDeploy を使用して Auto Scaling グループにアプリケーションをデプロイする」を参照してください。

Auto Scaling スケールインイベント中の終了デプロイの有効化

終了デプロイは、Auto Scaling スケールインイベントが発生したときに自動的にアクティブ化される CodeDeploy デプロイの一種 CodeDeploy です。 はAuto Scaling サービスがインスタンスを終了する直前に終了デプロイを実行します。終了デプロイ中、 CodeDeploy は何もデプロイしません。代わりに、ライフサイクルイベントを生成します。これを独自のスクリプトにフックしてカスタムのシャットダウン機能を有効にすることができます。例えば、ApplicationStop ライフサイクルイベントを、インスタンスの終了前にアプリケーションを正常にシャットダウンするスクリプトにフックできます。

終了デプロイ中に が CodeDeploy 生成するライフサイクルイベントのリストについては、「」を参照してくださいライフサイクルイベントフックの可用性

何らかの理由で終了デプロイが失敗した場合、 CodeDeploy はインスタンスの終了を続行することを許可します。つまり、 はライフサイクルイベントの完全なセット (またはいずれか) を完了まで実行しなくても、インスタンスはシャットダウン CodeDeployされます。

終了デプロイを有効にしない場合、Auto Scaling サービスはスケールインイベントが発生したときに Amazon EC2 インスタンスを終了しますが、ライフサイクルイベント CodeDeploy は生成されません。

注記

終了デプロイを有効にするかどうかにかかわらず、 CodeDeploy デプロイの進行中に Auto Scaling サービスが Amazon EC2 インスタンスを終了すると、Auto Scaling と CodeDeploy サービスによって生成されたライフサイクルイベント間に競合状態が発生する可能性があります。例えば、Terminatingライフサイクルイベント (Auto Scaling サービスによって生成) は、ApplicationStartイベント ( CodeDeploy デプロイによって生成) を上書きする場合があります。このシナリオでは、Amazon EC2 インスタンスの終了または CodeDeploy デプロイで障害が発生する可能性があります。

CodeDeploy で終了デプロイを実行するには

終了フックをインストールすると、次のようにスケールイン (終了) イベントが展開されます。

  1. Auto Scaling サービス (または単に Auto Scaling) は、スケールアウトイベントが発生する必要があると判断すると、EC2 サービスに連絡して EC2 インスタンスを終了します。

  2. EC2 サービスが EC2 インスタンスの終了を開始します。インスタンスは、Terminating 状態へ、その後 Terminating:Wait 状態へと移行します。

  3. Terminating:Wait、Auto Scaling は、 によってインストールされた終了フックを含め、Auto Scaling グループにアタッチされたすべてのライフサイクルフックを実行します CodeDeploy。

  4. 終了フックは、 によってポーリングされる Amazon SQS キューに通知を送信します CodeDeploy。

  5. 通知を受信すると、 はメッセージを CodeDeploy 解析し、いくつかの検証を実行し、終了デプロイ を実行します。

  6. 終了デプロイの実行中に、 は 5 分ごとにハートビートを Auto Scaling CodeDeploy に送信し、インスタンスがまだ処理中であることを知らせます。

  7. これまでのところ、EC2 インスタンスは Terminating:Wait 状態 (Auto Scaling グループのウォームプールを有効にしている場合は、Warmed:Pending:Wait 状態) のままです。

  8. デプロイが完了すると、終了デプロイが成功したか失敗したかに関係なく、 CONTINUEは EC2 終了プロセスに CodeDeploy Auto Scaling を示します。

Amazon EC2 Auto Scaling と の連携方法 CodeDeploy

CodeDeploy デプロイグループを作成または更新して Auto Scaling グループを含めると、 CodeDeploy は CodeDeploy サービスロールを使用して Auto Scaling グループにアクセスし、Auto Scaling ライフサイクルフックを Auto Scaling グループにインストールします。

注記

Auto Scaling ライフサイクルフックは、このガイドAppSpec 「フック」セクションの で生成 CodeDeploy され、説明されているライフサイクルイベント (ライフサイクルイベントフックとも呼ばれます) とは異なります。

CodeDeploy をインストールする Auto Scaling ライフサイクルフックは次のとおりです。

  • 起動フック — このフックは、Auto Scaling スケールアウトイベントが進行中であり、起動デプロイを開始 CodeDeploy する必要がある CodeDeploy ことを通知します。

    起動デプロイ中: CodeDeploy

    • アプリケーションのリビジョンを、スケールアウトされたインスタンスにデプロイします。

    • デプロイの進行状況を示すライフサイクルイベントを生成します。これらのライフサイクルイベントを独自のスクリプトにフックして、カスタム起動機能を有効にすることができます。詳細については、「ライフサイクルイベントフックの可用性」の表を参照してください。

    起動フックおよび関連する起動デプロイは常に有効になっており、無効にすることはできません。

  • 終了フック — このオプションのフックは、Auto Scaling スケールインイベントが進行中であり、終了デプロイを開始 CodeDeploy する必要がある CodeDeploy ことを通知します。

    終了デプロイ 中に、 はライフサイクルイベント CodeDeploy を生成して、インスタンスのシャットダウンの進行状況を示します。詳細については、「Auto Scaling スケールインイベント中の終了デプロイの有効化」を参照してください。

がライフサイクルフックをインストールした後 CodeDeploy、どのように使用されますか?

起動ライフサイクルフックと終了ライフサイクルフックをインストールすると、Auto Scaling グループのスケールアウトイベントとスケールインイベント CodeDeploy 中にそれぞれ によって使用されます。

スケールアウト (起動) イベントは次のように展開されます。

  1. Auto Scaling サービス (または単に Auto Scaling) は、スケールアウトイベントが発生する必要があると判断し、EC2 サービスに連絡して新しい EC2 インスタンスを起動します。

  2. EC2 サービスが、新しい EC2 インスタンスを起動します。インスタンスは、Pending 状態へ、その後 Pending:Wait 状態へと移行します。

  3. Pending:Wait、Auto Scaling は、 によってインストールされた起動フックを含め、Auto Scaling グループにアタッチされたすべてのライフサイクルフックを実行します CodeDeploy。

  4. 起動フックは、 によってポーリングされる Amazon SQS キューに通知を送信します CodeDeploy。

  5. 通知を受信すると、 はメッセージを CodeDeploy 解析し、いくつかの検証を実行し、起動デプロイ を開始します。

  6. 起動デプロイの実行中に、 は 5 分ごとにハートビートを Auto Scaling CodeDeploy に送信し、インスタンスがまだ処理中であることを知らせます。

  7. 今までのところ、EC2 インスタンスはなお Pending:Wait の状態です。

  8. デプロイが完了すると、デプロイが成功したか失敗したかに応じて、 ABANDONが CodeDeploy Auto Scaling に CONTINUEまたは EC2 起動プロセスを示します。

    • CodeDeploy が を示す場合CONTINUE、Auto Scaling は起動プロセスを続行し、他のフックが完了するのを待つか、インスタンスを 状態にPending:Proceedしてから InService状態にします。

    • CodeDeploy が を示す場合ABANDON、Auto Scaling は EC2 インスタンスを終了し、Auto Scaling の希望する容量設定で定義されているように、必要な数のインスタンスを満たすために必要に応じて起動手順を再起動します。

スケールイン (終了) イベントは次のように展開されます。

Auto Scaling スケールインイベント中の終了デプロイの有効化 を参照してください。

Amazon EC2 Auto Scaling グループ CodeDeploy の名前

EC2/オンプレミスコンピューティングプラットフォームでの Blue/Green のデプロイ中に代替 (Green) 環境にインスタンスを追加するには 2 つの方法があります。

  • 既存のインスタンス、または手動で作成したインスタンスを使用します。

  • 指定した Amazon EC2 Auto Scaling グループの設定を使用して、新しい Amazon EC2 Auto Scaling グループにインスタンスを定義および作成します。

2 番目のオプションを選択した場合、 は新しい Amazon EC2 Auto Scaling グループを CodeDeploy プロビジョニングします。以下の規則を使用して、グループに名前を付けます。

CodeDeploy_deployment_group_name_deployment_id

例えば、ID が「10」のデプロイによって「alpha-deployments」というデプロイグループがデプロイされる場合、 プロビジョンされる Amazon EC2 Auto Scaling グループの名前は CodeDeploy_alpha-deployments_10 になります。詳細については、EC2/オンプレミス Blue/Green デプロイ用のデプロイグループを作成する (コンソール)およびGreenFleetProvisioningOptionを参照してください。

カスタムライフサイクルフックイベントの実行順序

デプロイ先の Amazon EC2 Auto Scaling グループに独自のライフサイクルフックを追加できます CodeDeploy 。ただし、これらのカスタムライフサイクルフックイベントが実行される順序は、 CodeDeploy デフォルトのデプロイライフサイクルイベントに関連して事前に決定することはできません。例えば、 という名前のカスタムライフサイクルフックReadyForSoftwareInstallを Amazon EC2 Auto Scaling グループに追加すると、最初のデプロイライフサイクルイベントの前、または最後の CodeDeployデフォルトのデプロイライフサイクルイベントの後のどちらで実行されるか事前にわかりません。

Amazon EC2 Auto Scaling グループにカスタムライフサイクルフックを追加する方法については、[Amazon EC2 Auto Scaling ユーザーガイド] の「ライフサイクルフックの追加」を参照してください。

デプロイ中のスケールアップイベント

デプロイ中に Auto Scaling スケールアウトイベントが発生すると、新しいインスタンスが更新されて、最新のアプリケーションリビジョンではなく、前回デプロイしたアプリケーションリビジョンが反映されます。デプロイが成功すると、古いインスタンスと新しくスケールアウトされたインスタンスは異なるアプリケーションリビジョンを反映します。古いリビジョンを持つインスタンスを最新の状態に保つために、 CodeDeploy は、古いインスタンスを更新するためのフォローアップデプロイを (最初のインスタンスの直後に) 自動的に開始します。このデフォルトの動作を変更して、古い EC2 インスタンスが古いリビジョンに残るようにする場合は、「Automatic updates to outdated instances」を参照してください。

デプロイの実行中に Amazon EC2 Auto Scaling のスケールアウトプロセスを一時停止する場合は、 での負荷分散に使用されるcommon_functions.shスクリプトの設定を使用してこれを行うことができます CodeDeploy。HANDLE_PROCS=true の場合、デプロイ中は以下の Auto Scaling イベントが自動的に中断されます。

  • AZRebalance

  • AlarmNotification

  • ScheduledActions

  • ReplaceUnhealthy

重要

この機能は、 CodeDeployDefault.OneAtATime デプロイ設定でのみサポートされます。

Amazon EC2 Auto Scaling を使用する際のデプロイの問題を回避HANDLE_PROCS=trueするために を使用する方法の詳細については、「」の「 aws-codedeploy-samples AutoScaling の処理プロセスに関する重要な通知」を参照してください GitHub。 Auto Scaling

デプロイ中のスケールインイベント

Auto Scaling グループで CodeDeploy デプロイが進行中に Auto Scaling グループがスケールインを開始すると、終了プロセス ( CodeDeploy 終了デプロイライフサイクルイベントを含む) と終了インスタンスの他の CodeDeploy ライフサイクルイベントの間に競合状態が発生する可能性があります。すべての CodeDeploy ライフサイクルイベントが完了する前にインスタンスが終了すると、その特定のインスタンスへのデプロイが失敗することがあります。また、 CodeDeploy デプロイ設定で最小正常なホスト設定をどのように設定したかによっては、全体的なデプロイが失敗する場合と失敗しない場合があります。

AWS CloudFormation cfn-init スクリプトのイベントの順序

cfn-init (または cloud-init) を使用して新しくプロビジョニングした Linux ベースのインスタンスでスクリプトを実行する場合、インスタンスの開始後に発生するイベントの順序を厳密に制御しないと、デプロイは失敗することがあります。

次の順序に従う必要があります。

  1. 新しくプロビジョニングしたインスタンスが開始する。

  2. すべての cfn-init ブートストラップスクリプトが最後まで実行する。

  3. CodeDeploy エージェントが開始されます。

  4. 最新のアプリケーションリビジョンがインスタンスにデプロイされる。

イベントの順序が慎重に制御されていない場合、 CodeDeploy エージェントはすべてのスクリプトの実行が完了する前にデプロイを開始することがあります。

イベントの順序を制御するには、以下のベストプラクティスのいずれかを使用します。

  • cfn-init スクリプトを使用して CodeDeploy エージェントをインストールし、他のすべてのスクリプトの後に配置します。

  • CodeDeploy エージェントをカスタム AMI に含め、cfn-initスクリプトを使用して起動し、他のすべてのスクリプトの後に配置します。

cfn-init の使用方法については、AWS CloudFormation ユーザーガイド の「cfn-init」を参照してください。

および Amazon EC2 Auto Scaling での CodeDeployカスタム AMI の使用

Amazon EC2 Auto Scaling グループで新しい Amazon EC2 インスタンスを起動するとき、基本 AMI を指定するには 2 つのオプションがあります。

  • CodeDeploy エージェントがすでにインストールされている基本カスタム AMI を指定できます。エージェントが既にインストールされているため、このオプションはほかのオプションよりも迅速に新しい Amazon EC2 インスタンスを起動します。ただし、このオプションを使用すると、特に CodeDeploy エージェントが古くなっている場合に、Amazon EC2 インスタンスの初期デプロイが失敗する可能性が高まります。このオプションを選択した場合は、ベースカスタム AMI で CodeDeploy エージェントを定期的に更新することをお勧めします。

  • 新しいインスタンスが Amazon EC2 Auto Scaling グループで起動されるたびに、 CodeDeploy エージェントがインストールされていないベース AMI を指定し、エージェントをインストールできます。このオプションでは、ほかのオプションよりも新しい Amazon EC2 インスタンスの起動が遅くなりますが、インスタンスの最初のデプロイが成功する可能性は大きくなります。このオプションは、エージェントの最新バージョン CodeDeployを使用します。