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

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

CodeDeploy と Amazon EC2 Auto Scaling の統合

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

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

注記

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

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

Amazon EC2 Auto Scaling グループに CodeDeploy アプリケーションリビジョンをデプロイするには、次の手順を実行します。

  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 スケールインイベント中の終了デプロイの有効化

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

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

終了デプロイが何らかの理由で失敗した場合、CodeDeploy はインスタンスの終了を続行できるようにします。つまり、CodeDeploy がライフサイクルイベントの完全なセット (または一部) を最後まで実行しなかった場合でも、インスタンスはシャットダウンされます。

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

注記

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

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

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

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

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

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

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

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

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

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

  8. デプロイが完了すると、デプロイの成否にかかわらず、CodeDeploy は Auto Scaling に対して EC2 終了プロセスを CONTINUE するよう指示します。

Amazon EC2 Auto Scaling と CodeDeploy の連携

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

注記

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

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

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

    起動デプロイ中、CodeDeploy は、次のことを行います。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • CodeDeploy が CONTINUE を指示する場合、Auto Scaling は他のフックの完了を待機するか、インスタンスを Pending:Proceed 状態に、その後 InService 状態にします。

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

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

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

CodeDeploy による Amazon EC2 Auto Scaling グループの名前の設定方法

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

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

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

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

CodeDeploy_deployment_group_name_deployment_id

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

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

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

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

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

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

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

  • AZRebalance

  • AlarmNotification

  • ScheduledActions

  • ReplaceUnhealthy

重要

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

HANDLE_PROCS=true を使用して Amazon EC2 Auto Scaling 使用時のデプロイ問題を避ける方法の詳細については、GitHub の「aws-codedeploy」で「Important notice about handling AutoScaling processes」を参照してください。

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

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」を参照してください。

CodeDeploy と Amazon EC2 Auto Scaling でのカスタム AMI の使用

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

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

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