Amazon Elastic Container Service (Amazon ECS) クラスターに新しいサービスをデプロイすると、タスクが不適切にデプロイされたり、終了したりします。
解決策
十分なリソース容量のあるコンテナを使用していることを確認する
新しいデプロイがロードバランサーのヘルスチェックに合格できない状況が続く場合は、Amazon ECS Container Insights のメトリクス CpuUtilized、CpuReserved、MemoryUtilized を確認します。Application Load Balancer を使用している場合は、TargetResponseTime も確認してください。
また、HealthCheckGracePeriodSeconds プロパティには、アプリケーションの起動時間よりも長い値を設定してください。ヘルスチェックの応答が遅れるとエラーが発生し、Amazon ECS がタスクをサイクルすることになる場合があります。
コンテナのステータスと終了コードを確認する
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
予期せず終了するタスクについて、次の describe-tasks コマンドを実行してコンテナの終了コードを確認します。
aws ecs describe-tasks --cluster ECS_CLUSTER --tasks TASK_ARN -- region REGION
注: お使いのものでそれぞれ、ECS_CLUSTER をクラスター名に、TASK_ARN をタスクの ARN に、REGION を AWS リージョンに置き換えます。
上記のコマンドの出力が 0 の場合、タスクが正常に起動したことを示しています。出力が 1 の場合は、アプリケーションエラーが発生しているため、アプリケーションログを確認する必要があります。出力が 137 の場合、コンテナが SIGKILL シグナルを受信したことを示しています。これは通常、メモリ不足の問題が原因です。この問題を解決するには、「Amazon ECS での OutOfMemory エラーをトラブルシューティングする方法を教えてください」および「Amazon ECS タスクが停止した理由を知りたいです」を参照してください。
タスク定義の設定を確認する
特にタスク定義を変更または新規作成した後は、すべてのタスク定義の構成が有効であることを確認してください。タスク定義の設定を確認するには、スタンドアロンタスクを実行します。
ロードバランサー設定を構成する
ニーズに応じて、ロードバランサーの deregistration_delay.timeout_seconds を設定します。長期間のリクエストには、高い値を使用します。Amazon Elastic Compute Cloud (Amazon EC2) スポットインスタンスでは、この値は 120 秒未満である必要があります。
次の modify-target-group-attributes コマンドを実行して deregistration_delay.timeout_seconds を変更します。
aws elbv2 modify-target-group-attributes --target-group-arn
EXAMPLE_ARN --attributes Key=deregistration_delay.timeout_seconds,Value=120
注: EXAMPLE_ARN はお使いのロードバランサーの ARN に、120 は登録解除遅延のタイムアウト (秒単位) に置き換えます。
ロードバランサーのヘルスチェック設定も最適化してください。設定がアプリケーションにとって厳しすぎる場合、ロードバランサーが頻繁にターゲットを異常とマークする場合があります。
アプリケーションの正常なシャットダウン時間を設定する
デフォルトでは、ECS_CONTAINER_STOP_TIMEOUT は 30 秒に設定されています。新しい Amazon ECS デプロイにおいて、以前のタスクのドレインフェーズ中にアプリケーションにアクセスすると、5xx エラーが発生する場合があります。アプリケーションへのアクセス時に問題が発生した場合は、アプリケーションが必要とする正常なシャットダウンに基づいて ECS_CONTAINER_STOP_TIMEOUT の値を増やしてください。デプロイする前に、更新された値をテスト環境でテストするのがベストプラクティスです。
値を更新するには、次の例のようなコードをタスク定義に追加します。
{
"containerDefinitions": [
{
"name": "your-container",
"image": "your-image",
"stopTimeout": 120
}
]
}
注: 120 は、使用する ECS_CONTAINER_STOP_TIMEOUT 値に置き換えます。
アプリケーションに SIGTERM ハンドラーを追加して正常なシャットダウンを構成します。AWS Fargate Spot では、SIGTERM ハンドラーの実行中に DeregisterTargets を呼び出すように構成します。こうすることで、Amazon ECS はロードバランサーのターゲットグループから FARGATE_SPOT タスクを登録解除するようになります。
関連情報
Amazon ECS でロードバランサーの Connection Draining パラメータを最適化する