Fargate에서 Amazon ECS에 대한 네트워크 인터페이스 프로비저닝 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 9월 23일

AWS Fargate에서 Amazon Elastic Container Service(Amazon ECS)에 대한 네트워크 인터페이스 프로비저닝 오류를 해결하고 싶습니다.

간략한 설명

Fargate에서 기본 호스트에 간헐적인 API 문제가 발생하면 다음과 같은 오류가 나타날 수 있습니다.

  • Fargate 서비스가 태스크를 실행하려는 기본 인프라에 탄력적 네트워크 인터페이스를 연결하려고 하면 "Timeout waiting for network interface provisioning to complete"와 같은 오류 메시지가 나타날 수 있습니다.
  • 태스크 프로비저닝 상태 중에 탄력적 네트워크 인터페이스가 생성되지 않으므로 Fargate 태스크를 시작할 수 없는 경우 "Network interface provision complete error timeout wait for network interface provision"과 같은 오류 메시지가 나타날 수 있습니다.

참고: Fargate 태스크와 동일한 서브넷에서 수동으로 테스트 탄력적 네트워크 인터페이스를 만들어 탄력적 네트워크 생성으로 인한 문제가 있는지 확인하세요. AWS 서비스 상태 대시보드에서 API 문제를 확인할 수도 있습니다.

해결 방법

Fargate 태스크가 ECS 서비스의 일부인 경우 ECS 서비스 스케줄러는 해당 태스크를 자동으로 다시 시작하려고 시도합니다.

RunTask API를 사용하여 시작하는 태스크에는 비동기식 워크플로가 포함됩니다. 워크플로가 성공적으로 시작된 경우 성공 코드가 반환됩니다. 태스크는 실행 중(RUNNING) 상태임을 나타내지 않습니다. RunTask API로 수동으로 실행하는 태스크는 수동으로 다시 시도해야 합니다.

AWS Step Functions를 사용하여 지수 백오프 및 재시도 로직으로 재시도를 자동화할 수 있습니다.

ECS RunTask 작업을 동기식으로 실행하는 Step Function을 생성하려면 다음 단계를 수행하세요.

1. Step Functions(Step Functions) 콘솔을 엽니다.

2.    상태 시스템 생성(Create State Machine)을 선택합니다.

3.    코드로 워크플로 작성(Write your workflow in code)를 선택합니다.

4.    유형(Type)에서 표준(Standard)을 선택합니다. 다양한 유형의 워크플로에 대한 자세한 내용은 표준 워크플로와 익스프레스 워크플로를 참조하세요.

5.    정의(Definition) 섹션의 기본 내용을 다음 코드로 바꿉니다.

{
  "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 로그 스트림이 생성됩니다.

10.    상태 시스템 생성(Create State Machine)을 선택합니다.

스텝 함수를 CloudWatch와 통합하기

1.    Amazon EventBridge 콘솔을 엽니다.

2.    탐색 창에서 이벤트(Events)를 선택하고 규칙(Rules)을 선택합니다.

3.    규칙 생성(Create Rule)을 선택합니다.

4.    일정(Schedule)을 선택합니다. 이벤트 기반 응답을 원하는 경우 이벤트(Event)를 선택할 수도 있습니다. 자세한 내용은 CloudWatch Events의 이벤트 패턴을 참조하세요.

5.    대상 추가(Add Target)를 선택합니다.

6.    드롭다운 목록에서 스텝 함수 상태 시스템을 선택합니다.

7.    생성한 상태 시스템을 선택합니다.

8.    적절한 권한이 있는 역할을 선택하여 상태 시스템을 실행합니다.

9.    세부 정보 구성(Configure details)을 선택하고 규칙(Rule)의 이름과 설명을 입력합니다.

10.    규칙 생성(Create Rule)을 선택합니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?