如何解決 Fargate 上 Amazon ECS 的網路介面佈建錯誤?

3 分的閱讀內容
0

我想解決 AWS Fargate 上 Amazon Elastic Container Service (Amazon ECS) 的網路介面佈建錯誤。

簡短說明

當 Fargate 與基礎主機出現間歇性 API 問題時,您可能會收到以下錯誤:

  • 如果 Fargate 服務嘗試將彈性網路介面附加至要執行任務的基礎結構,則您可能會收到下列錯誤訊息: 「等待網路介面佈建完成已逾時。」
  • 如果您的 Fargate 任務因為未在任務佈建狀態期間建立彈性網路介面而無法啟動,則您可能會收到下列錯誤訊息: 「網路介面佈建完成錯誤等待網路介面佈建已逾時。」

**注意:**在與 Fargate 任務相同的子網路中](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)手動建立測試[彈性網路介面,以判斷彈性網路的建立是否有任何問題。您也可以查看 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. 類型選擇標準。如需不同工作流程類型的詳細資訊,請參閱標準工作流程 vs.快速工作流程

  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.    選擇下一步

  1. 輸入狀態機器的名稱

  2. 選擇一個角色來執行狀態機器並關聯資源。最佳做法是選取使用必要最低權限的角色,並僅包含 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": "*"
    }
  ]
}
  1. 選擇您的日誌級別。這將建立必要的 Amazon CloudWatch 日誌串流。

  2. 選擇建立狀態機器

整合您的 Step Function 與 CloudWatch

  1. 打開 Amazon Eventbridge 主控台。

  2. 在導覽面板中,選擇事件,然後選擇規則

  3. 選擇建立規則

  4. 選擇排程。如果您想要具有事件導向的回應,也可以選擇事件。若要深入了解,請參閱 CloudWatch 事件中的事件模式

  5. 選擇新增目標

  6. 從下拉列表中選擇 Step Function 狀態機器

  7. 選擇您建立的狀態機器。

  8. 選擇具有適當權限的角色來執行狀態機器。

  9. 選擇設定詳細資訊,並提供規則的名稱和說明。

  10. 選擇建立規則


AWS 官方
AWS 官方已更新 2 年前