ECS クラスターで実行される Docker コンテナ (Spring Boot) があります。Elastic Load Balancing なしで実行します。
ダウンタイムなしでサービスを更新したいので、新しいタスクが起動して正常になると、古いタスクは停止します。タスク定義にヘルス チェックを追加しようとしましたが、機能しません。これらの基本的なヘルス チェック コマンドを試しました。
[ "CMD-SHELL","exit 0" ]
[ "CMD-SHELL","exit 1" ]
前者の場合はタスクのヘルス ステータスが HEALTHY になり、後者の場合はヘルス チェックに失敗すると予想されます。どちらの場合も、新しいタスクは UNKNOWN ヘルス ステータスで正常に開始されます。
これは、ELB を使用していないことと関係があるのでしょうか? ドキュメントはあまりよくなく、Google 検索でも役立つ情報は何も返されませんでした。
答え1
raja の回答と Andrew の回答は、ECS/FARGATE では少しずれています。括弧も引用符もありません。
CMD-SHELL, curl -f http://localhost/ || exit 1
これは、ECS のタスク定義内にヘルスチェック情報を入力する場合の正しい形式です。
ECS/FARGATE の有効なドキュメントではありません https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html
答え2
指定されたコマンドは構文的に無効です。
そのはず
[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]
CMD
またはCMD-SHELL
- コンテナのデフォルトシェルでコマンドを実行するcurl -f http://localhost/
- ヘルスチェックを検証するためにコンテナ内で実行する必要がある実際のコマンド。exit 1
- curlコマンドが失敗した場合はシェルを終了します
したがって、コマンドを以下のように変更する必要があります。
[ "CMD-SHELL", "echo hi || exit 1" ]
echo hi は、私の例ではヘルス チェック コマンドです。"echo hi " の代わりに任意のコマンドを実行できます。コンテナー内で正常に実行された場合、終了ステータス 0 が返されます。
答え3
ecs-cli を使用して Fargate サービスをデプロイする場合、タスク定義のヘルスチェックをサポートするものにアップグレードする必要があることがわかりました。また、CMD-SHELL の使用は必須ではないこともわかりました。実際、CMD-SHELL を追加すると、生成されたタスク定義の結果の json で CMD-SHELL が別の CMD-SHELL でラップされ、機能しなくなります (aws コンソールに表示される)。
私の場合は、ecs-cli を 1.4.0 から 1.7.0 にアップグレードし、サービスの下の ecs-params.yml ファイルに healthcheck を追加するとうまくいきました。
task_definition:
ecs_network_mode: awsvpc
task_role_arn: arn:aws:iam::........
task_execution_role: arn:aws:iam::........
task_size:
cpu_limit: 2048
mem_limit: 4GB
services:
foo:
healthcheck:
command: ps cax | grep "[p]ython"
interval: 30s
timeout: 10s
retries: 2
essential: true
答え4
たとえば、「ポート マッピング」が8000:8000
「ECS EC2」または8000 tcp
「ECS Fargate」用の場合、「HEALTHCHECK」の「コマンド」は次のようになります。
CMD-SHELL, curl -f http://localhost:8000/ || exit 1
この場合は8000
after を忘れないでください。http://localhost: