如何解决 Fargate 上的 Amazon ECS 的网络接口预置错误?

3 分钟阅读
0

我想解决 AWS Fargate 上的 Amazon Elastic Container Service(Amazon ECS)的网络接口预置错误。

简短描述

当 Fargate 底层主机发生间歇性 API 问题时,您可能会收到以下错误:

  • 如果 Fargate 服务尝试将弹性网络接口连接到任务要在其上运行的底层基础设施,则您可能会收到以下错误消息:“等待网络接口预置完成超时。”
  • 如果您的 Fargate 任务因为弹性网络接口在任务预置状态期间未创建而无法启动,则您可能会收到以下错误消息:“网络接口预置完成错误超时,等待网络接口预置。”

**注意:**在与 Fargate 任务相同的子网中手动创建测试弹性网络接口,以确定是否有任何问题是由创建弹性网络而造成的。您还可以检查 AWS 服务运行状况控制面板有无 API 问题。

解决方法

如果 Fargate 任务是 ECS 服务的一部分,则 ECS 服务计划程序会再次尝试自动启动该任务。

使用 RunTask API 启动的任务涉及异步工作流程。如果工作流程成功启动,则返回成功代码。该任务并不表示其处于“正在运行”状态。使用 RunTask API 手动启动的任务需要手动重试。

使用 AWS Step Functions,可以通过指数回退和重试逻辑自动进行重试。

要创建以同步方式运行 ECS RunTask 操作的 Step Function,请执行以下步骤:

1.打开 Step Functions 控制台

2.    选择 Create State Machine(创建状态机)。

3.    选择 Write your workflow in code(用代码编写工作流程)。

4.    对于 Type(类型),请选择 Standard(标准)。有关不同类型工作流程的更多信息,请参阅标准与快速工作流程比较

5.    使用以下代码替换定义部分的默认内容:

{
  "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.    选择下一步

7.    对于 Name(名称),输入您的状态机的名称。

8.    选择 Role(角色)来运行状态机和关联资源。最佳实践是选择一个使用所需最低权限的角色,并仅包含 IAM 策略所需的权限。

以下代码示例显示了最低权限:

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

SNS 策略

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

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.    选择您的 Log Level(日志级别)。这将创建必要的 Amazon CloudWatch Log Streams。

10.    选择 Create State Machine(创建状态机)。

将您的 Step Function 与 CloudWatch 集成

1.    打开 Amazon EventBridge 控制台。

2.    在导航窗格中,选择 Events(事件),然后选择 Rules(规则)。

3.    选择 Create Rule(创建规则)。

4.    选择 Schedule(日程安排)。如果您想获得事件驱动的响应,也可以选择 Event(事件)。要了解更多信息,请参阅 CloudWatch 事件中的事件模式

5.    选择 Add Target(添加目标)。

6.    从下拉列表中选择 Step Function State Machine(Step Function 状态机)。

7.    选择您创建的状态机。

8.    选择具有适当权限的角色来运行状态机。

9.    选择 Configure details(配置详细信息)并提供 Rule(规则)的名称和描述。

10.    选择 Create Rule(创建规则)。


AWS 官方
AWS 官方已更新 1 年前
没有评论