Fargate の Amazon ECS のネットワークインターフェイスプロビジョニングエラーを解決する方法を教えてください。

所要時間3分
0

AWS Fargate の Amazon Elastic Container Service (Amazon ECS) のネットワークインターフェイスプロビジョニングエラーを解決したいと考えています。

簡単な説明

Fargate が基盤となるホストで断続的に API の問題が発生していると、次のエラーが表示されることがあります。

  • Fargate サービスが、タスクを実行する基盤となるインフラストラクチャに Elastic Network Interface をアタッチしようとすると、次のエラーメッセージが表示されることがあります。「Timeout waiting for network interface provisioning to complete」(タイムアウト: ネットワークインターフェイスのプロビジョニングが完了するのを待機しています)
  • タスクのプロビジョニング状態中に Elastic Network Interface が作成されなかったために Fargate タスクを起動できない場合は、次のエラーメッセージが表示されることがあります。「Network interface provision complete error timeout wait for network interface provision」(ネットワークインターフェイスのプロビジョニングの完了エラー - タイムアウト: ネットワークインターフェイスのプロビジョニングを待機しています)

注: Fargate タスクと同じサブネットでテスト用 Elastic Network Interface を手動で作成し、Network Interface の作成に起因する問題がないかどうかを確認します。AWS サービスヘルスダッシュボードで API の問題を確認することもできます。

解決方法

Fargate タスクが ECS サービスの一部である場合、ECS サービススケジューラはタスクを自動的に再起動しようとします。

RunTask API を使用して起動されるタスクには、非同期的ワークフローが含まれます。ワークフローが正常に開始されると、成功コードが返されます。タスクが実行中の状態であることは表示されません。RunTask API を使用して手動で起動したタスクは、手動での再試行が必要です。

再試行は、AWS Step Functions を使用してエクスポネンシャルバックオフと再試行ロジックで自動化することができます。

ECS RunTask オペレーションを同期させて実行する Step Function を作成するには、次の手順を実行します。

1.Step Functions コンソールを開きます。

2.    [ステートマシンの作成] を選択します。

3.    [ワークフローをコードで記述する] を選択します。

4.    [タイプ] で、[標準] を選択します。さまざまなタイプのワークフローの詳細については、標準ワークフロー対Express ワークフローを参照してください。

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.    ステートマシンの [名前] を入力します。

8.    [ロール] を選択してステートマシンを実行し、リソースを関連付けます。必要最小特権のみを使用するロールを選択し、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.    ログレベルを選択します。これにより、必要な Amazon CloudWatch ログストリームが作成されます。

10.    [ステートマシンの作成] を選択します。

Step Functions と CloudWatch の統合

1.    Amazon Eventbridge コンソールを開きます。

2.    ナビゲーションパネルで、[イベント]、[ルール] の順に選択します。

3.    [ルールの作成] を選択します。

4.    [スケジュール] を選択します。イベント駆動型のレスポンスを希望する場合は、[イベント] を選択することもできます。詳細については、CloudWatch Events のイベントパターンを参照してください。

5.    [ターゲットの追加] を選択します。

6.    ドロップダウンリストから [Step Function ステートマシン] を選択します。

7.    作成したステートマシンを選択します。

8.    ステートマシンを実行するのに適切な許可を有するロールを選択します。

9.    [詳細の設定] を選択し、ルールの名前と説明を入力します。

10.    [ルールの作成] を選択します。


AWS公式
AWS公式更新しました 2年前
コメントはありません