AWS

[Re18특집] Amazon Cloud Map 서비스 출시

여기서 다루는 내용

· Intro
· 서비스 간단 소개 
· 리소스 등록 및 검색 확인
· 마무리


Intro


이번 Re:Invent 2018 에서 Amazon Cloud Map 서비스가 출시되었습니다.

Amazon Cloud Map 서비스를 통해서 클라우드 리소스를 논리적 이름으로 매핑하고 이를 검색 및 필터링 할 수 있습니다.

이번 포스팅에서는 해당 서비스 간단 소개 및 확인을 해보겠습니다.


서비스 간단 소개


:: 서비스 주요 기능

  • 완전 관리형 서비스로 기존 Route53 Auto Naming API 기능 확장
  • 사용자 정의 이름으로 매핑되는 리소스들 지정 가능
  • 각 리소스에 custom attribute 지정 가능 ex) prod/dev, version 등
  • 리소스 조회 방식
    • DNS 조회
      • Route53 hosted zone에 자동 매핑된 DNS 레코드 조회
      • Record type : A, AAAA, SRV, CNAME
    • API 호출
      • API 호출 방식의 리소스 조회
      • AWS Cloud Map의 DiscoverInstances API 호출
  • Cloud Map 액세스 방식
    • AWS Management Console, AWS SDK, AWS Cloud Map API, AWS CLI, AWS Tools for Windows PowerShell
    • AWS Management Console에서는 일부 기능 미지원
  • Amazon Rout53 헬스 체크를 통한 Cloud Map 리소스들 헬스 체크
  • 컨테이너 서비스 연동
    • Amazon ECS/Fargate: Service discovery 기능을 통한 컨테이너 리소스 연동
    • Amazon EKS: 오픈소스  ExternalDNS 별도 설치 및 Route53 DNS를 연동하여 실행 중인 서비스의 외부 IP를 등록 및 업데이트

이미지 출처: AWS Cloud Map Overview

:: 요금

  • 등록 된 서비스 리소스 당 $0.10/월
  • HTTP API Call 100 만건 당 $1.00

요금 관련 자세한 내용은 여기 참고 바랍니다.


리소스 등록 및 확인


:: Cloud Map 등록 절차

  • Namespace 생성
  • Service 생성
  • Service Instance 등록

:: Namespace 생성

먼저 콘솔에서 Create namespace를 선택하고 Namespace name 및 Inatance discovery를 선택합니다.

Instance discovery 선택지가 3개가 나오는데 주요 특징은 아래와 같습니다.

선택 유형 조회 가능 방식 Route 53 Hosted Zone
생성 여부
Health check 옵션
API calls – API calls N/A – Route 53 health check
– Custom health check
API calls and
DNS queries in VPCs
– API calls
– Private DNS queries
– Private Hosted Zone 생성 – Custom health check
API calls and
public DNS queries
– API calls
– Public DNS queries
– Public Hosted Zone 생성 – Route 53 health check
– Custom health check

여기서는  Instance discovery를  ‘API calls and DNS queries in VPCs’ 로 선택합니다.

:: Service 생성

위에서 생성된 Namespace에서 Create service 를 눌러 Service 를 생성합니다.

Instance discovery 선택지에서 ‘API calls and DNS queries in VPCs’를 선택하였으므로 DNS 설정 부분이 있습니다. 여기서는 CNAME을 선택합니다.

헬스 체크 설정을 체크합니다.  ‘API calls and DNS queries in VPCs’를 선택하였으므로 Custom health check를 선택 합니다.

:: Service Instance 등록 및 확인

위에서 생성된 Service에서 Register service instance 를 눌러 service instance를 등록합니다.

Standard Attributes를 입력하고, Custom attributes도 추가 합니다.

등록이 완료되면 아래 이미지와 같이 등록된 인스턴스의 ID와 Health 상태가 표시됩니다.

Route53 으로 이동하면 Namespace와 동일한 private Route53 host zone이 자동 생성 되고,

위에서 등록한 리소스의 Record도 확인 됩니다.

:: 등록된 리소스 검색

먼저 위에서 등록한 리소스를 namespace, service 이름으로 검색하면 정상적으로 나옵니다.

[ec2-user@ip-172-31-30-148 ~]$ aws servicediscovery discover-instances \
> --namespace-name gstest --service-name testservice
{
    "Instances": [
        {
            "InstanceId": "webapp1",
            "NamespaceName": "gstest",
            "ServiceName": "testservice",
            "HealthStatus": "HEALTHY",
            "Attributes": {
                "AWS_INSTANCE_IPV4": "172.31.43.81",
                "ver": "1.0",
                "env": "prod"
            }
        }
    ]
}

리소스를 하나 Custom Attribute를 위와 다르게 ver=2.0으로 변경해서 추가 등록합니다.

[ec2-user@ip-172-31-30-148 ~]$ aws servicediscovery register-instance \
> --service-id srv-f6ablk2t5cgmgkxb --instance-id webapp2 \
> --attributes AWS_INSTANCE_IPV4=172.31.30.148,env=prod,ver=2.0
{
 "OperationId": "533brlcjkneaj5rljl3cgsiky4vpbv7g-jpuk9x12"
}

우선 “env=prod” 조건으로 검색시 필터링하면 조건에 맞는 리소스 두개가 조회됩니다.

[ec2-user@ip-172-31-30-148 ~]$ aws servicediscovery discover-instances \
> --namespace-name gstest --service-name testservice \
> --query-parameters env=prod
{
    "Instances": [
        {
            "InstanceId": "webapp1",
            "NamespaceName": "gstest",
            "ServiceName": "testservice",
            "HealthStatus": "HEALTHY",
            "Attributes": {
                "AWS_INSTANCE_IPV4": "172.31.43.81",
                "ver": "1.0",
                "env": "prod"
            }
        },
        {
            "InstanceId": "webapp2",
            "NamespaceName": "gstest",
            "ServiceName": "testservice",
            "HealthStatus": "HEALTHY",
            "Attributes": {
                "AWS_INSTANCE_IPV4": "172.31.30.148",
                "ver": "2.0",
                "env": "prod"
            }
        }
    ]
}

“ver=2.0” 조건으로 필터링하여 검색하면 조건에 맞는 리소스 하나만 조회됩니다.

[ec2-user@ip-172-31-30-148 ~]$ aws servicediscovery discover-instances \
> --namespace-name gstest --service-name testservice \
> --query-parameters ver=2.0
{
    "Instances": [
        {
            "InstanceId": "webapp2",
            "NamespaceName": "gstest",
            "ServiceName": "testservice",
            "HealthStatus": "HEALTHY",
            "Attributes": {
                "AWS_INSTANCE_IPV4": "172.31.30.148",
                "ver": "2.0",
                "env": "prod"
            }
        }
    ]
}

DNS 질의를 하면 해당 IP 검색이 되고, TTL이 자동으로 300초로 설정되었므로 300초 이후 다시 질의해보니 등록된 다른 IP도 검색이 됩니다.

[ec2-user@ip-172-31-43-81 ~]$ dig +short testservice.gstest
172.31.43.81
[ec2-user@ip-172-31-43-81 ~]$ dig +short testservice.gstest
172.31.30.148

:: 리소스 ARN 등록 및 API Calls 테스트

이번에는 API Calls 형식의 namespace 및 service를 생성합니다. API Calls 형식으로 생성을 하게되면 DNS 질의를 할 수 없습니다.

[ec2-user@ip-172-31-30-148 ~]$ aws servicediscovery create-http-namespace \
> --name httpnamespace
{
    "OperationId": "nysnwtlr7lpzyhi5undwvux73wuzaade-jpthhyb6"
}
[ec2-user@ip-172-31-30-148 ~]$ aws servicediscovery create-service \
 --name apicallservice --namespace-id ns-wqpirkiocccvc2jk
{
    "Service": {
        "Name": "testservice",
        "DnsConfig": {},
        "CreateDate": 1545121735.129,
        "CreatorRequestId": "f86379db-394c-49e7-95e8-bb50aedd264b",
        "Id": "srv-tpq6vlzdw4gm65at",
        "NamespaceId": "ns-zd6szir6rd7hxnen",
        "Arn": "arn:aws:servicediscovery:ap-northeast-1:00000000000:service/srv-tpq6vlzdw4gm65at"
    }
}

생성된 service에 S3 ARN을 등록하고 검색하면 등록된 ARN이 검색되는 부분 확인 됩니다.

[ec2-user@ip-172-31-30-148 ~]$ aws servicediscovery register-instance \
> --service-id srv-tpq6vlzdw4gm65at --instance-id s3test \
> --attributes ARN=arn:aws:s3:::gstest-cloudmap,env=prod,ver=2.0
{
 "OperationId": "foomxra2ikqutisjb23xqyfbkvewew4c-jpukm31w"
}
[ec2-user@ip-172-31-30-148 ~]$ aws servicediscovery discover-instances \
> --namespace-name httpnamespace --service-name testservice
{
    "Instances": [
        {
            "InstanceId": "s3test",
            "NamespaceName": "httpnamespace",
            "ServiceName": "testservice",
            "HealthStatus": "UNKNOWN",
            "Attributes": {
                "ver": "2.0",
                "ARN": "arn:aws:s3:::gstest-cloudmap",
                "env": "prod"
            }
        }
    ]
}

마무리


Standard/Custom Attribute 필터링을 통한 관련 리소스 검색 기능과 Route53 Auto Naming API 기능의 장점이 결합되니 수월하게 리소스들을 유지관리할 수 있게 되었습니다.

이상으로 Amazon Cloud Map 서비스를 간단 확인해보았습니다.

5/5 - (평가 개수 : 2)

필자: GS Neotek

전체 게시물수 : 236

전체 조회수 : 4750

게시물 공유하기