VPC Endpoint 생성 시, 충돌 발생 무엇이 문제일까?

VPC Endpoint 생성 시, 충돌이 발생하는 이유가 무엇이 문제인지 정리해 봤습니다.
2022.09.22

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 VPC Endpoint 생성 시, 충돌이 발생하는 이유가 무엇이 문제인지 정리해 봤습니다.

문제 발생

private-dns-enabled cannot be set because there is already a conflicting DNS domain for ssm.ap-northeast-1.amazonaws.com in the VPC

VPC Endpoint를 생성했더니, 다음과 같은 에러가 발생했습니다.

충돌이 발생하는 이유는 다음과 같습니다.

  • VPC에 동일한 서비스에 대한 인터페이스 VPC 엔드포인트가 이미 있습니다.
  • VPC가 의도한 서비스 이름을 포함하는 프라이빗 호스팅 영역과 이미 연결되어 있습니다.

VPC Endpoint 목록을 살펴보면, 이미 VPC Endpoint가 생성되어 있는 상태입니다.

VPC에 동일한 서비스에 대한 인터페이스 VPC Endpoint가 있기 때문에 충돌이 발생해 생성이 되지 않는 것 입니다.

해결 방법에 대해서는 다음과 같이 기술하고 있습니다.

인터페이스 엔드포인트 생성 시 PrivateDNS를 켜면 프라이빗 호스팅 영역이 자동으로 생성되어 VPC와 연결됩니다. AWS 서비스 및 AWS Marketplace 파트너 서비스에는 기본적으로 PrivateDNS가 켜져 있습니다. 따라서, PrivateDNS가 켜져 있는 동일한 서비스에 대한 두 번째 인터페이스 VPC 엔드포인트를 생성하면 DNS 도메인 충돌 오류가 발생합니다. 이 문제를 해결하려면, 인터페이스 엔드포인트 생성 시 PrivateDNS 옵션을 꺼줍니다. 해당 서비스의 두 번째 VPC 인터페이스 엔드포인트에 엔드포인트별로 DNS 호스트 이름을 사용합니다.

즉, PrivateDNS가 켜져있으면 DNS 도메인 충돌이 발생하기 때문에 VPC Endpoint를 생성할 수 없다는 것과, 추가적으로 동일한 서비스의 VPC Endpoint를 생성하고 싶으면 PrivateDNS 옵션을 꺼야한다는 것 입니다.

동일한 서비스를 생성하기 위해서는 VPC Endpoint를 생성할 때「DNS 이름 활성화」체크를 해제하면 됩니다.

그러면 문제 없이 동일한 VPC Endpoint 서비스를 생성할 수 있습니다.

그렇다면「DNS 이름 활성화」를 체크를 해제한 상태로 Private Subnet의 EC2 Instance에 SSM 접속이 가능할까요?

「DNS 이름 활성화」를 체크를 해제한 상태로 다음 3개의 VPC Endpoint 서비스를 생성했습니다.

Private Subnet의 EC2 Instance로 들어가서 확인해 보면, SSM으로 접속이 불가능한 상황입니다.

그렇다면 현재 Private Subnet의 EC2 Instance는 어떤 상태일까요?

Bastion Host를 통해서 Private Subnet의 EC2 Instance로 접속한 다음, nslookup 명령어를 통해 VPC Endpoint 서비스의 상태를 살펴보도록 하겠습니다.

현재 Private Subnet의 EC2 Instance와 Bastion Host 서버를 생성한 상태입니다.

Bastion Host에서 Private Subnet의 EC2 Instance에 접속하는 방법에 대해서는 아래 블로그를 참고해 주세요.

Private Subnet의 EC2 Instance에 접속 했다면, 아래 명령어를 통해 DNS 레코드 정보를 확인합니다.

  • nslookup ssm.ap-northeast-1.amazonaws.com
  • nslookup ec2messages.ap-northeast-1.amazonaws.com
PS C:\Users\Administrator> nslookup ssm.ap-northeast-1.amazonaws.com
Server: ip-10-0-0-2.ap-northeast-1.compute.internal
Address: 10.0.0.2

Non-authoritative answer:
Name: ssm.ap-northeast-1.amazonaws.com
Address: 52.119.221.73

PS C:\Users\Administrator> nslookup ec2messages.ap-northeast-1.amazonaws.com
Server: ip-10-0-0-2.ap-northeast-1.compute.internal
Address: 10.0.0.2

Non-authoritative answer:
Name: ec2messages.ap-northeast-1.amazonaws.com
Address: 54.240.225.178

결과를 확인해 보면 Private IP 주소가 아닌, Public IP 주소를 반환하고 있는 것을 확인할 수 있습니다.

기본적으로 VPC를 생성하면 default DHCP Option Set을 사용하는데, 여기에 설정되어 있는「도메인 이름 서버」가 Amazon Provided DNS입니다.

이 Amazon Provided DNS를 통해서만 프라이빗 호스팅 영역에 대한 DNS 쿼리를 할 수 있습니다.

즉, 기본적으로 프라이빗 호스팅 영역에 대한 DNS 쿼리는 Amazon Provided DNS 서버에서만 해결됩니다.

하지만 현재 VPC Endpoint 서비스 생성시「DNS 이름 활성화」체크를 해제 했기 때문에, 도메인 이름 서버인 Amazon Provided DNS를 참조할 수 없는 상태가 되어, SSM으로 접속이 불가능하게 된 것입니다.

DNS 이름 활성화를 체크하게 되면, Amazon Provided DNS를 참조하게 되어, Private IP를 반환하게 됩니다.

자세한 사항은 아래 블로그를 참고해 주세요.

「DNS 이름 활성화」를 다시 하기 위해서는 작업에서「프라이빗 DNS 이름 수정」을 클릭합니다.

이어서「이 엔드포인트에 대해 활성화」를 체크하고 저장합니다.

PS C:\Users\Administrator> nslookup ssm.ap-northeast-1.amazonaws.com
Server: ip-10-0-0-2.ap-northeast-1.compute.internal
Address: 10.0.0.2

Non-authoritative answer:
Name: ssm.ap-northeast-1.amazonaws.com
Addresses: 10.0.149.192
10.0.128.31

다시 nslookup으로 확인해 보면 정확히 Private IP를 반환하고 있는 것을 확인할 수 있습니다.

동일한 서비스를 생성해 본 이유?

생성해 본 이유는 VPC Endpoint를 생성할 때, 각 서브넷을 선택하게 되는데, 해당 서브넷에서만 VPC Endpoint 서비스가 적용될까? 라는 곳에서 부터 시작 했습니다.

테스트를 위해 VPC Endpoint 생성시 선택한 서브넷이 아닌 별도의 서브넷을 하나 생성 했습니다.

라우팅 테이블 또 한 별도로 생성한 상태입니다.

이제 EC2 Instance를 생성해서 확인해 보면 SSM 접속이 가능한 것을 확인할 수 있습니다.

VPC Endpoint 생성시 선택한 서브넷이 아니더라도 SSM 접속이 가능하다는 것은, 동일한 VPC면 어떤 서브넷이건 VPC Endpoint 서비스가 적용 된다는 것을 의미 합니다.

그렇다면 2개의 서브넷을 선택하는 이유는 무엇일까요?

서브넷에 엔드포인트 네트워크 인터페이스가 생성됩니다. 엔드포인트 네트워크 인터페이스에 서브넷의 IP 주소 범위에 속하는 프라이빗 IP 주소가 할당되며, 이 IP 주소는 인터페이스 엔드포인트가 삭제될 때까지 유지됩니다. 다른 가용 영역(서비스에서 지원하는)에 두 개 이상의 서브넷을 지정하여 가용 영역 실패 시 인터페이스 엔드포인트가 회복할 수 있게 만들 수 있습니다.

공식문서에 따르면 다음과 같습니다.

단일 장애점을 없애기 위해 두 개 이상의 서브넷을 지정한다는 것입니다.

즉, 가용성을 위한 선택이라 보면 될 것 같습니다.

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !

참고