Fargate 작업과 다른 AWS 서비스 간의 연결 문제를 해결하려면 어떻게 해야 합니까?

5분 분량
0

AWS Fargate 작업과 AWS 서비스 간에 발생하는 연결 문제를 해결하고 싶습니다.

간략한 설명

Amazon Elastic Container Service(Amazon ECS)를 통해 Fargate 작업 내에서 실행되는 애플리케이션은 다음과 같은 이유로 다른 AWS 서비스에 액세스하지 못할 수 있습니다.

  • AWS Identity and Access Management(IAM) 권한 부족
  • 잘못된 서브넷 경로
  • 네트워크 액세스 제어 목록(네트워크 ACL) 제한
  • 보안 그룹
  • Amazon Virtual Private Cloud(VPC) 엔드포인트

이러한 문제를 해결하려면 Amazon ECS Exec을 사용하여 Fargate 작업의 애플리케이션 컨테이너와 상호 작용하세요. 애플리케이션 컨테이너 로그에서 연결 시간 초과 오류가 발견되면 Fargate 작업과 해당 AWS 서비스 간의 연결을 테스트하세요.

해결 방법

ECS Exec을 사용하여 Fargate 작업의 애플리케이션 컨테이너와 상호 작용

  1. Amazon ECS Exec를 사용하기 전에 Amazon ECS Exec 사용을 위한 전제조건을 완료합니다.

  2. Amazon ECS Exec 사용의 지침에 따라 기능을 켭니다.

  3. Amazon ECS Exec을 실행하여 애플리케이션 컨테이너에 액세스하고 컨테이너와 AWS 서비스 간의 네트워크 및 IAM 연결을 확인합니다.

참고: Exec을 수행하기 전에 initProcessEnabled 파라미터를 true로 설정하는 것이 가장 좋습니다. 이렇게 하면 AWS Systems Manager Agent(SSM Agent) 하위 프로세스가 분리되는 것을 방지할 수 있습니다. (선택 사항) 애플리케이션 컨테이너에 sleep 명령을 추가하여 컨테이너가 지정된 기간 동안 계속 실행되도록 합니다.

예시:

{
    "taskRoleArn": "ecsTaskRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "EC2",
        "FARGATE"
        ],
        "executionRoleArn": "ecsTaskExecutionRole",
        "memory": ".5 gb",
        "cpu": ".25 vcpu",
        "containerDefinitions": [
            {
                "name": "application",
                "image": "application:latest",
                "essential": true,
                "command": ["sleep","7200"],
                "linuxParameters": {
                    "initProcessEnabled": true
                }
            }
        ],
        "family": "ecs-exec-task"
}

Exec을 사용하여 애플리케이션 컨테이너에 액세스할 수 없는 경우 Amazon/aws-cli Docker 이미지에서 실행되는 새 Fargate 작업에 대해 Exec을 실행하세요. 이를 통해 Fargate 작업과 AWS 서비스 간의 통신을 테스트할 수 있습니다.

참고: 새 Fargate 작업에는 애플리케이션 컨테이너와 동일한 네트워킹 설정(서브넷, 보안 그룹 등)이 되어 있어야 합니다.

amazon/aws-cli 도커 이미지를 사용하여 새 Fargate 작업을 실행하려면 다음 단계를 완료하세요.

참고: AWS Command Line Interface(AWS CLI)는 컨테이너의 Amazon/aws-cli 이미지에 사전 설치되어 있습니다. AWS CLI가 애플리케이션 컨테이너에 설치되지 않은 경우 다음 명령을 실행합니다.

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86\_64.zip" -o "awscliv2.zip"

unzip awscliv2.zip

sudo ./aws/install
  1. amazon/aws-cli를 컨테이너 이미지로 사용하여 작업 정의를 생성합니다. 그런 다음 진입점 tail-f/dev/null을 추가하여 컨테이너를 연속 Running(실행 중) 상태로 전환합니다.

작업 정의 예시:

{  
    "requiresCompatibilities": \[  
        "FARGATE"  
    \],  
    "family": "aws-cli",  
    "containerDefinitions": \[  
        {  
        "entryPoint": \[  
        "tail",  
        "-f",  
        "/dev/null"  
        \],  
        "name": "cli",  
        "image": "amazon/aws-cli",  
        "essential": true  
        }  
    \],  
    "networkMode": "awsvpc",  
    "memory": "512",  
    "cpu": "256",  
    "executionRoleArn": "arn:aws:iam::123456789012:role/EcsTaskExecutionRole",  
    "taskRoleArn": "arn:aws:iam::123456789012:role/TaskRole"  
}
  1. 새로 생성한 작업 정의와 애플리케이션 컨테이너와 동일한 네트워크 구성을 사용하여 Amazon ECS 서비스를 생성합니다.
$ aws ecs create-service --cluster <example-cluster-name> --task-definition <example-task-definition-name> --network-configuration awsvpcConfiguration="{subnets=[example-subnet-XXXXXXX, example-subnet-XXXXXXX],securityGroups=[example-sg-XXXXXXXXXXXX],assignPublicIp=ENABLED}" --enable-execute-command --service-name <example-service-name> --desired-count 1 --launch-type FARGATE --region <example-region>

참고: example-cluster-name을 클러스터 이름으로, example-task-definition-name을 작업 정의 이름으로, example-service-name을 서비스 이름으로, example-region을 AWS 리전으로 바꾸세요.

  1. Exec을 실행하여 Amazon ECS Fargate 작업 컨테이너에 액세스하고 지정된 container-nametask-id에 대해 /bin/sh 명령을 실행합니다.
$ aws ecs execute-command --cluster <example-cluster-name> --task <example-task-id> --container <example-container-name> --interactive --command "/bin/sh" --region <example-region>

참고: example-cluster-name을 클러스터 이름으로, example-task-id를 작업 ID로, example-container-name을 컨테이너 이름으로, example-region을 리전으로 바꾸세요.

Fargate 작업에서 ECS Exec을 사용하는 데 여전히 문제가 있는 경우 여기(article_33538의 URL 대기 중)에서 ISHAN의 문서를 참조하세요.

Fargate 작업과 해당 AWS 서비스 간의 연결 테스트

부족한 IAM 권한 문제 해결

Fargate 작업에 해당 AWS 서비스에 연결하기에 충분한 IAM 권한이 있는지 확인합니다. 필수 AWS 서비스에 대해 AWS CLI 명령을 실행하려면 AWS CLI 명령 참조 가이드를 참조하세요.

Fargate 작업과 Amazon Simple Notification Service(SNS) 간의 연결 테스트 예시:

# aws sns list-topics --region <example-region-name>

다음 오류가 표시되면 Amazon VPC 엔드포인트 정책을 확인하세요. 정책에서 AWS 서비스에 대해 필요한 작업을 수행할 수 있는 액세스를 허용하는지 확인하세요.

An error occurred (AuthorizationError) when calling the ListTopics operation: User: arn:aws:sts::123456789012:assumed-role/TaskRole/123456789012 is not authorized to perform: SNS:ListTopics on resource: arn:aws:sns:<region-name>:123456789012:* with an explicit deny in a VPC endpoint policy

다음 오류가 표시되면 Amazon ECS 작업 IAM 역할의 권한을 확인하세요. IAM 역할에 AWS 서비스에서 필요한 작업을 수행하는 데 필요한 권한이 있는지 확인하세요.

An error occurred (AuthorizationError) when calling the ListTopics operation: User: arn:aws:sts::123456789012:assumed-role/TaskRole/123456789012 is not authorized to perform: SNS:ListTopics on resource: arn:aws:sns:<region-name>:123456789012:* because no identity-based policy allows the SNS:ListTopics action

**참고:**Fargate 작업에서 AWS CLI 명령을 실행할 때 오류가 표시되지 않으면 해당 AWS 서비스에 필요한 IAM 권한이 있는 것입니다.

연결 타임아웃 오류 문제 해결

  1. # telnet을 사용하여 Fargate 작업에서 AWS 서비스 엔드포인트에 대한 네트워크 연결을 테스트하세요.
# telnet <EXAMPLE-ENDPOINT> <EXAMPLE-PORT>

참고: EXAMPLE-ENDPOINT는 AWS 서비스 엔드포인트 이름 및 URL로, EXAMPLE-PORT는 AWS 서비스 포트로 교체하세요.

다음 예제 출력은 컨테이너에서 엔드포인트에 액세스할 수 있음을 보여줍니다.

Trying 10.0.1.169...
Connected to sns.us-east-1.amazonaws.com.
Escape character is '^]'.

# dig <EXAMPLE-ENDPOINT>

# nslookup <EXAMPLE-ENDPOINT>

리전의 AWS 서비스 엔드포인트 목록은 AWS 서비스의 서비스 엔드포인트 및 할당량을 참조하세요.

참고: 애플리케이션 컨테이너에 telnetdig을 설치하지 않았다면 apt-get updateapt install dnsutilsapt install telnet 명령을 실행하여 설치하세요. amazon/aws-cli 기반 컨테이너의 경우 yum update, yum install telnet, yum install bind-utils 명령을 사용하여telnet과 기타 도구를 설치합니다.

  1. AWS 서비스 엔드포인트에 대한 네트워크 연결을 테스트한 후 Connection timed out(연결 시간 초과) 오류가 발생하는 경우 네트워크 구성을 검사하세요.

nslookup 명령을 실행합니다. VPC CIDR IP 범위가 표시되면 트래픽이 VPC 엔드포인트를 통해 라우팅되고 있는 것입니다.

# nslookup sns.us-east-1.amazonaws.com

Non-authoritative answer:
Name:    sns.us-east-1.amazonaws.com
Address: 10.0.1.169
Name:    sns.us-east-1.amazonaws.com
Address: 10.0.2.248

Connection timed out 오류의 경우 VPC 엔드포인트 보안 그룹의 인바운드 규칙을 확인합니다. 포트 443을 통한 TCP 트래픽이 ECS 보안 그룹 또는 VPC CIDR의 인바운드 규칙에 허용되는지 확인하세요. 자세한 내용은 게이트웨이 및 인터페이스 VPC 엔드포인트의 연결 문제를 해결하려면 어떻게 해야 하나요?를 참조하세요.

  • 리전에 Amazon VPC 엔드포인트가 구성되어 있지 않은 경우 서브넷에서 인터넷으로 연결되는 경로를 확인합니다. 퍼블릭 서브넷의 Fargate 작업의 경우 작업에 인터넷 게이트웨이에 대한 기본 경로가 있는지 확인합니다. 프라이빗 서브넷의 Fargate 작업의 경우 작업에 기본 경로가 있는지 확인합니다. 작업에는 NAT 게이트웨이, AWS PrivateLink, 또 다른 인터넷 연결 소스 또는 로컬 및 VPC CIDR로 연결되는 기본 경로가 필요합니다.
  • 네트워크 ACL이 AWS 서비스에 대한 액세스를 허용하는지 확인하세요.
  • 보안 그룹의 인바운드 규칙이 Fargate 작업으로 액세스하려는 AWS 서비스에 연결되어 있는지 확인합니다. 필요한 포트를 통한 인그레스 트래픽을 허용합니다.
  • Fargate 작업 보안 그룹의 아웃바운드 규칙이 AWS 서비스에 연결하는 데 필요한 포트를 통한 이그레스 트래픽을 허용하는지 확인합니다.
AWS 공식
AWS 공식업데이트됨 일 년 전