이것이 점프 투 공작소

AWS CloudMap 과 Route53 PrivateNameSpace를 이용한 ECS Fargate 디스커버리 구현하기, EC2를 CloudMap에 등록하기 본문

aws

AWS CloudMap 과 Route53 PrivateNameSpace를 이용한 ECS Fargate 디스커버리 구현하기, EC2를 CloudMap에 등록하기

겅겅겅 2023. 5. 14. 10:53

 

cloudMap에 AWS리소스를 등록하고 만들어진 cloudMap 서비스를

Route53의 private-namespace에 도메인을 등록하여 ECS의 리소스들을 vpc 내에서 디스커버리를 하는법을 정리하려 합니다.

 

전체적인 흐름은 다음과 같습니다.

 

1. private-dns-namespace과 CloudMap 생성        ->        2.CloudMap 서비스 생성

3. CloudMap서비스에 Fargate 서비스 등록          ->         4. 동일 vpc내 bastian-host에서 디스커버리 dns 조회

 

1. pirvate dns namespace 생성

aws servicediscovery create-private-dns-namespace \
      --name '생성될 네임스페이스이름' \
      --vpc '네임스페이스를 생성할 vpc-id'

먼저 private-dns-namespace를 생성합니다.

생성이 완료되면 operation-id를 반환받게됩니다.

 

추가로 너무 namespace 이름으로 -을 사용하니 route53에서 네임스페이스를 잘 못찾았습니다.

제대로 했는데도 안되는거같으시면 namespace 이름에 -을 빼보시면 좋을거같습니다..

생성된 private-dns-namespace 조회

아래 명령어를 사용하여 해당 operation-id를 조회하면 생성된 private-dns-namespace의 정보를 확인 할 수 있습니다.

아니면 AWS 웹에 접속해서 만들어진 private-dns-namespace의 정보를 확인 할 수 있습니다.

aws servicediscovery get-operation \
      --operation-id '생성된 private-dns-namespace의 operation-id'

 

만들어진 namespace의 정보를 웹에서도 확인 할 수 있습니다.

route53 영역에도 cloudMap을 통해 생성된 private-dns-namespace를 확인할 수 있습니다.

route53에서 확인한 private-namespace

2. route53의 pirvate-dns-namespace 과 연동되는 cloudMap 서비스 생성하기

아래 명령어를 통해 private-dns-namespace와 연동되는 cloudMap서비스를 생성합니다.

aws servicediscovery create-service \
  --name '생성될 cloudMap 서비스 명' \
  --namespace-id '생성한 pirvate-dns-namespace-id' \
  --dns-config "NamespaceId='생성한 pirvate-dns-namespace-id',DnsRecords=[{Type=A,TTL=60}]" \
  -—health-check-custom-config FailureThreshold=1

위 명령어에서는 지정하지 않았지만 디스커버리 시 사용할 RoutingPolicy또한 지정 할 수 있습니다.

지정하지 않을 경우 기본값인 Multivalue라우팅이 지정됩니다.

아래 2가지 라우팅을 지정 가능합니다.

 

  • 가중치 기반 라우팅 (Weighted) : 어떤 인스턴스로 더 많은 라우팅이 될지 지정 할 수 있는 정책입니다. CNAME에서 사용됩니다.
  • 멀티값 라우팅 (Multivalue) : RoutingPolicy를 지정하기 않으면 사용되는 기본값입니다. 건강한 인스턴스에 대해 랜덤으로 라우팅합니다. A레코드와 AAAA레코드에 사용 가능합니다.

-- dns-config 명령어는 Amazon Route 53 레코드에 대한 값들을 지정합니다.

명령어를 통해  지정 가능한 DnsRecords들은 다음과 같습니다.

 

  1. A: 만들어질 도메인 주소를 IPv4 와 매핑합니다.
  2. AAAA: 만들어질 도메인 주소를 IPv6 와 매핑합니다.
  3. CNAME: 만들어질 도메인 주소를 다른 도메인과 매핑합니다
  4. TXT: 만들어질 도메인 주소를 텍스트 문자열과 매핑합니다.
  5. SRV: 만들어질 도메인 주소를 특정 서비스와 포트 번호에 매핑, public-namespace에서는 사용 할 수 없습니다.

생성된 cloudMap 서비스 조회

명령어의 리턴값으로 생성된 cloudMap서비스에 대한 정보를 받을 수 있습니다.

저는 user라는 cloudMap 서비스를 만들었습니다.

명령어로 생성된 cloudMap 서비스의 리턴결과

AWS 웹에서도 확인 할 수 있습니다.

3. 만들어진 cloudMap Service에 리소스 등록하기

 

3-1 ECS클러스터 생성

생성 시 앞서 만들어 두었던 private-dns-namespace를 지정합니다.

 

3-2 ECS에서 Service에서 사용할 task-definition 을 생성합니다.

간단한 nginx 이미지로 task를 미리 만들어두었습니다.

 

3-3 Fargate Service 실행

아래 명령어로 ECS 서비스를 실행시킵니다.

aws ecs create-service \
      --cli-input-json file://nginxService.json

 

위 명령어에서 실행되는 json파일은 다음과 같습니다.

혹시 fargate가 아니라 ec2를 사용하는 ECS에 서비스를 배포하시려면

launchType과 platformVersion을 지우고 ECS의 용량공급자 관련 설정을 추가해주시면 됩니다.

{
    "cluster": "discovery-test-cluster", # 클러스터이름
    "serviceName": "my-user-serivce", # 생성될 ECS 서비스명
    "taskDefinition": "nginx:39",     # task-definition
    "serviceRegistries": [
       {
          "registryArn": "arn:aws:servicediscovery:ap-northeast-2:038795414938:service/srv-xcjaqcoz5hlqowmu"
       } # cloudMap 서비스의 Arn
    ],
    "launchType": "FARGATE",
    "platformVersion": "LATEST",
    "networkConfiguration": {
       "awsvpcConfiguration": {
          "securityGroups": [ "sg-0a2cdfeb1d137aeb6" ],
          "subnets": [ "subnet-06655d9d209a19ace" ] 
       }
    },
    "desiredCount": 2
}

아래는 위 명령어의 리턴값입니다.

cli-명령의 리턴값입니다.

4. 디스커버리 주소확인

ECS 서비스까지 생성되면 route53 호스팅 영역에서 만들어진 디스커버리 이름을 확인 할 수 있습니다.

 

private-dns-namespace는 vpc내 리소스들끼리만 유효하기에 bastian-host를 만들어 조회할수있습니다.

dig명령어로 조회 결과 user.dev도메인에 route53에 존재하는 A레코드 주소가 반환되었습니다.

 

ECS 서비스가 아닌 일반 EC2를 등록하여 private-dns-namespace 디스커버리하는법

일반적으로 ECS의 Fargate, ALB등의 리소스를 CloudMap에 등록하여 사용하지만

ec2 인스턴스 또한 cloud Map에 등록하여 디스커버리 가능합니다.

 

아래 명령어는 EC2 자신을 CloudMap에 등록하는 명령어입니다. 

aws servicediscovery register-instance \
--service-id 'cloudMap의 서비스id'  \
--instance-id $(ec2-metadata --instance-id | cut -d " " -f 2)  \ # 등록하려는 ec2 instance-id
--attributes Key=Name,Value=$(ec2-metadata --instance-id  | cut -d " " -f 2)  \
--attributes=AWS_INSTANCE_IPV4=$(curl http://169.254.169.254/latest/meta-data/local-ipv4)

 

등록하고자 하는 ec2에 ssh에 접속하여 위 명령어를 실행하면 cloudMap Service에 해당 ec2가 등록됩니다.

자기 자신을 cloudMap Service 등록

route53에서도 등록된 ec2 A레코드를 확인 할 수 있습니다.

 

 

실습에 사용한 더 자세한 cli 명령어들은 아래 주소에서 확인 가능합니다.

https://docs.aws.amazon.com/cli/latest/reference/servicediscovery/index.html

 

servicediscovery — AWS CLI 1.27.133 Command Reference

Note: You are viewing the documentation for an older major version of the AWS CLI (version 1). AWS CLI version 2, the latest major version of AWS CLI, is now stable and recommended for general use. To view this page for the AWS CLI version 2, click here. F

docs.aws.amazon.com