web-dev-qa-db-ja.com

AWS ECS Fargate Container Healthcheckコマンド

Aws ecs fargateデプロイメント構成をセットアップしようとしています。コンテナのヘルスチェックなしでコンテナを実行できました。だが、 コンテナのヘルスチェックを実行したい あまりにも。私はこれを達成するためにすべての可能なシナリオを試しました。しかし、運はありません。

Container Health Check Command

以下のaws推奨コマンドを試して、リストされたURLからコンテナーのヘルスチェックを確認しました。

https://docs.aws.Amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_healthcheck

  1. ["CMD-Shell"、 "curl -f http:// localhost / || exit 1"]
  2. ["CMD-Shell" "curl -f 127.0.0.1 || exit 1"]

上記の両方のコマンドを試してみました。しかし、どれも期待どおりに機能していません。コンテナの有効な健康診断コマンドを受け取るのを手伝ってください

以下は私のDockerFileです

    FROM centos:latest
    RUN yum update -y
    RUN yum install httpd httpd-tools curl -y
    EXPOSE 80
    CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
    HEALTHCHECK CMD curl --fail http://localhost:80/ || exit 1
    FROM Microsoft/dotnet:2.1-aspnetcore-runtime AS base
    WORKDIR /app
    EXPOSE 80
    FROM Microsoft/dotnet:2.1-sdk AS build
    WORKDIR /DockerDemoApi
    COPY ./DockerDemoApi.csproj DockerDemoApi/
    RUN dotnet restore DockerDemoApi/DockerDemoApi.csproj
    COPY . .
    WORKDIR /DockerDemoApi
    RUN dotnet build DockerDemoApi.csproj -c Release -o /app
    FROM build AS publish
    RUN dotnet publish DockerDemoApi.csproj -c Release -o /app
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app .
    ENTRYPOINT ["dotnet", "DockerDemoApi.dll"]

コンテナー内にcurlコマンドを追加し、その動作を確認しました。しかし、AWS Healthcheckタスクで同じコマンドを保持すると、失敗します。

タスク定義JSON:

    {
     "ipcMode": null,
     "executionRoleArn": "arn:aws:iam::xxxx:role/ecsTaskExecutionRole",
     "containerDefinitions": [{
     "dnsSearchDomains": null,
     "logConfiguration": {
     "logDriver": "awslogs",
     "secretOptions": null,
     "options": {
      "awslogs-group": "/ecs/mall-health-check-task",
      "awslogs-region": "ap-south-1",
      "awslogs-stream-prefix": "ecs"
     }
     },
     "entryPoint": [],
     "portMappings": [
     {
      "hostPort": 80,
      "protocol": "tcp",
      "containerPort": 80
     }
     ],
     "command": [],
     "linuxParameters": null,
     "cpu": 256,
     "environment": [],
     "resourceRequirements": null,
     "ulimits": null,
     "dnsServers": null,
     "mountPoints": [],
     "workingDirectory": null,
     "secrets": null,
     "dockerSecurityOptions": null,
     "memory": null,
     "memoryReservation": 512,
     "volumesFrom": [],
     "stopTimeout": null,
     "image": "xxxx.dkr.ecr.ap-south-
     1.amazonaws.com/autoaml/api/dev/Alpine:latest",
     "startTimeout": null,
     "dependsOn": null,
     "disableNetworking": null,
     "interactive": null,
     "healthCheck": null,
     "essential": true,
     "links": [],
     "hostname": null,
     "extraHosts": null,
     "pseudoTerminal": null,
     "user": null,
     "readonlyRootFilesystem": null,
     "dockerLabels": null,
     "systemControls": null,
     "privileged": null,
     "name": "sample-app"
     }
     ],
     "placementConstraints": [],
     "memory": "512",
     "taskRoleArn": "arn:aws:iam::xxxx:role/ecsTaskExecutionRole",
     "compatibilities": [
     "EC2",
     "FARGATE"
     ],
     "taskDefinitionArn": "arn:aws:ecs:ap-south-1:xxx:task-definition/mall- 
     health-check-task:9",
     "family": "mall-health-check-task",
     "requiresAttributes": [{
     "targetId": null,
     "targetType": null,
     "value": null,
     "name": "ecs.capability.execution-role-ecr-pull"
     },
     {
     "targetId": null,
     "targetType": null,
     "value": null,
     "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
     },
     {
     "targetId": null,
     "targetType": null,
     "value": null,
     "name": "ecs.capability.task-eni"
     },
     {
     "targetId": null,
     "targetType": null,
     "value": null,
     "name": "com.amazonaws.ecs.capability.ecr-auth"
     },
     {
     "targetId": null,
     "targetType": null,
     "value": null,
     "name": "com.amazonaws.ecs.capability.task-iam-role"
     },
     {
     "targetId": null,
     "targetType": null,
     "value": null,
     "name": "ecs.capability.execution-role-awslogs"
     },
     {
     "targetId": null,
     "targetType": null,
     "value": null,
     "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
     },
     {
     "targetId": null,
     "targetType": null,
     "value": null,
     "name": "com.amazonaws.ecs.capability.docker-remote-api.1.21"
     },
     {
     "targetId": null,
     "targetType": null,
     "value": null,
     "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
     }
     ],
     "pidMode": null,
     "requiresCompatibilities": [
     "FARGATE"
     ],
     "networkMode": "awsvpc",
     "cpu": "256",
     "revision": 9,
     "status": "ACTIVE",
     "proxyConfiguration": null,
     "volumes": []
     }
8
Arjun

使用しているDockerイメージ。パッケージの一部にcurlがインストールされていますか?.

スクリーンショットから、httpd:2.4 docker imageを直接使用しているようです。その場合、curlはパッケージの一部ではありません。

上記のhttpd:2.4からベースとして独自のDockerイメージを作成する必要があります。以下は、画像のカール部分を取得するためのサンプルDockerfileコンテンツです。

例-

FROM httpd:2.4
RUN apt-get update; \
    apt-get install -y --no-install-recommends curl;

次に、イメージをビルドして、DockerhubアカウントまたはプライベートDockerレポにプッシュします。

docker build -t my-Apache2 .
docker run -dit --name my-running-app -p 80:80 my-Apache2

上の画像で、healthcheckコマンドを機能させることができるはずです。

https://hub.docker.com/_/httpd

https://github.com/docker-library/httpd/blob/master/2.4/Dockerfile

2
Imran

Documentation は次のことを述べています:

AWSマネジメントコンソールでタスク定義を登録するときは、タスク定義の作成後に自動的に文字列に変換されるコマンドのコンマ区切りリストを使用します。ヘルスチェックの入力例は次のとおりです。

CMD-Shell, curl -f http://localhost/ || exit 1

AWSマネジメントコンソールのJSONパネル、AWS CLI、またはAPIを使用してタスク定義を登録するときは、コマンドのリストを角括弧で囲む必要があります。ヘルスチェックの入力例は次のとおりです。

[ "CMD-Shell", "curl -f http://localhost/ || exit 1" ]

enter image description here

ヘルスチェックコマンドを確認しましたか?つまり http://127.0.0. は有効ですよね? http://127.0.0. (ポートなし)をクリックすると、コンテナーが成功の応答を返すことを確認します。

以下はタスク定義の例です。これは、コンテナでTomcatサーバーを起動し、ヘルスをチェックすることです(localhost:8080)

  1. 必要に応じてタスク定義を変更します(Role Arnなど)。
  2. ECSサービスを作成し、タスク定義をマップします。
  3. 構成されたロググループを作成します。
  4. ECSサービスを開始すると、タスクがHealthyと表示されます。
{
  "ipcMode": null,
  "executionRoleArn": "arn:aws:iam::accountid:role/taskExecutionRole",
  "containerDefinitions": [
      {
          "dnsSearchDomains": null,
          "logConfiguration": {
              "logDriver": "awslogs",
              "secretOptions": null,
              "options": {
                  "awslogs-group": "/test/test-task",
                  "awslogs-region": "us-east-2",
                  "awslogs-stream-prefix": "test"
              }
          },
          "entryPoint": null,
          "portMappings": [
              {
                  "hostPort": 8080,
                  "protocol": "tcp",
                  "containerPort": 8080
              }
          ],
          "command": null,
          "linuxParameters": null,
          "cpu": 0,
          "environment": [],
          "resourceRequirements": null,
          "ulimits": null,
          "dnsServers": null,
          "mountPoints": [],
          "workingDirectory": null,
          "secrets": null,
          "dockerSecurityOptions": null,
          "memory": null,
          "memoryReservation": null,
          "volumesFrom": [],
          "stopTimeout": null,
          "image": "Tomcat",
          "startTimeout": null,
          "dependsOn": null,
          "disableNetworking": false,
          "interactive": null,
          "healthCheck": {
              "retries": 3,
              "command": [
                  "CMD-Shell",
                  "curl -f http://localhost:8080/ || exit 1"
              ],
              "timeout": 5,
              "interval": 30,
              "startPeriod": null
          },
          "essential": true,
          "links": null,
          "hostname": null,
          "extraHosts": null,
          "pseudoTerminal": null,
          "user": null,
          "readonlyRootFilesystem": null,
          "dockerLabels": null,
          "systemControls": null,
          "privileged": null,
          "name": "Tomcat"
      }
  ],
  "memory": "1024",
  "taskRoleArn": "arn:aws:iam::accountid:role/taskExecutionRole",
  "family": "test-task",
  "pidMode": null,
  "requiresCompatibilities": [
      "FARGATE"
  ],
  "networkMode": "awsvpc",
  "cpu": "512",
  "proxyConfiguration": null,
  "volumes": []
}
2
Haran

理由はわかりませんが、http:// localhost-に変更してください http://127.0.0.1127.0.0.1だけでなく)を使用して修正する問題。

私は提案されたもの ここ に従い、ヘルスチェックの問題を修正しました。

0
Garry Dias