web-dev-qa-db-fra.com

Commande AWS ECS Fargate Container Healthcheck

J'essaye d'installer la configuration de déploiement d'aws ecs fargate. J'ai pu exécuter des conteneurs sans contrôle de santé des conteneurs. Mais, Je souhaite exécuter des vérifications de l'état des conteneurs aussi. J'ai essayé tous les scénarios possibles pour y parvenir. Mais pas de chance.

Container Health Check Command

j'ai essayé avec les commandes recommandées par aws ci-dessous pour vérifier les contrôles de santé des conteneurs à partir de l'URL indiquée.

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"]

J'ai essayé avec les deux commandes ci-dessus. Mais, aucun d'entre eux ne fonctionne comme prévu. Aidez-moi à recevoir des commandes de contrôle de santé valides pour les conteneurs

Ci-dessous mon 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"]

J'ai ajouté la commande curl à l'intérieur de mon conteneur et son fonctionnement. Mais, si je garde la même commande dans la tâche AWS Healthcheck, son échec.

Définition de tâche 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

L'image docker que vous utilisez, a-t-elle curl installé une partie du package ?.

D'après votre capture d'écran, il semble que vous utilisiez httpd:2.4 image docker directement. Si tel est le cas, curl ne fait pas partie du package.

Vous devez créer votre propre image Docker par le haut httpd:2.4 comme base. Voici un exemple de contenu Dockerfile pour obtenir une partie curl de l'image.

Exemple -

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

puis créez l'image et poussez-la sur votre compte dockerhub ou sur votre dépôt Docker privé.

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

Maintenant, avec l'image ci-dessus, vous devriez pouvoir faire fonctionner la commande healthcheck.

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

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

2
Imran

Le Documentation mentionne ce qui suit:

Lors de l'enregistrement d'une définition de tâche dans AWS Management Console, utilisez une liste de commandes séparées par des virgules qui sera automatiquement convertie en chaîne après la création de la définition de tâche. Un exemple d'entrée pour un bilan de santé pourrait être:

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

Lors de l'enregistrement d'une définition de tâche à l'aide du panneau JSON de l'AWS Management Console, de l'AWS CLI ou des API, vous devez placer la liste des commandes entre crochets. Un exemple d'entrée pour un bilan de santé pourrait être:

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

enter image description here

Avez-vous vérifié votre commande de vérification de l'état? Je veux dire, http://127.0.0. est valide, non? Vérifiez que votre conteneur renvoie une réponse de succès lorsque vous appuyez sur http://127.0.0. (sans port).

Voici l'exemple de définition de tâche. Il s'agit de démarrer le serveur Tomcat dans un conteneur et de vérifier l'intégrité (localhost: 8080)

  1. Modifier la définition de tâche selon les besoins (comme le rôle Arn)
  2. Créez un service ECS et mappez la définition de tâche.
  3. Créez le groupe de journaux configuré.
  4. Démarrez le service ECS et votre tâche devrait apparaître comme saine.
{
  "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

Je ne sais pas pourquoi mais changez http: // localhost par - http://127.0.0.1 (pas seulement 127.0.0.1 ) à utiliser pour corriger problème.

J'ai suivi ce qui a été suggéré ici et cela a résolu mes problèmes de bilan de santé.

0
Garry Dias