

# Amazon ECS タスクがスケールインイベントによって終了するのを防ぐ
<a name="task-scale-in-protection"></a>

Amazon ECS タスクスケールイン保護を使用すると、サービスの自動スケーリングまたはデプロイからのスケールインイベントによってタスクが終了されるのを防ぐことができます。

特定のアプリケーションでは、使用率が低いときやサービスのデプロイ中に、ミッションクリティカルなタスクがスケールインイベントによって終了されるのを防ぐメカニズムが必要です。例えば、次のようになります。
+ ビデオトランスコーディングジョブなどのキュー処理型の非同期アプリケーションでは、サービスの累積使用率が低い場合でも、一部のタスクは何時間も実行する必要があります。
+ あるゲームアプリケーションでは、ゲームサーバーは Amazon ECS タスクとして実行されますが、サーバー再起動時の起動待ち時間を短縮するため、すべてのユーザーがログアウトした場合でも実行を続ける必要があります。
+ 新しいコードバージョンをデプロイする場合、再処理にはコストがかかるため、タスクは実行し続ける必要があります。

サービスに属するタスクがスケールインイベントで終了されることを防ぐには、`ProtectionEnabled` 属性を `true` に設定します。`ProtectionEnabled` を true に設定すると、タスクはデフォルトで 2 時間保護されます。その後、保護期間は、`ExpiresInMinutes` 属性を使用してカスタマイズできます。タスクの保護期間は最短で 1 分間、最長で 2,880 分 (48 時間) です。AWS CLI を使用している場合は、`--protection-enabled` オプションを指定できます。

タスクが必要な作業を完了した後は、`ProtectionEnabled` 属性を `false` に設定して、以降のスケールインイベントによってタスクが終了されるようにできます。AWS CLI を使用している場合は、`--no-protection-enabled` オプションを指定できます。

## タスクスケールイン保護メカニズム
<a name="task-scale-in-protection-mechanisms"></a>

Amazon ECS コンテナエージェントエンドポイントまたは Amazon ECS API を使用して、タスクスケールイン保護を設定および取得できます。
+ **Amazon ECS コンテナエージェントエンドポイント**

  保護の必要性を自己判断できるタスクには、Amazon ECS コンテナエージェントエンドポイントを使用することをお勧めします。このアプローチは、キューベースのワークロードまたはジョブ処理ワークロードに使用します。

  コンテナが、例えば SQS メッセージを使用するなどして処理を開始すると、コンテナ内からタスクスケールイン保護のエンドポイントパス「`ProtectionEnabled`」を使用して `$ECS_AGENT_URI/task-protection/v1/state` 属性を設定できます。スケールインイベントの際、Amazon ECS はこのタスクを終了しません。タスクの処理が完了した後は、同じエンドポイントを使用して `ProtectionEnabled` 属性をクリアし、以降のスケールインイベントでタスクが終了されるようにできます。

  Amazon ECS コンテナエージェントエンドポイントの詳細については、「[Amazon ECS タスクスケールイン保護のエンドポイント](task-scale-in-protection-endpoint.md)」を参照してください。
+ **Amazon ECS API**

  アプリケーションにアクティブなタスクの状態を追跡するコンポーネントがある場合は、Amazon ECS API を使用してタスクスケールイン保護を設定および取得できます。`UpdateTaskProtection` を使用して、1 つ以上のタスクを保護対象としてマークします。`GetTaskProtection` を使用して保護ステータスを取得します。

  このアプローチの例としては、アプリケーションがゲームサーバーセッションを Amazon ECS タスクとしてホストしている場合が挙げられます。ユーザーがサーバー上のセッション (タスク) にログインすると、そのタスクを保護対象としてマークできます。ユーザーがログアウトした後は、サーバーのアイドル状態を維持することの要件に応じて、このタスク限定でクリアすることも、アクティブなセッションがなくなった同様のタスクについて定期的に保護をクリアすることもできます。

  詳細については、「*Amazon Elastic Container Service API リファレンス*」の「[UpdateTaskProtection](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateTaskProtection.html)」と「[GetTaskProtection](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_GetTaskProtection.html)」を参照してください。

両方のアプローチを組み合わせることができます。例えば、Amazon ECS エージェントエンドポイントを使用してコンテナ内からタスク保護を設定し、Amazon ECS API を使用して外部コントローラーサービスからタスク保護を削除するなどです。

## 考慮事項
<a name="task-scale-in-protection-considerations"></a>

タスクスケールイン保護を使用する前に、次の点を考慮してください。
+ タスクのスケールイン保護は、サービスからデプロイされたタスクでのみサポートされます。
+ タスクのスケールイン保護は、Amazon ECS マネージドインスタンスで実行されているサービスからデプロイされたタスクでサポートされます。
+ Amazon ECS エージェントには再試行メカニズムが組み込まれており、そのインターフェイスはよりシンプルであるため、Amazon ECS コンテナエージェントエンドポイントを使用することをお勧めします。
+ 既に保護がオンになっているタスクのために `UpdateTaskProtection` を呼び出すことで、タスクのスケールイン保護の有効期間をリセットできます。
+ タスクが必要な作業を完了するのに必要な時間を判断し、それに応じて `expiresInMinutes` プロパティを設定してください。保護の有効期限を必要以上に長く設定すると、コストが発生すると共に、新しいタスクのデプロイが遅れることになります。
+ Amazon ECS コンテナエージェント `1.65.0` 以降ではタスクのスケールイン保護がサポートされています。エージェントを最新バージョンに更新することで、古いバージョンのAmazon ECS コンテナエージェントを使用する Amazon EC2 インスタンスでこの機能のサポートを追加できます。詳細については、「[Amazon ECS コンテナエージェントをアップデートする](ecs-agent-update.md)」を参照してください。
+ デプロイに関する考慮事項:
  + サービスがローリングアップデートを使用する場合、新しいタスクは作成できますが、古いバージョンを実行しているタスクは、`protectionEnabled` がクリアされるか、または失効するまで終了しません。デプロイ設定の `maximumPercentage` パラメータは、古いタスクが保護されている場合でも新しいタスクを作成できるように値を調整できます。
  + ブルー/グリーン更新が適用されている場合、タスクに `protectionEnabled` があれば、保護されたタスクを含むブルーデプロイは削除されません。トラフィックは新しいタスクに振り分けられ、古いタスクは `protectionEnabled` がクリアされるか期限切れになったときのみ削除されます。CodeDeploy または CloudFormation の更新のタイムアウトによっては、デプロイがタイムアウトして、古いブルータスクが残っている場合があります。
  + CloudFormation を使用する場合、更新スタックのタイムアウトは 3 時間です。そのため、タスク保護を 3 時間以上設定すると、CloudFormation のデプロイで障害が発生してロールバックが発生する可能性があります。

    古いタスクが保護されている間、CloudFormation スタックは `UPDATE_IN_PROGRESS` を表示します。タスクのスケールイン保護が削除されるか、または 3 時間のウィンドウ内に失効する場合、デプロイは成功し、`UPDATE_COMPLETE` ステータスに移行します。デプロイが `UPDATE_IN_PROGRESS` のまま 3 時間以上滞っていると、デプロイは失敗して `UPDATE_FAILED` 状態が表示され、古いタスクセットにロールバックされてしまいます。
  + 保護されたタスクが原因でデプロイ (ローリングまたはブルー/グリーン) が定常状態に到達できない場合、Amazon ECS はサービスイベントを送信し、これによりユーザーは是正措置を講じることができます。タスクの保護ステータスを更新しようとする際に `DEPLOYMENT_BLOCKED` エラーメッセージが表示される場合、サービスの要求されるタスク数よりも多くの保護されたタスクがあることを意味します。この問題を解決するには、次のいずれかの操作を実行します。
    + 現在のタスク保護の有効期限が切れるのを待ちます。次に、タスク保護を設定します。
    + どのタスクを停止できるかを決定します。その後、これらのタスクについて `protectionEnabled` オプションを `false` に設定して `UpdateTaskProtection` を使用します。
    + サービスの必要なタスク数を増やして、保護されているタスクの数よりも多くします。

## タスクスケールイン保護に必要な IAM アクセス許可
<a name="task-scale-in-protection-iam"></a>

タスクには、以下のアクセス許可を持つ Amazon ECS タスクロールが必要です。
+ `ecs:GetTaskProtection`: Amazon ECS コンテナエージェントが `GetTaskProtection` を呼び出すことを許可します。
+ `ecs:UpdateTaskProtection`: Amazon ECS コンテナエージェントが `UpdateTaskProtection` を呼び出すことを許可します。