

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

# スケールイン中に終了する Auto Scaling インスタンスを制御する
<a name="as-instance-termination"></a>

Amazon EC2 Auto Scaling は終了ポリシーを使用して、インスタンスを終了する順序を決定します。事前定義されたポリシーを使用するか、ユーザー固有の要件を満たすカスタムポリシーを作成できます。カスタムポリシーまたはインスタンスのスケールイン保護を使用することで、Auto Scaling グループが、まだ終了する準備ができていないインスタンスを終了しないようにすることもできます。

**Topics**
+ [Amazon EC2 Auto Scaling が終了ポリシーを使用する場合](#common-scenarios-termination)
+ [Amazon EC2 Auto Scaling の終了ポリシーを設定する](ec2-auto-scaling-termination-policies.md)
+ [Lambda を使用したカスタム終了ポリシーを作成する](lambda-custom-termination-policy.md)
+ [インスタンスのスケールイン保護を使用してインスタンスの終了を制御する](ec2-auto-scaling-instance-protection.md)
+ [インスタンスの終了を的確に処理するようにアプリケーションを設計する](gracefully-handle-instance-termination.md)

## Amazon EC2 Auto Scaling が終了ポリシーを使用する場合
<a name="common-scenarios-termination"></a>

以下のセクションでは、Amazon EC2 Auto Scaling が終了ポリシーを使用するシナリオについて説明します。

**Topics**
+ [スケールインイベント](#common-scenarios-termination-scale-in)
+ [インスタンスの更新](#common-scenarios-termination-instance-refreshes)
+ [アベイラビリティーゾーンの再調整](#common-scenarios-termination-rebalancing)

### スケールインイベント
<a name="common-scenarios-termination-scale-in"></a>

スケールインイベントは、Auto Scaling グループ の希望するキャパシティの新しい値が、グループの現在のキャパシティよりも低い場合にも発生します。

スケールインイベントは、次のシナリオで発生します。
+ 動的スケーリングポリシーを使用し、メトリクス値の変更の結果としてグループのサイズが小さくなる場合
+ スケジュールされたスケーリングを使用し、スケジュールされたアクションの結果としてグループのサイズが小さくなる場合
+ 手動でグループのサイズを縮小します。

次に、スケールインイベントがある場合に終了ポリシーを使用する方法の例を示します。

1. この例の Auto Scaling グループには、1 つのインスタンスタイプ、2 つのアベイラビリティーゾーン、2 つのインスタンスの希望するキャパシティーがあるとします。また、リソース使用率の増減時にインスタンスを追加および削除する、動的スケーリングポリシーもあります。このグループの 2 つのインスタンスは、次の図に示すように 2 つのアベイラビリティーゾーンに分散されます。  
![\[2 つのインスタンスを使用する基本的な Auto Scaling グループ。\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/termination-policy-default-diagram.png)

1. Auto Scaling グループがスケールアウトすると、Amazon EC2 Auto Scaling が新しいインスタンスを起動します。Auto Scaling グループには、次の図に示すように、2 つのアベイラビリティーゾーンに分散された 3 つのインスタンスがあります。  
![\[1 つのインスタンスでスケールアウトした後の Auto Scaling グループ。\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/termination-policy-default-2-diagram.png)

1. Auto Scaling グループがスケールインすると、Amazon EC2 Auto Scaling はインスタンスのいずれかを終了します。

1. グループに特定の終了ポリシーが割り当てられていない場合、Amazon EC2 Auto Scaling はデフォルトの終了ポリシーを使用します。2 つのインスタンスを含むアベイラビリティーゾーンを選択し、起動設定から起動されたインスタンス、異なる起動テンプレートから起動されたインスタンス、または現在の起動テンプレートの最も古いバージョンから起動されたインスタンスを終了します。インスタンスが同じテンプレートの同じバージョンから起動されている場合、Amazon EC2 Auto Scaling は次の課金時間に最も近いインスタンスを選択して終了します。  
![\[インスタンス 1 つのスケールインをした後の Auto Scaling グループ。\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/termination-policy-default-3-diagram.png)

### インスタンスの更新
<a name="common-scenarios-termination-instance-refreshes"></a>

Auto Scaling グループのインスタンスを更新するには、インスタンスの更新を開始します。インスタンスの更新中、Amazon EC2 Auto Scaling はグループのインスタンスを終了し、終了したインスタンスの置換インスタンスを起動します。Auto Scaling グループの終了ポリシーは、どのインスタンスを最初に置き換えるかを制御します。

### アベイラビリティーゾーンの再調整
<a name="common-scenarios-termination-rebalancing"></a>

Amazon EC2 Auto Scaling は、Auto Scaling グループに対して有効になっているアベイラビリティーゾーン全体でキャパシティーを均等に分散させます。これにより、アベイラビリティーゾーンの停止による影響を軽減できます。アベイラビリティーゾーン間でのキャパシティーの分散のバランスが崩れた場合、Amazon EC2 Auto Scaling は、有効なアベイラビリティーゾーン内でインスタンスが最も少ないインスタンスを起動し、他の場所でインスタンスを終了することによって、Auto Scaling グループを再分散します。終了ポリシーは、最初に終了を優先するインスタンスを制御します。

アベイラビリティーゾーン間でのインスタンスの分散のバランスが崩れる原因はいくつかあります。

インスタンスの削除  
Auto Scaling グループからインスタンスをデタッチ、スタンドバイにインスタンスを置くか、インスタンスを明示的に終了して希望するキャパシティーを減らし、代替インスタンスが起動しないようにすると、グループのバランスが崩れる可能性があります。この場合、 Amazon EC2 Auto Scaling は、アベイラビリティーゾーン間のバランスを再度取って不均衡を補います。

最初に指定したアベイラビリティーゾーンとは異なるアベイラビリティーゾーンの使用  
Auto Scaling グループを拡張して追加のアベイラビリティーゾーンを含めるか、使用するアベイラビリティーゾーンを変更した場合、Amazon EC2 Auto Scaling は新しいアベイラビリティーゾーンでインスタンスを起動し、他のゾーンでインスタンスを終了します。これにより、インスタンスがアベイラビリティーゾーンに均等に広がります。

可用性の停止  
可用性の停止はまれにしか発生しません。ただし、1 つのアベイラビリティーゾーンが使用できなくなってから回復すると、Auto Scaling グループでアベイラビリティーゾーン間で不均衡になる可能性があります。Amazon EC2 Auto Scaling はグループを徐々に再分散しようとしますが、再分散すると他のゾーンのインスタンスが終了する可能性があります。  
例えば、1 つのインスタンスタイプ、2 つのアベイラビリティーゾーン、2 つのインスタンスの希望するキャパシティーのある Auto Scaling グループがあるとします。1 つのアベイラビリティーゾーンで障害が発生した場合、Amazon EC2 Auto Scaling は正常なアベイラビリティーゾーンで新しいインスタンスを自動的に起動し、異常のあるアベイラビリティーゾーン内のインスタンスを置き換えます。異常なアベイラビリティーゾーンが正常な状態にその後戻ると、Amazon EC2 Auto Scaling はこのゾーンで新しいインスタンスを自動的に起動し、影響を受けないゾーンのインスタンスを終了します。

**注記**  
分散バランスを再調整する場合、Amazon EC2 Auto Scaling は再調整によってアプリケーションのパフォーマンスや可用性が低下しないように、古いインスタンスを終了する前に新しいインスタンスを起動します。  
Amazon EC2 Auto Scaling は、古いインスタンスを終了する前に新しいインスタンスの起動を試みるため、指定した最大キャパシティーまたはそれに近い状態になると、再分散アクティビティの処理が遅くなったり、完全に停止する可能性があります。この問題を回避するため、再分散アクティビティの間、グループに対して指定されている最大キャパシティーが一時的に 10% のマージン（または 1 インスタンスのマージンのどちらか大きい方）で増えます。このマージンは、グループが最大キャパシティーに達しているか、それに近い状態であり、ユーザーがゾーンの再設定をリクエストしたため、またはゾーンの可用性の問題を補正するために、グループの再分散が必要な場合にのみ追加されます。この追加キャパシティーは、グループの再分散に要する時間にわたってのみ提供されます。

# Amazon EC2 Auto Scaling の終了ポリシーを設定する
<a name="ec2-auto-scaling-termination-policies"></a>

終了ポリシーは、Amazon EC2 Auto Scaling が特定の順序でインスタンスを終了するために従う基準を指定します。デフォルトでは、Amazon EC2 Auto Scaling は、古い設定を使用しているインスタンスを最初に終了するように設計された終了ポリシーを使用します。終了ポリシーを変更して、最初に終了することが最も重要なインスタンスを制御できます。

Amazon EC2 Auto Scaling では、インスタンスを終了する際に、Auto Scaling グループに対して有効化されているアベイラビリティーゾーン間でバランスを維持しようとします。ゾーン間でのバランスを維持することは、終了ポリシーよりも優先されます。1 つのアベイラビリティーゾーンに他のアベイラビリティーゾーンよりも多くのインスタンスがある場合、Amazon EC2 Auto Scaling はまず、不均衡なゾーンに終了ポリシーを適用します。アベイラビリティーゾーンのバランスが取れている場合、すべてのゾーンに終了ポリシーが適用されます。

**Topics**
+ [デフォルトの終了ポリシーの仕組み](#default-termination-policy)
+ [デフォルトの終了ポリシーと混合インスタンスグループ](#default-termination-policy-mixed-instances-groups)
+ [事前定義された終了ポリシー](#predefined-termination-policies)
+ [Auto Scaling グループの終了ポリシーを変更する](custom-termination-policy.md)

**注記**  
Amazon EC2 Auto Scaling は、Auto Scaling グループによって異常と見なされないインスタンスにのみ終了ポリシーを適用します。その結果、Auto Scaling ヘルスチェックによって異常とマークされたインスタンスは、終了ポリシーの評価をバイパスします。  
詳細については、「[インスタンスの終了を的確に処理するようにアプリケーションを設計する](gracefully-handle-instance-termination.md)」を参照してください。

## デフォルトの終了ポリシーの仕組み
<a name="default-termination-policy"></a>

Amazon EC2 Auto Scaling がインスタンスを終了する場合、インスタンス数が最大で、スケールインから保護されていないインスタンスが 1 つ以上あるアベイラビリティーゾーンをまず特定します。次に、特定されたアベイラビリティーゾーン内の保護されていないインスタンスを次のように評価します。

**古い設定を使用するインスタンス**
+ **起動テンプレートを使用するグループの場合** – インスタンスのいずれかが古い設定を使用しているかどうかを、以下の優先順位で判断します。

  1. まず、起動設定で起動されたインスタンスを確認します。

  1. 次に、現在の起動テンプレートではなく、別の起動テンプレートを使用して起動されたインスタンスを確認します。

  1. 最後に、現在の起動テンプレートの最も古いバージョンを使用したインスタンスを確認します。
+ **起動設定を使用するグループの場合** – インスタンスのいずれかが最も古い起動設定を使用しているかどうかを判断します。

古い設定のインスタンスがない場合、または複数のインスタンスが古い設定の場合、Amazon EC2 Auto Scaling は次の課金時間に近いインスタンスという次の基準を考慮します。

**次の課金時間に近いインスタンス**  
前の基準を満たすインスタンスのいずれかが、次の課金時間に最も近いかどうかを判断します。複数のインスタンスの近さが同じ場合は、ランダムに 1 つ終了します。これによって、時間ごとに課金されるインスタンスを最大限に活用できます。ただし、ほとんどの EC2 使用量は 1 秒あたりの課金になったため、この最適化の利点は少なくなっています。詳細については「[Amazon EC2 料金](https://aws.amazon.com/ec2/pricing/)」を参照してください。

次のフロー図は、起動テンプレートを使用するグループでデフォルトの終了ポリシーがどのように機能するかを示しています。

![\[Auto Scaling グループがデフォルトの終了ポリシーを使用してインスタンスを終了する方法を示すフローチャート。\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/termination-policy-default-flowchart-diagram.png)


## デフォルトの終了ポリシーと混合インスタンスグループ
<a name="default-termination-policy-mixed-instances-groups"></a>

Amazon EC2 Auto Scaling は、[混合インスタンスグループ](ec2-auto-scaling-mixed-instances-groups.md)のインスタンスを終了するときに追加の基準を適用します。

Amazon EC2 Auto Scaling がインスタンスを終了する必要がある場合、まず、終了することが適切な購入オプション (スポットまたはオンデマンド) をグループの設定に基づいて特定します。これにより、グループが時間の経過とともに傾向として、スポットインスタンスとオンデマンドインスタンスが指定された比率になるようにできます。

次に、各アベイラビリティーゾーン内で独立に終了ポリシーを適用します。アベイラビリティーゾーンのバランスを維持するために、終了するアベイラビリティーゾーンで、スポットインスタンスかオンデマンドインスタンスかを決定します。インスタンスタイプに定義された重みを持つ混合インスタンスグループにも同じロジックが適用されます。

各ゾーン内で、デフォルトの終了ポリシーは次のように動作して、特定された購入オプション内でどの保護されていないインスタンスを終了できるかを決定します。

1. Auto Scaling グループの指定された[割り当て戦略](allocation-strategies.md)との整合性を向上させるために、いずれかのインスタンスを終了できるかどうかを決定します。最適化するインスタンスが特定されない場合、または複数のインスタンスから選択できる場合は、評価が続行されます。

1. いずれかのインスタンスが古い設定を使用しているかどうかを次の優先順序で判断します。

   1. まず、起動設定で起動されたインスタンスを確認します。

   1. 次に、現在の起動テンプレートではなく、別の起動テンプレートを使用して起動されたインスタンスを確認します。

   1. 最後に、現在の起動テンプレートの最も古いバージョンを使用したインスタンスを確認します。

   古い設定のインスタンスがない場合、または複数のインスタンスから選択できる場合は、評価が続行されます。

1. いずれかのインスタンスが次の課金時間に最も近いかどうかを判断します。複数のインスタンスの近さが同じ場合は、ランダムに 1 つ選択します。

## 事前定義された終了ポリシー
<a name="predefined-termination-policies"></a>

次の事前定義された終了ポリシーから選択します。
+ **`Default`** – デフォルトの終了のポリシーに従って、インスタンスを終了します。
+ **`AllocationStrategy`** – Auto Scaling グループのインスタンスを終了して、残りのインスタンスを、終了するインスタンスのタイプ (スポットインスタンスまたはオンデマンドインスタンス) の配分戦略に合わせます。このポリシーは、優先するインスタンスタイプが変更されたときに便利です。スポット配分戦略が `lowest-price` の場合、N 個の最低価格のスポットプール間で、スポットインスタンスの分散バランスを徐々に再調整できます。スポット配分戦略が `capacity-optimized` の場合、使用可能なスポットキャパシティーがより多いスポットプール間で、スポットインスタンスの分散バランスを徐々に再調整できます。優先度の低いタイプのオンデマンドインスタンスを優先度の高いタイプのオンデマンドインスタンスに徐々に置き換えることもできます。
+ **`OldestLaunchTemplate`** – 最も古い起動テンプレートを使用するインスタンスを終了します。このポリシーでは、現在の起動テンプレートを使用していないインスタンスが最初に終了され、その後、現在の起動テンプレートのうち最も古いバージョンを使用しているインスタンスが終了されます。このポリシーは、グループを更新し、以前の設定を使用しているインスタンスを廃止する場合に便利です。
+ **`OldestLaunchConfiguration`** – 最も古い起動設定のインスタンスを終了します。このポリシーは、グループを更新し、以前の設定を使用しているインスタンスを廃止する場合に便利です。このポリシーでは、最新以外の起動設定を使用するインスタンスが最初に終了されます。
+ **`ClosestToNextInstanceHour`** – 次の課金時間に最も近いインスタンスを終了します。これにより、時間単価のインスタンスを最大限に活用できます。
+ **`NewestInstance`** – グループ内の最も新しいインスタンスを終了します。このポリシーは、新しい起動設定をテストするが、新しい設定は本稼働環境には保持しない場合に便利です。
+ **`OldestInstance`** – グループ内の最も古いインスタンスを終了します。このオプションは、Auto Scaling グループ内のインスタンスを新しい EC2 インスタンスタイプにアップグレードする場合に役立ちます。より古いタイプのインスタンスをより新しいタイプのインスタンスに徐々に置き換えることができます。
**注記**  
Amazon EC2 Auto Scaling は、どの終了ポリシーが使用されているかに関係なく、まずアベイラビリティーゾーン間でインスタンスのバランスをとります。その結果、いくつかの新しいインスタンスが古いインスタンスの前に終了される状況が発生する可能性があります。例えば、最近追加されたアベイラビリティーゾーンがある場合、グループに使用されている他のアベイラビリティーゾーンより多くのインスタンスが含まれるアベイラビリティーゾーンがある場合。

# Auto Scaling グループの終了ポリシーを変更する
<a name="custom-termination-policy"></a>

Auto Scaling グループの終了ポリシーを変更するには、次のいずれかの方法を使用します。

------
#### [ Console ]

Amazon EC2 Auto Scaling コンソールで Auto Scaling グループを初めて作成するときには、終了ポリシーを変更できません。デフォルトの終了ポリシーが自動的に使用されます。Auto Scaling グループを作成したら、デフォルトのポリシーを、別の終了ポリシー、または適用する順序で並んでいる複数の終了ポリシーに置き換えることができます。

**Auto Scaling グループの終了ポリシーを変更するには**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) でAmazon EC2 コンソールを開き、ナビゲーションペインで [**Auto Scaling グループ**] を選択します。

1. Auto Scaling グループの横にあるチェックボックスを選択します。

   ページの下部にスプリットペインが開きます。

1. [**詳細**] タブで、[**高度な設定**]、[**編集**] の順に選択します。

1. [**終了ポリシー**] で、1 つまたは複数の終了ポリシーを選択します。複数のポリシーを選択する場合は、適用する順に合わせて選択していきます。

   オプションで、**[Custom termination policy]** (カスタム終了ポリシー) を選択した後、ニーズを満たす Lambda 関数を選択することもできます。Lambda 関数のために作成したバージョンとエイリアスがある場合は、**バージョン/エイリアス** ドロップダウンリストから、いずれかのバージョンとエイリアスを選択します。Lambda 関数の未公開バージョンを使用する場合には、**[Version/Alias]** (バージョン/エイリアス) の設定はデフォルトのままにします。詳細については、「[Lambda を使用したカスタム終了ポリシーを作成する](lambda-custom-termination-policy.md)」を参照してください。
**注記**  
複数のポリシーを使用する場合は、その順序を正しく設定する必要があります。  
**[Default]** (デフォルト) のポリシーを使用する場合は、リストの末尾にあるポリシーを選択する必要があります。
**[Custom termination policy]** (カスタム終了ポリシー) を使用する場合には、リストの最初にあるポリシーを選択します。

1. **[更新]** を選択します。

------
#### [ AWS CLI ]

別のポリシーが指定されていない限り、デフォルトの終了ポリシーが自動的に使用されます。

**Auto Scaling グループの終了ポリシーを変更するには**  
以下のいずれかのコマンドを使用します。
+ [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)
+ [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)

終了ポリシーを個別に使用することも、ポリシーのリストに組み合わせることもできます。例えば、次のコマンドを使用して、最初に `OldestLaunchConfiguration` ポリシーを使用し、その後で `ClosestToNextInstanceHour` ポリシーを使用するように Auto Scaling グループを更新します。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg --termination-policies "OldestLaunchConfiguration" "ClosestToNextInstanceHour"
```

`Default` の終了ポリシーを使用する場合、終了ポリシーのリストでは最後のポリシーになるように指定します。例えば、`--termination-policies "OldestLaunchConfiguration" "Default"`。

カスタム終了ポリシーを使用するには、まず を使用して終了ポリシーを作成する必要があります AWS Lambda。終了ポリシーとして使用する Lambda 関数を指定するには、終了ポリシーのリストで最初の関数を使用します。例えば、`--termination-policies "arn:aws:lambda:us-west-2:123456789012:function:HelloFunction:prod" "OldestLaunchConfiguration"` です。詳細については、「[Lambda を使用したカスタム終了ポリシーを作成する](lambda-custom-termination-policy.md)」を参照してください。

------

# Lambda を使用したカスタム終了ポリシーを作成する
<a name="lambda-custom-termination-policy"></a>

Amazon EC2 Auto Scaling は、終了ポリシーを使用して、Auto Scaling グループのサイズを小さくするときに、最初に終了するインスタンスを優先順位付けします (*スケールイン*と言います)。Auto Scaling グループではデフォルトの終了ポリシーを使用しますが、独自の終了ポリシーを選択または作成することもできます。定義済みの終了ポリシーを選択する方法の詳細については、「[Amazon EC2 Auto Scaling の終了ポリシーを設定する](ec2-auto-scaling-termination-policies.md)」を参照してください。

このトピックでは、カスタム終了ポリシーを作成する方法について説明し、Amazon EC2 Auto Scaling が特定のイベントに応答して呼び出す AWS Lambda 関数を使用します。作成した Lambda 関数は、Amazon EC2 Auto Scaling から送信された入力データの情報を処理し、終了する準備ができているインスタンスのリストを返します。

カスタム終了ポリシーを使用すると、終了するインスタンスとタイミングをより適切に制御できます。例えば、Auto Scaling グループがスケールインする場合、Amazon EC2 Auto Scaling は中断すべきではない実行中のワークロードがあるかどうかを判断できません。Lambda 関数を使用すると、終了リクエストを検証し、ワークロードが完了するまで待機してから、終了するためにインスタンス ID を Amazon EC2 Auto Scaling に返して終了することができます。

**Topics**
+ [入力データ](#lambda-custom-termination-policy-input-data)
+ [レスポンスデータ](#lambda-custom-termination-policy-response-data)
+ [考慮事項](#lambda-termination-policy-considerations)
+ [Lambda 関数を作成する](#lambda-custom-termination-policy-create-function)
+ [制限事項](#lambda-custom-termination-policy-limitations)

## 入力データ
<a name="lambda-custom-termination-policy-input-data"></a>

Amazon EC2 Auto Scaling は、スケールインイベントの JSON ペイロードを生成します。また、インスタンスの最大有効期間またはインスタンスの更新機能の結果としてインスタンスが終了されるときにもこれを行います。また、アベイラビリティーゾーン間でグループのバランスを再調整するときに開始できるスケールインイベントの JSON ペイロードも生成します。

このペイロードには、Amazon EC2 Auto Scaling の終了に必要なキャパシティー、終了を提案するインスタンスのリスト、終了を開始したイベントに関する情報が含まれます。

次にペイロードの例を示します。

```
{
  "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-1:<account-id>:autoScalingGroup:d4738357-2d40-4038-ae7e-b00ae0227003:autoScalingGroupName/my-asg",
  "AutoScalingGroupName": "my-asg",
  "CapacityToTerminate": [
    {
      "AvailabilityZone": "us-east-1b",
      "Capacity": 2,
      "InstanceMarketOption": "on-demand"
    },
    {
      "AvailabilityZone": "us-east-1b",
      "Capacity": 1,
      "InstanceMarketOption": "spot"
    },
    {
      "AvailabilityZone": "us-east-1c",
      "Capacity": 3,
      "InstanceMarketOption": "on-demand"
    }
  ],
  "Instances": [
    {
      "AvailabilityZone": "us-east-1b",
      "InstanceId": "i-0056faf8da3e1f75d",
      "InstanceType": "t2.nano",
      "InstanceMarketOption": "on-demand"
    },
    {
      "AvailabilityZone": "us-east-1c",
      "InstanceId": "i-02e1c69383a3ed501",
      "InstanceType": "t2.nano",
      "InstanceMarketOption": "on-demand"
    },
    {
      "AvailabilityZone": "us-east-1c",
      "InstanceId": "i-036bc44b6092c01c7",
      "InstanceType": "t2.nano",
      "InstanceMarketOption": "on-demand"
    },
    ...
  ],
  "Cause": "SCALE_IN"
}
```

ペイロードには、Auto Scaling グループの名前、その Amazon リソースネーム (ARN)、および次の要素が含まれます:
+ `CapacityToTerminate` は、特定のアベイラビリティーゾーンで終了するように設定されたスポットまたはオンデマンドのキャパシティーを示します。
+ `Instances` は、Amazon EC2 Auto Scaling が「`CapacityToTerminate`」の情報に基づいて、終了を提案するインスタンスを表します。
+ `Cause` は、終了の原因となったイベントである `SCALE_IN`、`INSTANCE_REFRESH`、`MAX_INSTANCE_LIFETIME`、`REBALANCE` を示します。

以下の情報は、Amazon EC2 Auto Scaling が入力データ `Instances` を生成する方法において最も重要な要因の概略を説明する
+ スケールインイベントおよびインスタンスの更新に基づく終了によってインスタンスが終了する場合は、アベイラビリティーゾーン間のバランスを維持することが優先されます。そのため、グループに使用されている他のアベイラビリティーゾーンより多くのインスタンスが含まれるアベイラビリティーゾーンがある場合、入力データのインスタンスはそのバランスのとれていないアベイラビリティーゾーンのみからインスタンスに適用されます。グループに使用されているアベイラビリティーゾーンのバランスがとれている場合、入力データにはグループのすべてのアベイラビリティーゾーンのインスタンスが含まれます。
+ [混合インスタンスポリシー](ec2-auto-scaling-mixed-instances-groups.md)を使用する場合、各購入オプションの希望する割合に基づいて、スポットおよびオンデマンドのキャパシティーをバランスよく維持することも優先されます。まず、2 つのタイプ (スポットまたはオンデマンド) のどちらを終了すべきかを識別します。次に、アベイラビリティーゾーンのバランスが最も高い結果となるアベイラビリティーゾーンを終了できるインスタンス (特定された購入オプション内) を特定します。

## レスポンスデータ
<a name="lambda-custom-termination-policy-response-data"></a>

入力データと応答データが連携して、終了するインスタンスのリストを絞り込みます。

指定された入力では、Lambda 関数からの応答は次の例のようになります。

```
{
  "InstanceIDs": [
    "i-02e1c69383a3ed501",
    "i-036bc44b6092c01c7",
    ...
  ]
}
```

`InstanceIDs` は、終了する準備ができているインスタンスを表します。

または、終了する準備ができている別のインスタンスのセットを返すこともできます。これにより、入力データのインスタンスが上書きされます。Lambda 関数が呼び出されたときに終了する準備ができていない場合は、インスタンスを返さないように選択することもできます。

終了する準備ができているインスタンスがない場合、Lambda 関数からの応答は次の例のようになります。

```
{
  "InstanceIDs": [ ]
}
```

## 考慮事項
<a name="lambda-termination-policy-considerations"></a>

カスタム終了ポリシーを使用する場合、次の点を考慮してください。
+ レスポンスデータで最初にインスタンスを返しても、その終了は保証されません。Lambda 関数が呼び出されたときに必要な数を超えるインスタンスが返された場合、Amazon EC2 Auto Scaling は、Auto Scaling グループに対して指定した他の終了ポリシーに対して各インスタンスを評価します。複数の終了ポリシーがある場合、リスト内の次の終了ポリシーを適用しようとします。終了に必要な数を超えるインスタンスがある場合は、次の終了ポリシーに移ります。他の終了ポリシーが指定されていない場合は、デフォルトの終了ポリシーを使用して、終了するインスタンスを決定します。
+ インスタンスが返されない場合、または Lambda 関数がタイムアウトした場合、Amazon EC2 Auto Scaling は関数を再度呼び出す前に少し待機します。スケールインイベントでは、グループの希望するキャパシティが現在のキャパシティよりも小さい限り、試行を続けます。例えば、リフレッシュベースの終了の場合、1 時間試行し続けます。その後、インスタンスの終了に失敗し続けると、インスタンスの更新操作は失敗します。インスタンスの最大有効期間では、Amazon EC2 Auto Scaling は、その最大有効期間を超えていると識別されたインスタンスを終了しようとします。
+ 関数は繰り返し再試行されるため、Lambda 関数をカスタム終了ポリシーとして使用する前に、コード内の永続的なエラーをテストして修正してください。
+ 終了するインスタンスの独自のリストで入力データを上書きし、これらのインスタンスを終了してアベイラビリティーゾーンのバランスが崩れると、Amazon EC2 Auto Scaling はアベイラビリティーゾーン間のキャパシティーの分散を徐々に再調整します。まず、Lambda 関数を呼び出して、リバランシングを開始するかどうかを判断できるように、終了する準備ができているインスタンスがあるかどうかを確認します。終了する準備ができているインスタンスがある場合、最初に新しいインスタンスを起動します。インスタンスの起動が完了すると、グループの現在のキャパシティが希望するキャパシティよりも大きいことが検出され、スケールインイベントが開始されます。
+ スケールイン保護を使用して特定のインスタンスが終了されないように保護する機能にカスタム終了ポリシーが影響をおよぼすことはありません。詳細については、「[インスタンスのスケールイン保護を使用してインスタンスの終了を制御する](ec2-auto-scaling-instance-protection.md)」を参照してください。
+ Lambda 関数がインスタンスを返さない場合、すべての終了が自動的に妨げられるわけではありません。Amazon EC2 Auto Scaling は、終了ポリシーに関係なく、Auto Scaling ヘルスチェックによって異常と見なされるインスタンスを引き続き終了します。

## Lambda 関数を作成する
<a name="lambda-custom-termination-policy-create-function"></a>

まず Lambda 関数を作成し、Auto Scaling グループの終了ポリシーで Amazon リソースネーム (ARN) を指定できるようにします。

**Lambda 関数を作成するには (コンソール)**

1. Lambda コンソールで [[Functions (関数)] ページ](https://console.aws.amazon.com/lambda/home#/functions)を開きます。

1. 画面の上部のナビゲーションバーで、Auto Scaling グループの作成時に使用したのと同じリージョンを選択します。

1. [**Create function (関数の作成)**] を選択し、[**Author from scratch (一から作成)**] を選択します。

1. [**基本的な情報**] の [**関数名**] に、関数の名前を入力します。

1. [**関数の作成**] を選択してください。関数のコードと設定に戻ります。

1. 関数をまだコンソールで開いている状態で、**関数コード**の下にエディタに貼り付けます。

1. **[デプロイ]** をクリックします。

1. 必要に応じて、Lambda 関数の公開バージョンを作成するには、[**Versions (バージョン)**] タブをクリックし、次に**新しいバージョンを発行します**。Lambda でのバージョニングの詳細については、*AWS Lambda デベロッパーガイド*の「[Lambda 関数のバージョン](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html)」を参照してください。

1. バージョンを公開することを選択した場合、このバージョンの Lambda 関数と関連付けるには [**Aliases (エイリアス)**] タブを選択します。Lambda のエイリアスの詳細については、*AWS Lambda デベロッパーガイド*の「[Lambda 関数のエイリアス](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html)」を参照してください。

1. 次に [**Configuration (設定)**] タブと [**Permissions (アクセス許可)**] を選択します。

1. [**Resource-based policy (リソースベースのポリシー)**] にスクロールダウンして [**アクセス許可の追加**] を選択します。リソースベースのポリシーを使用して、関数を呼び出すアクセス許可を、ポリシーで指定されているプリンシパルに付与します。この場合、プリンシパルは Auto Scaling グループに関連付けられている [Amazon EC2 Auto Scaling service-linked role](https://docs.aws.amazon.com/autoscaling/ec2/userguide/autoscaling-service-linked-role.html) です。

1. [**Policy statement (ポリシーステートメント)**] セクションで、権限を設定します。

   1. **AWS アカウント** を選択します。

   1. **Principal (プリンシパル)** で、例えば **arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling** といった呼び出しサービスにリンクされたロールの ARN を入力します。

   1. [**Action (アクション)**] で、[**lambda:InvokeFunction**] を選択します。

   1. [**Statement ID (ステートメント ID)**] に **AllowInvokeByAutoScaling** といった一意のステートメント ID を入力します。

   1. **[保存]** を選択します。

1. これらの指示に従った後、次のステップとして Auto Scaling グループの終了ポリしーの ARN を指定し続けます。詳細については、「[Auto Scaling グループの終了ポリシーを変更する](custom-termination-policy.md)」を参照してください。

**注記**  
Lambda 関数を開発する際の参考として使用できる例については、Amazon EC2 Auto Scaling の [GitHub リポジトリ](https://github.com/aws-samples/amazon-ec2-auto-scaling-group-examples)を参照してください。

## 制限事項
<a name="lambda-custom-termination-policy-limitations"></a>
+ Auto Scaling グループの終了ポリシーで指定できる Lambda 関数は 1 つだけです。複数の終了ポリシーが指定されている場合は、最初に Lambda 関数を指定する必要があります。
+ Lambda 関数を参照するには、修飾されていない ARN (サフィックスなし)、バージョンまたはエイリアスをサフィックスとして持つ修飾された ARN を使用します。修飾されていない ARN が使用されている場合 (例えば、`function:my-function`)、リソースベースのポリシーは、関数の未公開バージョンで作成する必要があります。修飾された ARN が使用されている場合 (例えば、`function:my-function:1` または `function:my-function:prod`)、リソースベースのポリシーは、その公開バージョンの関数に対して作成する必要があります。
+ `$LATEST` サフィックスで修飾された ARN を使用できません。`$LATEST` サフィックスで修飾された ARN を参照するカスタム終了ポリシーを追加すると、エラーが発生します。
+ 入力データで提供されるインスタンスの数は、30,000 インスタンスまでに制限されています。終了できるインスタンスが 30,000 個を超える場合、入力データには インスタンスの最大数が戻されることを示す `"HasMoreInstances": true` を示します。
+ Lambda 関数の最大実行時間は 2 秒 (2000 ミリ秒) です。ベストプラクティスとして、予想される実行時間に基づいて Lambda 関数のタイムアウト値を設定する必要があります。Lambda 関数のデフォルトのタイムアウトは 3 秒ですが、これを減らすことができます。
+ ランタイムが 2 秒の制限を超えると、ランタイムがこのしきい値を下回るまで、すべてのスケールインアクションが保留されます。ランタイムが一貫して長い Lambda 関数の場合、結果をキャッシュして後続の Lambda 呼び出し中に取得できるようにするなど、ランタイムを短縮する方法を見つけます。
+ クロスアカウントの Lambda 関数はサポートされていません。カスタム終了ポリシーとして使用される Lambda 関数は、Auto Scaling グループ AWS アカウント と同じ にある必要があります。このページの設定手順は、特に同一アカウント設定に焦点を当てています。
+ カスタム終了ポリシーは、異常なインスタンスには適用されません。異常なインスタンスは常に終了対象と見なされ、Lambda 関数は残りのインスタンスの終了順序のみを評価します。

# インスタンスのスケールイン保護を使用してインスタンスの終了を制御する
<a name="ec2-auto-scaling-instance-protection"></a>

インスタンスのスケールイン保護によって、Amazon EC2 Auto Scaling が終了できるインスタンスを制御できます。この機能の一般的なユースケースとしては、コンテナベースのワークロードのスケーリングがあります。詳細については、「[インスタンスの終了を的確に処理するようにアプリケーションを設計する](gracefully-handle-instance-termination.md)」を参照してください。

デフォルトでは、Auto Scaling グループを作成すると、インスタンスのスケールイン保護は無効になります。つまり、Amazon EC2 Auto Scaling はグループ内のすべてのインスタンスを終了できます。

Auto Scaling グループでスケールイン保護設定を有効化しインスタンスを起動すると、その直後からインスタンスの保護が開始されます。インスタンスのスケールイン保護は、インスタンスの状態が `InService` の場合に開始されます。その後、終了できるインスタンスを制御するには、Auto Scaling グループ内で個別インスタンスのスケールイン保護設定を無効にします。そうすることで、引き続き特定のインスタンスを望ましくない終了から保護できます。

**Topics**
+ [考慮事項](#instance-protection-considerations)
+ [Auto Scaling グループのスケールイン保護を変更する](#instance-protection-group)
+ [インスタンスのスケールイン保護を変更する](#instance-protection-instance)

## 考慮事項
<a name="instance-protection-considerations"></a>

インスタンスのスケールイン保護を使用する場合の考慮事項を次に示します。
+ Auto Scaling グループのすべてのインスタンスがスケールインから保護されている場合にスケールインイベントが発生すると、希望するキャパシティは減少します。ただし、Auto Scaling グループはインスタンスのスケールイン保護の設定が無効になるまで、必要な数のインスタンスを終了することはできません。で AWS マネジメントコンソール、スケールインイベントが発生したときに Auto Scaling グループ内のすべてのインスタンスがスケールインから保護されている場合、Auto Scaling グループの**アクティビティ履歴**に次のメッセージが含まれます。 `Could not scale to desired capacity because all remaining instances are protected from scale in.`
+ スケールインから保護されているインスタンスをデタッチすると、インスタンスのスケールイン保護の設定は失われます。インスタンスをグループに再度アタッチすると、グループの現在のインスタンスのスケールイン保護を受け継ぎます。Amazon EC2 Auto Scaling が新しいインスタンスを起動する、あるいはウォームプールから Auto Scaling グループにインスタンスを移動すると、そのインスタンスには、Auto Scaling グループでのインスタンスのスケールイン保護に関する設定が受け継がれます。
+ インスタンスのスケールイン保護は、次の状況から Auto Scaling インスタンスを保護することはできません。
  + インスタンスがヘルスチェックに失敗した場合のヘルスチェックの置換。詳細については、「[Auto Scaling グループでのインスタンスのヘルスチェック](ec2-auto-scaling-health-checks.md)」を参照してください。
  + スポットインスタンスの中断。キャパシティーが使用できなくなった場合、またはスポット料金が上限価格を超えた場合、スポットインスタンスは終了されます。
  + キャパシティブロック予約は終了します。Amazon EC2 は、スケールインから保護されていてもキャパシティブロックインスタンスを再利用します。
  + `terminate-instance-in-auto-scaling-group` コマンドによる手動での終了。詳細については、「[Auto Scaling グループのインスタンスを終了する (AWS CLI)](ec2-auto-scaling-scaling-manually.md#terminate-an-instance-aws-cli)」を参照してください。
  + Amazon EC2 コンソール、CLI コマンド、API オペレーションによる手動終了。Auto Scaling インスタンスを手動の終了から保護するには、Amazon EC2 の終了保護を有効にします。(この操作によって Amazon EC2 Auto Scaling によるインスタンスの終了や `terminate-instance-in-auto-scaling-group` コマンドによる手動終了は防止されません)。起動テンプレートで Amazon EC2 終了保護を有効にする方法については、「[詳細設定を使用して起動テンプレートを作成する](advanced-settings-for-your-launch-template.md)」を参照してください。

## Auto Scaling グループのスケールイン保護を変更する
<a name="instance-protection-group"></a>

Auto Scaling グループのインスタンスのスケールイン保護の設定は、有効または無効にすることができます。有効にすると、グループによって起動されたすべての新しいインスタンスで、インスタンスのスケールイン保護が有効になります。

Auto Scaling グループのこの設定を有効または無効にしても、既存のインスタンスには影響しません。

------
#### [ Console ]

**新しい Auto Scaling グループのスケールイン保護を有効にするには**  
Auto Scaling グループを作成するときに、**[グループサイズとスケーリングポリシーを設定する]** ページの **[インスタンスのスケールイン保護]** で、**[インスタンスのスケールイン保護を有効にする]** チェックボックスを選択します。

**既存のグループのスケールイン保護を有効または無効にするには**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) でAmazon EC2 コンソールを開き、ナビゲーションペインで [**Auto Scaling グループ**] を選択します。

1. Auto Scaling グループのチェックボックスを選択します。

   ページの下部にスプリットペインが開きます。

1. [**詳細**] タブで、[**高度な設定**]、[**編集**] の順に選択します。

1. **[インスタンスのスケールイン保護]** で、**[インスタンスのスケールイン保護を有効にする]** チェックボックスを選択または選択解除して、必要に応じてこのオプションを有効または無効にします。

1. **[更新]** を選択します。

------
#### [ AWS CLI ]

**新しい Auto Scaling グループのスケールイン保護を有効にするには**  
次の [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) コマンドを使用してインスタンスのスケールイン保護を有効にします。

```
aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg --new-instances-protected-from-scale-in ...
```

**既存のグループのスケールイン保護を有効にするには**  
次の [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html) コマンドを使用して、指定した Auto Scaling グループにインスタンスのスケールインの保護を有効にします。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg --new-instances-protected-from-scale-in
```

**既存のグループのスケールイン保護を無効にするには**  
次のコマンドを使用して、指定したグループのインスタンスのスケールイン保護を無効にします。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg --no-new-instances-protected-from-scale-in
```

------

## インスタンスのスケールイン保護を変更する
<a name="instance-protection-instance"></a>

デフォルトで、インスタンスは所属する Auto Scaling グループからインスタンスのスケールイン保護の設定を取得します。ただし、起動後に個々のインスタンスのスケールイン保護を有効または無効にできます。

------
#### [ Console ]

**インスタンスのスケールイン保護を有効または無効にするには**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) でAmazon EC2 コンソールを開き、ナビゲーションペインで [**Auto Scaling グループ**] を選択します。

1. Auto Scaling グループの横にあるチェックボックスを選択します。

   ページの下部にスプリットペインが開きます。

1. [**Instance management (インスタンス管理)**] タブの [**Instances (インスタンス)**] で、インスタンスを選択します。

1. インスタンスのスケールイン保護を有効にするには、[**Actions (アクション)**]、[**Set scale-in protection (スケールイン保護を設定)**] の順に選択します。プロンプトが表示されると、[**Set scale-in protection (スケールイン保護を設定)**] を選択します。

1. インスタンスのスケールイン保護を無効にするには、[**Actions (アクション)**]、[**Remove scale-in protection (スケールイン保護の削除)**] の順に選択します。プロンプトが表示されたら、[**Remove scale-in protection (スケールイン保護の削除)**] を選択します。

------
#### [ AWS CLI ]

**インスタンスのスケールイン保護を有効にするには**  
次の [set-instance-protection](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/set-instance-protection.html) コマンドを使用して、指定したインスタンスにおけるインスタンスのスケールインの保護を有効にします。

```
aws autoscaling set-instance-protection --instance-ids i-5f2e8a0d --auto-scaling-group-name my-asg --protected-from-scale-in
```

**インスタンスのスケールイン保護を無効にするには**  
次のコマンドを使用して、指定したインスタンスにおけるインスタンスのスケールイン保護を無効にします。

```
aws autoscaling set-instance-protection --instance-ids i-5f2e8a0d --auto-scaling-group-name my-asg --no-protected-from-scale-in
```

------

**注記**  
インスタンスのスケールイン保護は、例えば、誰かが Amazon EC2 コンソールまたは AWS CLIを使用してインスタンスを手動で終了する場合など、人為的なエラーが発生してもインスタンスが終了しないことを保証するものではないことに注意してください。インスタンスが誤って終了されないように保護するために、Amazon EC2 終了保護を使用します。ただし、終了保護とインスタンスのスケールイン保護が有効になっている場合でも、ヘルスチェックでインスタンスが異常であると判断された場合、またはグループ自体が誤って削除された場合、インスタンスストレージに保存されたデータが失われる可能性があります。あらゆる環境と同様に、ベスト・プラクティスは、データのバックアップを頻繁に行うこと、またはビジネス継続性要件に適している場合にいつでもバックアップすることです。

# インスタンスの終了を的確に処理するようにアプリケーションを設計する
<a name="gracefully-handle-instance-termination"></a>

 このトピックでは、Amazon EC2 Auto Scaling グループがまだ終了する準備ができていない Amazon EC2 インスタンスを終了できないようにするために使用できる機能について説明します。デフォルトでは、Auto Scaling はインスタンスで実行されているアプリケーションを可視化しません。アプリケーションが割り当てられたジョブを正常にシャットダウンまたは完了する前に、インスタンスを終了できます。これらの機能により、アプリケーションはインスタンスの終了前に進行中の作業、転送状態、またはクリーンアップを実行する時間を確保できます。アプリケーションの要件に応じて、個別または組み合わせて使用できます。

 これらの機能は、フリート内の各インスタンスが他のインスタンスとは異なるデータ、ジョブ、または状態を保持するステートフルワークロードに特に役立ちます。正常なシャットダウンなしでステートフルインスタンスを終了すると、長時間実行されるジョブが最初から再起動し、データの冗長性やデータ損失が減少し、進行中のトランザクションや計算が中断される可能性があります。ステートフルインスタンスを適切にシャットダウンするには、ワークロードをドレイン (現在割り当てられているすべてのジョブを完了する) するか、転送 (ジョブ、データ、または設定を別のアクティブなインスタンスに移動する) する必要があります。

**Topics**
+ [終了ライフサイクルフック](#gracefully-handle-instance-termination-lifecycle-hooks)
+ [インスタンスのスケールイン保護](#gracefully-handle-instance-termination-scale-in-protection)
+ [カスタム終了ポリシー](#gracefully-handle-instance-termination-custom-termination-policy)
+ [インスタンスライフサイクルポリシー](#gracefully-handle-instance-termination-instance-lifecycle-policy)
+ [終了を完全に停止する](#gracefully-handle-instance-termination-suspend-terminate)
+ [制限事項](#gracefully-handle-instance-termination-limitations)
+ [シナリオ例](#gracefully-handle-instance-termination-examples)

## 終了ライフサイクルフック
<a name="gracefully-handle-instance-termination-lifecycle-hooks"></a>

 終了ライフサイクルフックは、すでに終了対象として選択されている Amazon EC2 インスタンスの存続期間を延長します。インスタンスに現在割り当てられている進行中の作業を完了したり、進行状況を保存して別のインスタンスに転送したりするための追加の時間を提供します。

 多くのワークロードでは、終了ライフサイクルフックは、終了対象として選択されたインスタンスのアプリケーションを正常にシャットダウンするのに十分です。これはベストエフォート型のアプローチであり、終了ライフサイクルアクションが中止された場合に終了を防ぐために使用することはできません。ワークロードの終了ライフサイクルアクションの失敗に対する許容度が低い場合は、インスタンスを保持するように、終了ライフサイクルフックと組み合わせてインスタンスライフサイクル[ポリシー](https://docs.aws.amazon.com/autoscaling/ec2/userguide/instance-lifecycle-policy.html)を設定します。

 終了ライフサイクルフックを使用するには、インスタンスが終了対象として選択されているタイミングを知る必要があります。これを知るには 2 つの方法があります。


| オプション | 説明 | 最適なケース | ドキュメントへのリンク | 
| --- | --- | --- | --- | 
| インスタンス内 |  インスタンスメタデータサービス (IMDS) は、インスタンスのステータスをインスタンスから直接ポーリングできる安全なエンドポイントです。メタデータが Terminated で返された場合、インスタンスの終了がスケジュールされています。 |  インスタンスを終了する前に、インスタンスに対してアクションを実行する必要があるアプリケーション。 |  [ ターゲットライフサイクル状態を取得する ](https://docs.aws.amazon.com/autoscaling/ec2/userguide/retrieving-target-lifecycle-state-through-imds.html)  | 
| インスタンス外 |  インスタンスが終了する際に、イベント通知が生成されます。Amazon EventBridge、Amazon SQS、Amazon SNS、または を使用してルールを作成し、これらのイベント AWS Lambda をキャプチャし、Lambda 関数を使用して などのレスポンスを呼び出すことができます。 |  インスタンスの外部でアクションを実行する必要があるアプリケーション。 |  [ 通知ターゲットを設定する ](https://docs.aws.amazon.com/autoscaling/ec2/userguide/prepare-for-lifecycle-notifications.html#lifecycle-hook-notification-target)  | 

 ライフサイクルフックを使用するには、インスタンスの終了準備が完全に整うタイミングを知る必要もあります。Amazon EC2 Auto Scaling は、[CompleteLifecycleAction ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html) API コールを受信するか、タイムアウトが経過するまで、インスタンスを終了しません。

 デフォルトでは、インスタンスは終了ライフサイクルフックにより、引き続き 1 時間にわたって実行できます (ハートビートタイムアウト)。ライフサイクルアクションを完了するのに 1 時間では足りない場合は、デフォルトのタイムアウトを設定できます。ライフサイクルアクションが進行中の場合は、[RecordLifecycleActionHeartbeat ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_RecordLifecycleActionHeartbeat.html) API コールを使用してタイムアウトを延長できます。

 詳細については、「[Amazon EC2 Auto Scaling のライフサイクルフック](lifecycle-hooks.md)」を参照してください。

## インスタンスのスケールイン保護
<a name="gracefully-handle-instance-termination-scale-in-protection"></a>

 インスタンスのスケールイン保護を使用して、スケールインイベント中に終了するインスタンスを制御できます。特に、長時間実行されるジョブをアクティブに処理しているインスタンスが終了しないようにできます。たとえば、コンテナ化されたワークロードを実行する場合、すべてのインスタンスを保護し、現在またはスケジュールされたタスクがないインスタンスに対してのみ保護を削除することをお勧めします。インスタンスは、新しいジョブのポーリングを続行し、新しいジョブが割り当てられると保護を再度有効にできます。

 Auto Scaling グループレベルとインスタンスレベルでスケールイン保護を有効にできます。Auto Scaling グループレベルでスケールイン保護を有効にすると、新しいインスタンスのみが作成時に保護されます。既存のインスタンスでは、保護を個別に有効にできます。

 アプリケーションは、インスタンス自体、または各インスタンスを終了可能かどうかを管理する一元的なコントロールプレーンから保護を設定できます。[ SetInstanceProtection ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_SetInstanceProtection.html) へのバッチ呼び出しを可能にし、API スロットリングの問題を回避できるため、大規模なフリートや保護を頻繁に切り替える必要がある場合には、一元化されたアプローチをお勧めします。

 詳細については、「[インスタンスのスケールイン保護を使用してインスタンスの終了を制御する](ec2-auto-scaling-instance-protection.md)」を参照してください。

## カスタム終了ポリシー
<a name="gracefully-handle-instance-termination-custom-termination-policy"></a>

 インスタンスのスケールイン保護と同様に、カスタム終了ポリシーは、Amazon EC2 Auto Scaling グループが特定の EC2 インスタンスを終了しないようにするのに役立ちます。異常なインスタンスは、カスタム終了ポリシーに関係なく終了できます。

 Auto Scaling グループは、デフォルトの終了ポリシーを使用して、最初に終了する Amazon EC2 インスタンスを決定します。どのインスタンスを最初に終了するかをより詳細に制御したい場合は、Lambda 関数を使用してカスタム終了ポリシーを実装できます。Auto Scaling は、終了するインスタンスを選択する必要があるたびにこの関数を呼び出し、関数が返すインスタンスのみを終了します。関数がエラー、タイムアウト、または空のリストを返した場合、インスタンスが異常でない限り、Auto Scaling はインスタンスを終了しません。

 カスタム終了ポリシーは、アプリケーションがアイドル状態または安全に終了できるインスタンスを特定できる場合に役立ちます。これには通常、グループ全体のワークロードを追跡するコントロールプレーンが必要です。

 詳細については、「[Lambda を使用したカスタム終了ポリシーを作成する](lambda-custom-termination-policy.md)」を参照してください。

## インスタンスライフサイクルポリシー
<a name="gracefully-handle-instance-termination-instance-lifecycle-policy"></a>

 インスタンスライフサイクルポリシーは、終了ライフサイクルアクションが中止されたときの Amazon EC2 Auto Scaling の終了に対する保護を提供します。ライフサイクルフックのみとは異なり、インスタンスライフサイクルポリシーは、正常なシャットダウン手順が正常に完了しない場合にインスタンスが保持状態に移行するように設計されています。

 Auto Scaling が終了するインスタンスを選択すると、設定された終了ライフサイクルフックが呼び出され、アプリケーションは正常なシャットダウン手順を開始します。終了ライフサイクルアクションが で正常に完了すると`CONTINUE`、インスタンスは正常に終了します。ただし、何らかの理由で終了ライフサイクルアクションが中止された場合、インスタンスライフサイクルポリシーはインスタンスを終了ではなく保持状態に移行します。保持されたインスタンスは Auto Scaling グループの希望する容量にはカウントされないため、代替インスタンスは自動的に起動されます。[ TerminateInstanceInAutoScalingGroup ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html) API を使用して保持されたインスタンスを手動で終了するまで、保持されたインスタンスとその置き換えの両方に対して標準の Amazon EC2 料金が発生します。

 この機能を使用するには、`TerminateHookAbandon`保持トリガーを に設定してインスタンスライフサイクルポリシーと`retain`、少なくとも 1 つの終了ライフサイクルフックの両方を設定する必要があります。保持されたインスタンスには継続的な Amazon EC2 コストが発生し、手動アクションが必要なため、モニタリングは重要です。などの CloudWatch メトリクスを有効に`GroupTerminatingRetainedInstances`し、インスタンスが保持状態になったときに警告する CloudWatch アラームを作成する必要があります。

 詳細については、「[インスタンスライフサイクルポリシーを使用してインスタンスの保持を制御する](instance-lifecycle-policy.md)」を参照してください。

## 終了を完全に停止する
<a name="gracefully-handle-instance-termination-suspend-terminate"></a>

 Amazon EC2 Auto Scaling グループ内のすべての EC2 インスタンス終了を完全に制御する必要がある場合は、`Terminate`プロセスを中断します。 Amazon EC2 上記のオプションでサービスに必要なコントロールが提供されていない場合にのみ、このオプションを使用することをお勧めします。[ SuspendProcesses ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_SuspendProcesses.html) を呼び出して`Terminate`プロセスを停止することで、Auto Scaling が何らかの理由で終了を試みるのを防ぐことができます。ただし、[TerminateInstanceInAutoScalingGroup API ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html)へのユーザーリクエストによって開始されたものは除きます。

 詳細については、「[Amazon EC2 Auto Scaling プロセスの中断と再開](as-suspend-resume-processes.md)」を参照してください。

## 制限事項
<a name="gracefully-handle-instance-termination-limitations"></a>

**重要**  
 インスタンスの終了を適切に処理するように Amazon EC2 Auto Scaling でアプリケーションを設計する場合は、次の制限事項に注意してください。

### 異常なインスタンスが一部の保護をバイパスする
<a name="gracefully-handle-instance-termination-unhealthy-bypass"></a>

 インスタンスに異常がある場合、カスタム終了ポリシーまたはスケールイン保護が設定されていても、Amazon EC2 Auto Scaling はインスタンスの終了を開始します。Auto Scaling による異常なインスタンスの置き換えを防ぐ唯一の方法は`HealthCheck`、、`ReplaceUnhealthy`、または `Terminate`プロセスを停止することです。ライフサイクルフックとインスタンスライフサイクルポリシーを使用して、アプリケーションが正常にシャットダウンしたり、異常なインスタンスが終了する前に復旧する必要があるデータをコピーしたりできます。


| 機能 | 正常なインスタンスの制御 | 異常なインスタンスを制御する | 
| --- | --- | --- | 
| カスタム終了ポリシー | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/success_icon.png) はい | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/negative_icon.png) いいえ | 
| スケールイン保護 | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/success_icon.png) はい | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/negative_icon.png) いいえ | 
|  HealthCheck、ReplaceUnhealthy、または Terminateプロセスの停止  | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/success_icon.png) はい | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/success_icon.png) はい | 
| ライフサイクルフック | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/success_icon.png) はい | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/success_icon.png) はい | 
| インスタンスライフサイクルポリシー | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/success_icon.png) はい | ![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/success_icon.png) はい | 

### ライフサイクルフックだけでは、正常なシャットダウンは保証されません
<a name="gracefully-handle-instance-termination-hooks-no-guarantee"></a>

 デフォルトでは、終了ライフサイクルフックはベストエフォートベースで動作します。終了ライフサイクルアクションが中止された場合、Amazon EC2 Auto Scaling はインスタンスの即時終了に進みます。終了ライフサイクルフックをインスタンスライフサイクルポリシーと組み合わせて、終了ライフサイクルアクションが中止されたときにインスタンスを保持できます。この組み合わせでは、次のようになります。
+  終了ライフサイクルフックは、Auto Scaling がインスタンスの終了をトリガーし、設定された Elastic Load Balancing ロードバランサーからのドレインが完了した後、アプリケーションを適切にシャットダウンしようとします。
+  何らかの理由で終了ライフサイクルアクションが中止された場合、インスタンスは終了するのではなく、保持状態に移行します。
+  保持されたインスタンスは現在の Amazon EC2 状態のままであるため、シャットダウン手順を手動で完了したり、障害を調査したりできます。
+  保持されているインスタンスを手動で終了するには、必要なアクションを完了した後に [ TerminateInstanceInAutoScalingGroup ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html) API を呼び出します。

 詳細については、「[インスタンスライフサイクルポリシーを使用してインスタンスの保持を制御する](instance-lifecycle-policy.md)」を参照してください。

### 特定のインスタンス市場オプションは、制限付き通知で中断できます
<a name="gracefully-handle-instance-termination-spot-interruptions"></a>

 Auto Scaling グループでスポットインスタンスや割り込み可能キャパシティ予約などのインスタンス市場オプションを使用する場合、Amazon EC2 はいつでもインスタンスを中断して再利用できます。これらの中断は、以下を含むすべての Amazon EC2 Auto Scaling 保護メカニズムをバイパスします。
+ 終了ライフサイクルフック
+ インスタンスのスケールイン保護
+ カスタム終了ポリシー
+ インスタンスライフサイクルポリシー
+ 停止されたプロセス

 スポットインスタンスが中断通知を受け取ると、正常なシャットダウンタスクを実行するのに約 2 分かかります。終了ライフサイクルフックを使用してスポットインスタンスの中断に応答できますが、ライフサイクルフックがまだ進行中であっても、インスタンスは 2 分間の時間枠の終了時に強制的に終了します。インスタンスライフサイクルポリシーでも、スポットインスタンスの中断を防ぐことはできません。

 スポットインスタンスの中断の処理の詳細については、「Amazon EC2 ユーザーガイド」の[「スポットインスタンスの中断](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)」と「Amazon EC2 スポットのベストプラクティス」を参照してください。 [ Amazon EC2 ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-best-practices.html) *Amazon EC2 * 

### Amazon EC2 の直接終了はすべての保護をバイパスします
<a name="gracefully-handle-instance-termination-direct-ec2-api"></a>

 Amazon EC2 [TerminateInstances ](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TerminateInstances.html) API を使用して Auto Scaling グループ内のインスタンスを直接終了すると、終了はすべての Amazon EC2 Auto Scaling 保護メカニズムをバイパスします。

 設定した保護を尊重しながら Auto Scaling グループのインスタンスを終了するには、代わりに [ TerminateInstanceInAutoScalingGroup ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html) API を使用します。

## シナリオ例
<a name="gracefully-handle-instance-termination-examples"></a>

 Amazon EC2 Auto Scaling を使用する場合、Auto Scaling がユーザーに代わって処理するフリート管理の量と、EC2 インスタンスの終了決定に対して保持する直接制御の量を選択できます。インスタンスの終了がワークロードの機密性が高いほど、保持するコントロールが高くなります。次の例では、許容レベルと推奨設定が異なるワークロードについて説明します。

### 例 1: 分散データベースノード (低許容値)
<a name="gracefully-handle-instance-termination-example-database"></a>

 各 EC2 インスタンスがレプリケーション係数 3 でデータのパーティションを保持する分散データベースを実行します。同じパーティションのレプリカを保持する複数のインスタンスを紛失すると、データが失われたり、そのパーティションが使用できなくなる可能性があります。

 **課題:** Auto Scaling は、データが他のノードに再レプリケートされるよりも速くインスタンスを終了し、終了によってレプリケーション係数を維持するために必要な容量を下回る可能性があります。

次の設定を検討してください。
+  すべてのデータベース[インスタンスでインスタンスのスケールイン保護](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html)を有効にします。データが他の場所で安全にレプリケートされたことを確認した後にのみ、プログラムで削除します。
+  延長タイムアウトで[終了ライフサイクルフック](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)をインスタンスライフサイクルポリシーと組み合わせて設定し、データ転送を完了できるようにします。
+  インスタンス[メンテナンスポリシー](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-maintenance-policy.html)を最小正常率 100% に設定して、必要な容量を維持します。

### 例 2: 長時間実行されるジョブ処理 (中耐性)
<a name="gracefully-handle-instance-termination-example-job-processing"></a>

 長時間実行されるジョブの受信メッセージを収集する Amazon SQS キューがあります。新しいメッセージが到着すると、EC2 インスタンスはメッセージを取得し、処理に 3 時間かかるジョブを開始します。キューが大きくなると、Auto Scaling はスケーリングポリシーに基づいてインスタンスを追加します。キューが縮小すると、Auto Scaling はインスタンスを終了します。

 **チャレンジ:** Auto Scaling は、アイドル状態のインスタンスではなく、ジョブの処理に 3 時間かかるインスタンスを終了する場合があります。ジョブは別のインスタンスで再起動できますが、大幅な進行が失われます。

次の設定を検討してください。
+  最初にアイドルインスタンスの終了を優先する[カスタム終了ポリシー](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lambda-custom-termination-policy.html)を設定します。
+  [ 終了ライフサイクルフック](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)を使用して、進行中のジョブを完了できるようにします。
+  [ インスタンスがジョブを開始したときに、プログラムでインスタンスのスケールイン保護](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html)を有効にし、ジョブの完了時に削除します。

### 例 3: テスト環境のワーカーフリート (高耐性)
<a name="gracefully-handle-instance-termination-example-test"></a>

 自動テスト、CI/CD パイプラインジョブ、または開発ワークロードを実行する EC2 インスタンスのフリートを実行します。これらのワーカーインスタンスはキューからタスクをプルし、ジョブが失敗した場合にテスト結果を再生成できます。

 **課題:** スケールインイベント中にテストジョブが中断される場合がありますが、テストは影響なく再試行できるため、中断のない可用性ではなくコストとシンプルさを最適化する必要があります。

次の設定を検討してください。
+  [ 終了ライフサイクルフック](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)を使用して、処理中のリクエストを完了できるようにします。
+  コストをさらに削減するために、容量最適化配分戦略で[スポットインスタンス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html)を使用することを検討してください。