

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

# CodeDeploy と Amazon EC2 Auto Scaling の統合
<a name="integrations-aws-auto-scaling"></a>

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

Amazon EC2 Auto Scaling グループの一部として新しい Amazon EC2 インスタンスが起動されると、CodeDeploy ではリビジョンを新しいインスタンスに自動的にデプロイできます。また、Elastic Load Balancing ロードバランサーに登録された Amazon EC2 Auto Scaling インスタンスを使用して、CodeDeploy でのデプロイを調整できます。詳細については、「[CodeDeploy と Elastic Load Balancing の統合](integrations-aws-elastic-load-balancing.md)」および「[CodeDeploy Amazon EC2 デプロイ用の Elastic Load Balancing でロードバランサーをセットアップする](deployment-groups-create-load-balancer.md)」を参照してください。

**注記**  
複数のデプロイグループを 1 つの Amazon EC2 Auto Scaling グループに関連付けると、問題が発生する可能性があります。例えば、1 つのデプロイが失敗すると、インスタンスはシャットダウンを開始しますが、実行中の他のデプロイはタイムアウトに 1 時間かかる可能性があります。詳細については、「[複数のデプロイグループを 1 つの Amazon EC2 Auto Scaling グループに関連付けることは避ける](troubleshooting-auto-scaling.md#troubleshooting-multiple-depgroups)」そして「[内部構造: CodeDeploy と Amazon EC2 Auto Scaling の統合](https://aws.amazon.com/blogs/devops/under-the-hood-aws-codedeploy-and-auto-scaling-integration/)」を参照してください。

**Topics**
+ [CodeDeploy アプリケーションを Amazon EC2 Auto Scaling グループにデプロイする](#integrations-aws-auto-scaling-deploy)
+ [Auto Scaling スケールインイベント中の終了デプロイの有効化](#integrations-aws-auto-scaling-behaviors-hook-enable)
+ [Amazon EC2 Auto Scaling と CodeDeploy の連携](#integrations-aws-auto-scaling-behaviors)
+ [CodeDeploy と Amazon EC2 Auto Scaling でのカスタム AMI の使用](#integrations-aws-auto-scaling-custom-ami)

## CodeDeploy アプリケーションを Amazon EC2 Auto Scaling グループにデプロイする
<a name="integrations-aws-auto-scaling-deploy"></a>

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

1. Amazon EC2 Auto Scaling グループが Amazon S3 での作業を許可する IAM インスタンスプロファイルを作成または検索します。詳細については、「[ステップ 4: Amazon EC2 インスタンス用の IAM インスタンスプロファイルを作成する](getting-started-create-iam-instance-profile.md)」を参照してください。
**注記**  
また、CodeDeploy を使用して GitHub リポジトリから Amazon EC2 Auto Scaling グループにリビジョンをデプロイすることもできます。Amazon EC2 インスタンスで依然として IAM インスタンスプロファイルが必要な場合でも、GitHub リポジトリからデプロイするときは、プロファイルに追加のアクセス許可は不要です。

1. Amazon EC2 Auto Scaling グループを作成または使用し、起動設定またはテンプレートで、IAM インスタンスプロファイルを指定します。詳細については、「[Amazon EC2 インスタンスで実行されるアプリケーションに対する IAM ロール](https://docs.aws.amazon.com/autoscaling/ec2/userguide/us-iam-role.html)」を参照してください。

1. Amazon EC2 Auto Scaling グループを含むデプロイグループの作成を CodeDeploy に許可するサービスロールを作成または検索します。

1. CodeDeploy でデプロイグループを作成し、Amazon EC2 Auto Scaling グループ名、サービスロール、その他いくつかのオプションを指定します。詳細については、[インプレースデプロイ用のデプロイグループを作成する (コンソール)](deployment-groups-create-in-place.md)または[インプレースデプロイ用のデプロイグループを作成する (コンソール)](deployment-groups-create-in-place.md)を参照してください。

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

詳細については、「[チュートリアル: CodeDeploy を使用して、Auto Scaling グループにアプリケーションをデプロイします。](tutorials-auto-scaling-group.md)」を参照してください。

## Auto Scaling スケールインイベント中の終了デプロイの有効化
<a name="integrations-aws-auto-scaling-behaviors-hook-enable"></a>

*終了デプロイ*は、CodeDeploy デプロイの一種で、Auto Scaling [スケールインイベント](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html#as-lifecycle-scale-in)が発生すると、自動的にアクティブ化されます。CodeDeploy は、Auto Scaling サービスがインスタンスを終了する直前に終了デプロイを実行します。終了デプロイ中は、CodeDeploy は何もデプロイしません。代わりに、ライフサイクルイベントを生成します。これを独自のスクリプトにフックしてカスタムのシャットダウン機能を有効にすることができます。例えば、`ApplicationStop` ライフサイクルイベントを、インスタンスの終了前にアプリケーションを正常にシャットダウンするスクリプトにフックできます。

CodeDeploy が終了デプロイ中に生成するライフサイクルイベントのリストについては、「[ライフサイクルイベントフックの可用性](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-availability)」を参照してください。

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

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

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

**CodeDeploy で終了デプロイを実行できるようにするには**
+ デプロイグループを作成または更新するときに、**[Auto Scaling グループに終了フックを追加]** チェックボックスをオンにします。手順については、「[インプレースデプロイ用のデプロイグループを作成する (コンソール)](deployment-groups-create-in-place.md)」または「[EC2/オンプレミス Blue/Green デプロイ用のデプロイグループを作成する (コンソール)](deployment-groups-create-blue-green.md)」を参照してください。

  このチェックボックスを有効にすると、CodeDeploy は、CodeDeploy デプロイグループの作成時または更新時に指定した Auto Scaling グループに [Auto Scaling ライフサイクルフック](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)をインストールします。このフックは終了フックと呼ばれ、終了デプロイを有効にします。**

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

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

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

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

1. 終了フックは、CodeDeploy がポーリングする [Amazon SQS キュー](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)に通知を送信します。

1. 通知を受信すると、CodeDeploy はメッセージを解析し、いくつかの検証を実行して、[終了デプロイ](#integrations-aws-auto-scaling-behaviors-hook-enable)を実行します。

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

1. これまでのところ、EC2 インスタンスは `Terminating:Wait` 状態 ([Auto Scaling グループのウォームプール](https://docs.aws.amazon.com/autoscaling/ec2/userguide/warm-pool-instance-lifecycle.html)を有効にしている場合は、`Warmed:Pending:Wait` 状態) のままです。

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

## Amazon EC2 Auto Scaling と CodeDeploy の連携
<a name="integrations-aws-auto-scaling-behaviors"></a>

Auto Scaling グループを含むように CodeDeploy デプロイグループを作成または更新すると、CodeDeploy は CodeDeploy サービスロールを使用して Auto Scaling グループにアクセスし、[Auto Scaling ライフサイクルフック](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)を Auto Scaling グループにインストールします。

**注記**  
Auto Scaling ライフサイクルフックは、このガイドの「[AppSpec の「hooks」セクション](reference-appspec-file-structure-hooks.md)」で説明している、CodeDeploy によって生成されるライフサイクルイベント (ライフサイクルイベントフックとも呼ばれます) とは異なります。******

CodeDeploy がインストールする Auto Scaling ライフサイクルフックは次のとおりです。
+ **起動フック** — このフックは、Auto Scaling [スケールアウトイベント](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html#as-lifecycle-scale-out)が進行中であり、起動デプロイを開始する必要があることを CodeDeploy に通知します。

  起動デプロイ中、CodeDeploy は、次のことを行います。**
  + アプリケーションのリビジョンを、スケールアウトされたインスタンスにデプロイします。
  + デプロイの進行状況を示すライフサイクルイベントを生成します。これらのライフサイクルイベントを独自のスクリプトにフックして、カスタム起動機能を有効にすることができます。詳細については、「[ライフサイクルイベントフックの可用性](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-availability)」の表を参照してください。

  起動フックおよび関連する起動デプロイは常に有効になっており、無効にすることはできません。
+ **終了フック** — このオプションのフックは、Auto Scaling [スケールインイベント](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html#as-lifecycle-scale-in)が進行中であり、終了デプロイを開始する必要があることを CodeDeploy に通知します。

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

**Topics**
+ [CodeDeploy でインストールしたライフサイクルフックは、どのように使用されますか?](#integrations-aws-auto-scaling-behaviors-hook-usage)
+ [CodeDeploy による Amazon EC2 Auto Scaling グループの名前の設定方法](#integrations-aws-auto-scaling-behaviors-naming)
+ [カスタムライフサイクルフックイベントの実行順序](#integrations-aws-auto-scaling-behaviors-hook-order)
+ [デプロイ中のスケールアップイベント](#integrations-aws-auto-scaling-behaviors-mixed-environment)
+ [デプロイ中のスケールインイベント](#integrations-aws-auto-scaling-behaviors-scale-in)
+ [cfn-init AWS CloudFormation スクリプトのイベントの順序](#integrations-aws-auto-scaling-behaviors-event-order)

### CodeDeploy でインストールしたライフサイクルフックは、どのように使用されますか?
<a name="integrations-aws-auto-scaling-behaviors-hook-usage"></a>

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

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

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

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

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

1. 起動フックは、CodeDeploy がポーリングする [Amazon SQS キュー](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)に通知を送信します。

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

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

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

1. デプロイが完了すると、デプロイが成功したか失敗したかによって、CodeDeploy は Auto Scaling に EC2 起動プロセスを `CONTINUE` または `ABANDON` するよう指示を出します。
   + CodeDeploy が `CONTINUE` を指示する場合、Auto Scaling は他のフックの完了を待機するか、インスタンスを `Pending:Proceed` 状態に、その後 `InService` 状態にします。
   + CodeDeploy が `ABANDON` を指示する場合、Auto Scaling は EC2 インスタンスを終了し、また必要な数のインスタンスを満たす必要がある場合には、[Auto Scaling の **希望容量** の設定] で定義されているように、起動手順を再開します。

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

「[Auto Scaling スケールインイベント中の終了デプロイの有効化](#integrations-aws-auto-scaling-behaviors-hook-enable)」を参照してください。

### CodeDeploy による Amazon EC2 Auto Scaling グループの名前の設定方法
<a name="integrations-aws-auto-scaling-behaviors-naming"></a>

 

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 デプロイ用のデプロイグループを作成する (コンソール)](deployment-groups-create-blue-green.md) および「[GreenFleetProvisioningOption](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_GreenFleetProvisioningOption.html)」を参照してください。

### カスタムライフサイクルフックイベントの実行順序
<a name="integrations-aws-auto-scaling-behaviors-hook-order"></a>

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

Amazon EC2 Auto Scaling グループにカスタムライフサイクルフックを追加する方法については、[[Amazon EC2 Auto Scaling ユーザーガイド](https://docs.aws.amazon.com/autoscaling/latest/userguide/lifecycle-hooks.html#adding-lifecycle-hooks)] の「*ライフサイクルフックの追加*」を参照してください。

### デプロイ中のスケールアップイベント
<a name="integrations-aws-auto-scaling-behaviors-mixed-environment"></a>

デプロイ中に Auto Scaling スケールアウトイベントが発生すると、新しいインスタンスが更新されて、最新のアプリケーションリビジョンではなく、前回デプロイしたアプリケーションリビジョンが反映されます。デプロイが成功すると、古いインスタンスと新しくスケールアウトされたインスタンスは異なるアプリケーションリビジョンを反映します。古いリビジョンを持つインスタンスを最新の状態にするために、CodeDeploy は (最初のデプロイの直後に) 追加のデプロイを自動的に開始し、古いインスタンスを更新します。このデフォルトの動作を変更して、古い EC2 インスタンスが古いリビジョンに残るようにする場合は、「[Automatic updates to outdated instances](deployment-groups-configure-advanced-options.md#auto-updates-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](https://github.com/awslabs/aws-codedeploy-samples/tree/master/load-balancing/elb#important-notice-about-handling-autoscaling-processes)」で「[Important notice about handling AutoScaling processes](https://github.com/awslabs/aws-codedeploy-samples)」を参照してください。

### デプロイ中のスケールインイベント
<a name="integrations-aws-auto-scaling-behaviors-scale-in"></a>

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

### cfn-init AWS CloudFormation スクリプトのイベントの順序
<a name="integrations-aws-auto-scaling-behaviors-event-order"></a>

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

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

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

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

1. CodeDeploy エージェントが開始します。

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

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

イベントの順序を制御するには、以下のベストプラクティスのいずれかを使用します。
+ `cfn-init` スクリプトを通じて CodeDeploy エージェントをインストールし、他のすべてのスクリプトの後に配置します。
+ CodeDeploy エージェントをカスタム AMI に含め、`cfn-init` スクリプトを使用して起動します。エージェントは、他のすべてのスクリプトの後に配置します。

`cfn-init` の使用方法については、[AWS CloudFormation ユーザーガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html) の「*cfn-init*」を参照してください。

## CodeDeploy と Amazon EC2 Auto Scaling でのカスタム AMI の使用
<a name="integrations-aws-auto-scaling-custom-ami"></a>

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 エージェントの最新バージョンを使用します。