Amazon Web Services ブログ

Amazon ECS のマネージドインスタンスドレインにより Amazon EC2 キャパシティの管理が容易に

はじめに

Amazon Elastic Container Service (ECS) は、コンテナ化されたタスクを AWS インフラストラクチャにデプロイし、管理します。Amazon ECS を使用して、サーバーレスである AWS Fargate キャパシティにタスクをデプロイすることで、お客様はコンピューティングインスタンスを保守する必要がなくなります。しかし、Amazon Elastic Compute Cloud (Amazon EC2) をキャパシティとして Amazon ECS を使用することを好むお客様もいます。EC2 インスタンスをコンテナ実行のキャパシティとして使用すると、基盤となるコンピューティングインフラストラクチャをより細かく制御できますが、これにはメンテナンスのオーバーヘッドが増えるという欠点があります。従来、クラスターオペレーターは EC2 インスタンスで実行されているコンテナワークロードが予期せず中断されないように、EC2 インスタンスのメンテナンス用のカスタムツールを構築する必要がありました。Amazon ECS には、EC2 インスタンスで実行中のタスクをドレインし、それらのタスクを別のインスタンスに移動する機能が組み込まれています。これにより、元のインスタンスを置き換えたり終了したりすることができます。ただし、このドレイン機能を利用するには、コンテナインスタンスをドレイン状態に設定し、すべてのタスクがドレインされるまでの間コンテナインスタンスをドレイン状態にする、Auto Scaling ライフサイクルフックを利用したカスタムソリューションを、お客様自身で実装する必要がありました。

Amazon ECS では、Amazon ECS キャパシティプロバイダーの組み込み機能としてマネージドインスタンスドレインが提供されるようになりました。この新機能により、Amazon ECS は Amazon ECS キャパシティプロバイダーに関連付けられた Amazon EC2 Auto Scaling グループの一部である EC2 インスタンスから、タスクを安全かつ自動的にドレインできるようになりました。この簡素化により多くの Amazon ECS のお客様は、これまで EC2 インスタンスのドレインに使用していたカスタムライフサイクルフックが不要になります。お客様は、Auto Scaling グループインスタンスの更新をシームレスに利用することで、ワークロードを中断させずに ECS エージェントの新しいバージョンのロールアウトのようなインフラストラクチャの更新を実行できるようになりました。

インスタンスの更新とドレインについて

EC2 Auto Scaling グループは、EC2 インスタンス群をスケールアウトするための主要なメカニズムです。Auto Scaling グループに属する EC2 インスタンスは、インスタンスタイプと EC2 インスタンスのベースとなる Amazon マシンイメージ (AMI) を定義する起動テンプレートを使用して設定します。Amazon ECS の場合は、ECS に最適化された AMI をベースにした EC2 インスタンスを起動できます。この特別な AMI には、インスタンスを Amazon ECS クラスターに接続し、ホストでコンテナワークロードを起動するために必要なものがすべて付属しています。Amazon ECS の新機能や、基盤となるホスト OS のバグやセキュリティ脆弱性に対するパッチを提供するために、ECS に最適化された AMI の新しいバージョンが定期的にリリースされています。Auto Scaling グループインスタンスの更新は、クラスター内の EC2 インスタンスを稼働させている AMI を更新するための 1 つのソリューションです。Amazon ECS に最適化された AMI の最新バージョンを参照する新しい起動テンプレートは、Auto Scaling グループの EC2 インスタンスの再起動に役立ちます。

EC2 Auto Scaling グループの AMI アップデートをトリガーするには様々な方法があります。EventBridge Scheduler と Lambda 関数を使用して定期的にインスタンスの更新をトリガーすることで、インスタンスの更新を自動化したい場合があります。AWS CloudFormation または AWS Cloud Development Kit (AWS CDK) を使用したい場合は、UpdatePolicy 設定を使用して、EC2 インスタンスのコード駆動型ローリング更新としてインフラストラクチャを設定することもできます。

EC2 インスタンスをどのように更新しても、Auto Scaling グループの一部である EC2 インスタンスは置き換えられます。タスクの実行中に EC2 インスタンスを停止して交換すると、それらのタスクも停止します。Amazon ECS は、Amazon ECS サービスの一部のタスクが失われたことを検出します。サービスの希望するタスク数を維持するために、Amazon ECS はクラスター内の別の EC2 インスタンスで代替タスクを起動します。しかし、これは事後対応型のフェイルセーフであり、コンテナがすでに停止していて、サービスの実行中タスク数がすでに希望タスク数を下回った後にのみ発生します。

マネージドインスタンスドレインは、事後対応型ではなく事前対応型です。EC2 インスタンスが Auto Scaling グループによって終了するように設定されるたびに、Amazon ECS はインスタンスの終了を一時的に遅らせ、インスタンスを自動的にドレインモードにします。このドレインモードでは、インスタンスでこれ以上タスクが起動されなくなり、インスタンスで実行中のサービス起動タスクはすべて積極的に新しいホストに置き換えられます。タスク置換では、ドレイン中の EC2 インスタンスで現在実行中の既存のタスクを停止する前に、新しい置換タスクを起動しようとします。ドレイン動作の詳細については、Amazon ECS の公式ドキュメント コンテナインスタンスドレインをご覧ください。

新しいマネージドインスタンスドレインは、ワークロードの実行と可用性を維持するために設計された次の Amazon ECS 機能と相互作用します。

マネージド終了保護

Auto Scaling グループにアタッチされた Amazon ECS キャパシティプロバイダーを設定する場合、Amazon ECS で利用できるオプションの 1 つにマネージド終了保護があります。これにより、Amazon ECS タスクを実行している EC2 インスタンスをスケールインから保護できます。有効にすると、Auto Scaling グループのスケールイン中は、1 つ以上のタスクを実行している EC2 インスタンスを停止できなくなります。マネージド終了保護は、あらゆる形態の EC2 インスタンスの終了を防ぐわけではありませんが、EC2 インスタンスをドレインする必要がある状況の多くを防ぐことができます。しかし、それでもなお、マネージド終了保護とマネージドインスタンスドレインの両方を有効にすることは良いことです。両方の機能を有効にすると、本番環境のワークロードの中断から最大限の保護を受けることができます。マネージド終了保護により、さまざまなタイプの破壊的な EC2 インスタンス停止を防ぐことができます。また、マネージドインスタンスドレインにより、EC2 インスタンスを終了する必要が生じた場合でも、実行中のワークロードが適切に処理されます。

停止タイムアウト

Amazon ECS タスクを定義するときに、タスクの停止タイムアウトを指定できます。指定しない場合、この停止タイムアウトはデフォルトで 30 秒になります。Amazon ECS は EC2 インスタンスをドレインしているときに停止が必要な各タスクコンテナに SIGTERM 停止信号を送り、停止タイムアウトの時間を待ってコンテナが正常に終了するかどうかを確認します。停止タイムアウトが経過してもコンテナが正常に終了しない場合、Amazon ECS はコンテナのプロセスを強制停止するために SIGKILL 信号を送ります。すぐには完了できないような重い作業がタスクで行われている場合は、タスクの停止タイムアウトを長く設定できます。マネージドインスタンスドレインでは、タスクが自動的に正常終了するか、停止タイムアウト期間を超えて Amazon ECS がタスクを強制停止するまで、EC2 インスタンスをドレイン状態のままにします。ただし、Amazon ECS のタスクの停止タイムアウトは、希望すれば何年も待機するように設定できますが、EC2 のドレイン期間は 48 時間を超えることはできません。したがって、タスク停止タイムアウトを 48 時間以上に設定することはお勧めできません。

タスク保護

Amazon ECS では、実行中のタスク自体を保護対象としてマークすることができます。この機能は、タスクが重要な作業を行っている最中であり、そのタスクを停止してはいけないことを Amazon ECS に伝えます。マネージド終了保護を使用している場合、保護されたタスクを実行しているインスタンスは、Auto Scaling グループのスケールインの一環として停止されないようにすでに部分的に保護されています。ただし、マネージド終了保護が無効になっている場合、Amazon EC2 Auto Scaling グループは EC2 インスタンスに保護されたタスクがあるかどうかを確認しません。さらに、Amazon ECS のマネージド終了保護によってスケールインから保護されている場合でも、EC2 インスタンスの更新によるインスタンスの置き換えができるように設定できます。Auto Scaling グループは引き続き、保護されたタスクをホストしている EC2 インスタンスを終了することを選択できます。これにより EC2 インスタンスはドレイン状態になり、インスタンスで実行中のタスクはタスク保護の状態に関係なく、すぐに SIGTERM  停止信号を送ります。タスクで停止タイムアウトを使用してタスクフォースの終了を遅らせ、EC2 インスタンスを最大 48 時間ドレイン状態に保つことができます。

一般的に、タスク保護機能を使用する予定のタスクには停止タイムアウトを設定するのがベストプラクティスと考えられています。さらに、EC2 でホストされるミッションクリティカルなタスクであれば、Amazon ECS メタデータエンドポイントを使用してタスクをホストしているインスタンスの ID を検出し、Amazon EC2 ModifyInstanceAttribute API を使用して、タスクをホストする EC2 インスタンスに disableApiStop 属性または disableAPItermination 属性を設定すると良い場合があります。これにより、EC2 インスタンスの自動停止アクションに対する保護が強化されます。

RunTask API で起動されたスタンドアロンタスク

サービスが起動したタスクはレプリカセットの一部であり、サービスはいつでも他の EC2 インスタンスで追加のタスクを起動できるため、EC2 インスタンスから安全に削除できます。ただし Amazon ECS では、RunTask API で起動されたスタンドアロンタスクをドレインしません。むしろ、Amazon ECS はこれらのタスクが自動的に終了するのを待ちます。これらのタスクが実行されている限り、Amazon EC2 インスタンスはドレイン状態のままになります。Amazon EC2 インスタンスは、最大 48 時間までドレイン状態のままでいることができます。それ以降は、RunTask によって起動されたか CreateService によって起動されたかにかかわらず、インスタンス上のすべてのタスクが強制停止されます。

まとめ

新しい Amazon ECS マネージドインスタンスドレイン機能は、公開コンテナロードマップの機能リクエストから生まれました。オープンソースの RFCには、Github で 300 件以上のリアクションが寄せられました。Amazon ECS の将来への継続的な関心と関与に感謝するとともに、AWS にコンテナを大規模にデプロイしやすくする強力な機能を引き続き提供できることを嬉しく思います。独自の機能リクエストがある場合は、公開ロードマップに問題を提起するか、既存の機能リクエストに賛成票を投じて関心を示してください。

マネージドインスタンスドレインを開始するには、Amazon ECS ドキュメントを参照して、キャパシティプロバイダーと Auto Scaling グループにマネージドインスタンスドレインを有効にする方法の詳細を確認してください。

本記事は Amazon ECS enables easier EC2 capacity management, with managed instance draining (2024 年 1 月 19 日公開) を翻訳したものです。翻訳は、ソリューションアーキテクトの吉田が担当しました。