Comment résoudre les erreurs de provisionnement d'interface réseau pour Amazon ECS sur Fargate ?

Lecture de 5 minute(s)
0

Je souhaite résoudre les erreurs de provisionnement d'interface réseau pour Amazon Elastic Container Service (Amazon ECS) sur AWS Fargate.

Brève description

Vous pouvez recevoir les erreurs suivantes lorsque Fargate a des problèmes d'API intermittents avec l'hôte sous-jacent :

  • Si le service Fargate tente d'attacher une interface réseau Elastic à l'infrastructure sous-jacente sur laquelle la tâche est censée s'exécuter, vous pouvez recevoir le message d'erreur suivant : « Délai d'attente de la mise en service de l'interface réseau. »
  • Si vos tâches Fargate ne peuvent pas être lancées parce que l'interface réseau Elastic n'a pas été créée pendant l'état de provisionnement des tâches, le message d'erreur suivant peut s'afficher : « Délai d'erreur complet de provisionnement de l'interface réseau pour la mise en service de l'interface réseau. »

Remarque : Créez une interface réseau élastique de test manuellement dans le même sous-réseau que votre tâche Fargate afin de déterminer si des problèmes sont dus à la création du réseau élastique. Vous pouvez également consulter le tableau AWS Service Health Dashboard pour les problèmes d'API.

Solution

Si la tâche Fargate fait partie d'un service ECS, le planificateur de services ECS tente de relancer automatiquement la tâche.

Une tâche lancée à l'aide de l'API RunTask implique un flux de travail asynchrone. Si le flux de travail a démarré correctement, un code de réussite est renvoyé. La tâche n'indique pas qu'elle est en cours d'exécution. Les tâches qui sont lancées manuellement avec l'API RunTask nécessitent une nouvelle tentative manuelle.

Les nouvelles tentatives peuvent être automatisées grâce à une logique d'arrêt et de nouvelle tentative exponentielle à l'aide d'AWS Step Functions.

Pour créer une fonction Step qui exécute l'opération ECS RunTask de manière synchrone, effectuez les opérations suivantes :

  1. Ouvrez la console Step Functions.

2.    Sélectionnez Créer une machine d'état.

3.    Sélectionnez Écrire votre flux de travail en code.

4.    PourType, choisissez Standard. Pour plus d'informations sur les différents types de flux de travail, voir Standard vs. flux de travail express.

5.    Remplacez le contenu par défaut de la section Définition par le code suivant :

{
  "Comment": "Synchronous RunTask ",
  "StartAt": "Run Synchronous ECS Task",
  "TimeoutSeconds": 3600,
  "States": {
    "Run Synchronous ECS Task": {
      "Type": "Task",
      "Resource": "arn:aws:states:::ecs:runTask.sync",
      "Parameters": {
        "LaunchType": "FARGATE",
        "Cluster": "<ECS_CLUSTER_ARN>",
        "TaskDefinition": "<TASK_DEFINITION_ARN>",
        "NetworkConfiguration": {
          "AwsvpcConfiguration": {
            "Subnets": [
              "<SUBNET_1>",
              "<SUBNET_2>",
            ],
            "AssignPublicIp": "<ENABLED or DISABLED>"
          }
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 10,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Next": "Notify Success",
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "Notify Failure"
        }
      ]
    },
    "Notify Success": {
      "Type": "Task",
      "Resource": "arn:aws:states:::sns:publish",
      "Parameters": {
        "Message": "AWS ECS Task started by Step Functions reached a RUNNING state",
        "TopicArn": "<SNS_TOPIC_ARN>"
      },
      "End": true
    },
    "Notify Failure": {
      "Type": "Task",
      "Resource": "arn:aws:states:::sns:publish",
      "Parameters": {
        "Message": "AWS ECS Task started by Step Functions failed to reach a RUNNING state",
        "TopicArn": "<SNS_TOPIC_ARN>"
      },
      "End": true
    }
  }
}

6.    Sélectionnez Suivant.

7.    Saisissez unNom, pour votre machine d'état.

8.    Choisissez un rôle pour exécuter la machine d'état et associer les ressources. Il est recommandé de sélectionner un rôle qui utilise le moins de privilèges nécessaires et d'inclure uniquement les autorisations nécessaires à vos politiques IAM.

Ces exemples de code montrent les autorisations les moins privilégiées :

Politique ECS :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecs:RunTask"
      ],
      "Resource": [
        "arn:aws:ecs:*:123456789:task-definition/<TASK_DEFINITION>"
      ],
      "Condition": {
        "ArnLike": {
          "ecs:cluster": "arn:aws:ecs:*:123456789:cluster/<ECS "
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringLike": {
          "iam:PassedToService": "ecs-tasks.amazonaws.com"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": [
        "ecs:StopTask",
        "ecs:DescribeTasks"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "events:PutTargets",
        "events:PutRule",
        "events:DescribeRule"
      ],
      "Resource": [
        "arn:aws:events:us-east-1:123456788:rule/StepFunctionsGetEventsForECSTaskRule"
      ]
    }
  ]
}

Politique SNS :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sns:Publish"
      ],
      "Resource": [
        "arn:aws:sns:us-east-1:12345678:<TOPIC>"
      ]
    }
  ]
}

Politique d'Amazon CloudWatch :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogDelivery",
        "logs:GetLogDelivery",
        "logs:UpdateLogDelivery",
        "logs:DeleteLogDelivery",
        "logs:ListLogDeliveries",
        "logs:PutResourcePolicy",
        "logs:DescribeResourcePolicies",
        "logs:DescribeLogGroups"
      ],
      "Resource": "*"
    }
  ]
}

9.    Choisissez votre niveau de journalisation. Cela crée les flux de journaux Amazon CloudWatch nécessaires.

10.    Choisissez Créer une machine d'état.

Intégrer votre fonction Step à CloudWatch

1.    Ouvrez la console Amazon EventBridge.

2.    Dans le volet de navigation, sélectionnez Evénements, puis Règles.

3.    SélectionnezCreate rule (Créer une règle).

4.    Sélectionnez Planifier. Vous pouvez également choisir Événement si vous souhaitez obtenir une réponse basée sur les événements. Pour en savoir plus, consultez la section Modèles d'événements dans CloudWatch Events.

5.    Choisissez Add Target (Ajouter une cible).

6.    Choisissez Step Function State Machine dans la liste déroulante.

7.    Choisissez la Machine d’état que vous avez créée.

8.    Choisissez un rôle doté des autorisations appropriées pour exécuter la machine d’état.

9.    Choisissez Configurer les détails et donnez un nom et une description à votre règle.

10.    SélectionnezCreate rule (Créer une règle).


AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans