AWS Cloud Map을 사용하여 ECS 서비스에 대한 교차 계정 서비스 검색을 설정하려면 어떻게 해야 하나요?

5분 분량
0

AWS Cloud Map을 사용하여 Amazon Elastic Container Service(Amazon ECS) 서비스에 대한 교차 계정 서비스 검색을 설정하려고 합니다.

간략한 설명

AWS Cloud Map에 프라이빗 네임스페이스를 생성하면 Amazon Route 53 호스팅 영역도 생성됩니다. Route 53 호스팅 영역은 Amazon Virtual Private Cloud(Amazon VPC)와 연결되어 있기 때문에 DNS 레코드를 검색할 수 있습니다. 따라서 다른 AWS 계정과 Amazon VPC는 DNS를 통해 Amazon ECS 서비스를 검색할 수 없습니다.

사전 조건:

  • 필수 서브넷, 보안 그룹 및 중복되지 않는 CIDR이 있는 동일하거나 다른 계정에 있는 두 개의 Amazon VPC
  • 특성 enableDnsHostnamesenableDnsSupport가 모두 켜져 있는 AmazonProvidedDNS를 사용하는 두 Amazon VPC
  • 하나의 Amazon ECS 클러스터
  • 적절한 권한으로 설치 및 구성된 최신 버전의 AWS Command Line Interface(AWS CLI)

참고: AWS CLI를 실행할 때 오류가 발생하면 최신 버전의 AWS CLI를 실행하고 있는지 확인합니다.

해결 방법

중요: 다음 단계에서는 대상 Amazon VPC, 소스 Amazon VPC 및 Amazon ECS 클러스터에 대한 예제를 사용합니다. AWS CLI에서 example 값을 사용자 값으로 바꿉니다.

  • 예제 Amazon ECS 클러스터 example-cluster는 AWS 계정 1에 있습니다.
  • 예제 대상 Amazon VPC example-target-vpc는 Amazon ECS 태스크를 호스팅하며 AWS 계정 1에 있습니다.
  • 예제 소스 Amazon VPC example-source-vpc는 DNS 쿼리를 수행하며 AWS 계정 2에 있습니다.

네임스페이스 및 AWS Cloud Map 서비스 생성

1.    계정 1의 자격 증명으로 AWS CLI를 구성합니다.

2.    계정 1에 프라이빗 AWS Cloud Map 서비스 검색 네임스페이스를 생성합니다.

$ aws servicediscovery create-private-dns-namespace --name example-namespace  --vpc example-target-vpc

참고: 위 명령은 example-namespace라는 이름의 네임스페이스를 만들고 OperationID를 JSON의 출력으로 반환합니다.

3.    OperationId를 사용하여 네임스페이스 및 네임스페이스 ID의 상태를 확인합니다.

$ aws servicediscovery get-operation --operation-id <example-OperationId> --query 'Operation.{Status: Status, NamespaceID: Targets.NAMESPACE}'

4.     네임스페이스와 연결된 호스팅 영역 ID를 찾습니다.

$ aws servicediscovery get-namespace --id <example-NamespaceID> --query 'Namespace.Properties.DnsProperties.{HoztedZoneId: HostedZoneId}'

5.    네임스페이스 ID를 사용하여 AWS Cloud Map 서비스를 생성합니다.

$ aws servicediscovery create-service \
    --name myservice \
    --namespace-id  <example-NamespaceID> \
    --dns-config "NamespaceId=<example-NamespaceID>,RoutingPolicy=MULTIVALUE,DnsRecords=[{Type=A,TTL=60}]"

참고: 위 명령은 example-myservice라는 이름의 AWS Cloud Map 서비스를 생성하고 서비스 ARN을 출력으로 반환합니다.

awsvpc 네트워크 모드를 사용하는 태스크 정의 등록

AWS Fargate와 호환되고 awsvpc 네트워크 모드를 사용하는 태스크 정의를 등록합니다.

1.    다음 태스크 정의 내용이 포함된 fargate-task.json이라는 이름의 파일을 생성합니다.

{
    "family": "tutorial-task-def",
        "networkMode": "awsvpc",
        "containerDefinitions": [
            {
                "name": "sample-app",
                "image": "httpd:2.4",
                "portMappings": [
                    {
                        "containerPort": 80,
                        "hostPort": 80,
                        "protocol": "tcp"
                    }
                ],
                "essential": true,
                "entryPoint": [
                    "sh",
                    "-c"
                ],
                "command": [
                    "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
                ]
            }
        ],
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "256",
        "memory": "512"
}

2.    fargate-task.json 파일을 사용하여 태스크 정의를 등록합니다.

$ aws ecs register-task-definition --cli-input-json file://fargate-task.json

Amazon ECS 서비스 생성

1.    ecs-service-discovery.json이라는 파일을 생성하고 생성 중인 Amazon ECS 서비스의 콘텐츠를 포함합니다.

  • launchTypeFARGATE로 지정합니다.
  • platformVersion을 최신 버전으로 지정합니다.
  • securityGroupssubnets 파라미터가 example-target-vpc에 속하는지 확인합니다. Amazon VPC 콘솔에서 보안 그룹 및 서브넷 ID를 가져올 수 있습니다.

참고: 태스크 정의는 awsvpc 네트워크 모드를 사용하므로 awsvpcConfiguration이 필요합니다.

예제 JSON 파일:

{
    "cluster": "example-cluster",
    "serviceName": "ecs-service-discovery",
    "taskDefinition": "tutorial-task-def",
    "serviceRegistries": [
       {
          "registryArn": "<Cloudmap service ARN>"
       }
    ],
    "launchType": "FARGATE",
    "platformVersion": "example-latest-version",
    "networkConfiguration": {
       "awsvpcConfiguration": {
          "assignPublicIp": "ENABLED",
          "securityGroups": [ "example-target-vpc-sg" ],
          "subnets": [ "example-target-vpc-subnet" ]
       }
    },
    "desiredCount": 1
}

2.    ecs-service-discovery.json 파일을 사용하여 Amazon ECS 서비스를 생성합니다.

$ aws ecs create-service --cli-input-json file://ecs-service-discovery.json

3.    서비스 태스크가 AWS Cloud Map 서비스에 인스턴스로 등록되었는지 확인합니다.

$ aws servicediscovery list-instances --service-id <example-cloud-map-service-id>

참고: 이제 example-target-vpc내에서 Amazon ECS 서비스를 검색할 수 있습니다.

소스 Amazon VPC를 Route 53 호스팅 영역에 연결합니다.

1.    Amazon VPC가 서로 다른 계정에 있는 경우 계정 2에 Amazon VPC 연결 권한 부여 요청을 제출하십시오.

$ aws route53 create-vpc-association-authorization --hosted-zone-id <example-HoztedZoneId>  --vpc VPCRegion=<example_VPC_region>,VPCId=<example-source-vpc>

2.    계정 2의 자격 증명으로 awscli를 구성하고 계정 2의 example-source-vpc를 계정 1의 호스팅 영역과 연결합니다.

$ aws route53 associate-vpc-with-hosted-zone --hosted-zone-id <example-HoztedZoneId> --vpc VPCRegion=<example_VPC_region>,VPCId=<example-source-vpc>

3.    example-source-vpc가 호스팅 영역에 추가되었는지 확인합니다.

aws route53 get-hosted-zone --id <example-HoztedZoneId> --query 'VPCs'

4.    example-source-vpc에서 DNS를 통해 Amazon ECS 서비스를 검색할 수 있는지 확인합니다. example-source-vpc를 사용하여 아마존 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 DNS를 쿼리합니다.

$ dig +short example-service.example-namespace

참고: 위 명령에서 example-service.example-namespace는 DNS 이름입니다. AWS Cloud Map 서비스 및 네임스페이스로 교체하십시오.

Amazon VPC 피어링 설정

1.    Amazon VPC 피어링을 사용하여 example-target-vpcexample-source-vpc에 연결합니다.

2.    라우팅 테이블을 업데이트합니다.

3.    보안 그룹을 업데이트합니다.

참고: 라우팅 테이블 및 보안 그룹을 사용하여 Amazon VPC 피어링을 설정한 후에는 example-source-vpc의 리소스를 example-target-vpc의 Amazon ECS 태스크에 연결할 수 있습니다.

Amazon VPC 피어링 설정 시 문제가 발생하는 경우 다음 AWS 지식 센터 문서를 참조하십시오.

AWS 공식
AWS 공식업데이트됨 일 년 전