Como resolvo erros de provisionamento de interface de rede para o Amazon ECS no Fargate?

5 minuto de leitura
0

Quero resolver erros de provisionamento de interface de rede para o Amazon Elastic Container Service (Amazon ECS) no AWS Fargate.

Breve descrição

Você pode receber os seguintes erros quando o Fargate tiver problemas intermitentes de API com o host subjacente:

  • Se o serviço Fargate tentar conectar uma interface de rede elástica à infraestrutura subjacente na qual a tarefa deve ser executada, você poderá receber a seguinte mensagem de erro: “Tempo limite de espera pela conclusão do provisionamento da interface de rede.”
  • Se suas tarefas do Fargate não puderem ser iniciadas porque a interface de rede elástica não foi criada durante o estado de provisionamento de tarefas, você poderá receber a seguinte mensagem de erro: “Tempo limite de erro de conclusão do provisionamento da interface de rede; aguarde o provisionamento da interface de rede.”

Observação: Crie uma interface de rede elástica de teste manualmente na mesma sub-rede da sua tarefa do Fargate para determinar se algum problema é devido à criação da rede elástica. Você também pode verificar o AWS Service Health Dashboard para ver se há problemas de API.

Resolução

Se a tarefa Fargate fizer parte de um serviço ECS, o Agendador do serviço ECS tentará iniciar a tarefa automaticamente mais uma vez.

Uma tarefa iniciada usando a API RunTask envolve um fluxo de trabalho assíncrono. Se o fluxo de trabalho tiver sido iniciado com êxito, um código de sucesso será retornado. A tarefa não indica que está em um estado de execução. As tarefas que são iniciadas manualmente com a API RunTask exigem uma nova tentativa manual.

As novas tentativas podem ser automatizadas com uma lógica de recuo exponencial e repetição usando o AWS Step Functions.

Para criar uma função de etapa que execute a operação ECS RunTask de forma síncrona, execute as seguintes etapas:

  1. Abra o console do Step Functions.

2.    Escolha Criar máquina de estado.

3.    Escolha Escrever seu fluxo de trabalho em código.

4.    Escolha Padrão em Tipo. Para obter mais informações sobre os diferentes tipos de fluxo de trabalho, consulte Fluxos de trabalho padrão vs. expressos.

5.    Substitua o conteúdo padrão da seção Definição pelo seguinte código:

{
  "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.    Escolha Próximo.

7.    Insira um Nome para sua máquina de estado.

8.    Escolha um Perfil para executar a máquina de estado e relacionar recursos. A melhor prática é selecionar um perfil que use o menor privilégio necessário e incluir somente as permissões necessárias para suas políticas do IAM.

Esses exemplos de código mostram as permissões de privilégio mínimo:

Política do 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"
      ]
    }
  ]
}

Política de SNS:

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

Política do 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.    Escolha seu Nível de log. Isso cria os fluxos de log necessários do Amazon CloudWatch.

10.    Escolha Criar máquina de estado.

Integração de sua função de etapa com o CloudWatch

1.    Abra o console do Amazon Eventbridge.

2.    No painel de navegação, escolha Eventos e, em seguida, escolha Regras.

3.    Escolha Criar regra.

4.    Escolha Cronograma. Você também pode escolher Evento se quiser ter uma resposta orientada por eventos. Para saber mais, consulte Padrões de eventos nos eventos do CloudWatch.

5.    Escolha Adicionar destino.

6.    Escolha Máquina de estado do Step Functions na lista suspensa.

7.    Escolha a máquina de estado que você criou.

8.    Escolha um perfil com as permissões apropriadas para executar a máquina.

9.    Escolha Configurar detalhes e forneça um nome e uma descrição para sua Regra.

10.    Escolha Criar regra.


AWS OFICIAL
AWS OFICIALAtualizada há um ano