Amazon Web Services 한국 블로그

Amazon ECS와 Amazon ECR의 AWS PrivateLink 설정 방법

Amazon ECSAmazon ECR에서 AWS PrivateLink가 정식으로 지원됩니다. AWS PrivateLink는 AWS 서비스 액세스에 대한 높은 가용성과 확장성을 제공하기 위한 네트워킹 기술입니다. 이 기술을 사용하면 모든 트래픽을 AWS 네트워크 안에 유지할 수 있습니다. ECR 및 ECS에 대한 AWS PrivateLink 엔드포인트 생성 시, 이 서비스 엔드포인트는 VPC 안에 프라이빗 IP 주소를 갖는 탄력적 네트워크 인터페이스로 나타납니다.

AWS PrivateLink가 지원되기 전에는 ECR에 저장된 도커 이미지를 다운로드하거나 ECS Control plane과 통신하려면 Amazon EC2 인스턴스는 인터넷 게이트웨이를 사용해야 했습니다. 퍼블릭 IP 주소가 있는 퍼블릭 서브넷의 인스턴스는 인터넷 게이트웨이를 직접 사용했습니다. 프라이빗 서브넷의 인스턴스는 퍼블릭 서브넷에 호스팅되는 NAT(네트워크 주소 변환) 게이트웨이를 사용하고, NAT 게이트웨이가 인터넷 게이트웨이를 통해 ECR 및 ECS와 통신합니다.

AWS PrivateLink를 사용하면 퍼블릭 서브넷과 프라이빗 서브넷의 인스턴스 모두 프라이빗 연결을 통해 Amazon ECR에서 이미지를 다운로드할 수 있습니다. 또한 인스턴스는 인터넷 게이트웨이나 NAT 게이트웨이가 없어도 AWS PrivateLink 엔드포인트를 통해 ECS Control plane과 통신할 수 있습니다.

 

네트워킹 아키텍처는 단순합니다. 프라이빗 EC2 인스턴스가 AWS 서비스에만 접근을 허용하도록 설정하여 보안을 강화할 수 있습니다. 즉, 인스턴스에 대한 다른 모든 아웃바운드 인터넷 액세스를 차단할 수 있습니다. 이렇게 하려면 아래 AWS PrivateLink 리소스를 생성해야 합니다.

  • ECR에 대한 AWS PrivateLink 엔드포인트 – 이 엔드포인트를 사용하면 VPC의 인스턴스가 ECR와 통신하여 이미지 매니페스트를 다운로드할 수 있습니다.
  • Amazon S3에 대한 게이트웨이 VPC 엔드포인트 – 이 엔드포인트를 사용하면 인스턴스가 이미지 레이어를 호스팅하는 기본 프라이빗 Amazon S3 버킷에서 이미지 레이어를 다운로드할 수 있습니다.
  • ECS에 대한 AWS PrivateLink 엔드포인트 – 이 엔드포인트를 사용하면 인스턴스가 ECS Control plane에서 원격 측정 및 에이전트 서비스와 통신할 수 있습니다.

이 게시물에서는 위에 언급된 세 가지 엔드포인트 리소스를 생성하는 방법을 설명하겠습니다.

ECR에 대한 AWS PrivateLink 인터페이스 엔드포인트 생성

ECR에는 아래 두 가지 인터페이스 엔드포인트가 필요합니다.

  • com.amazonaws.region.ecr.api
  • com.amazonaws.region.ecr.dkr

VPC 콘솔에서 엔드포인트 생성 마법사를 사용하여 ECR에 대한 인터페이스 VPC 엔드포인트를 생성합니다. AWS 서비스를 선택하고 엔드포인트를 선택합니다. 위에 명기된 두 가지 엔드포인트 이름에서 region 부분을 선택한 AWS 리전으로 대체합니다.

그런 다음 AWS PrivateLink 인터페이스를 추가할 VPC 및 서브넷을 지정합니다. 이때 ECS 클러스터가 실행 중인 VPC를 선택해야 합니다. 만일에 대비하여 목록에서 모든 가용 영역과 서브넷을 선택하세요. 가용 영역 별 서브넷 목록이 제공되므로 각 가용 영역의 모든 서브넷을 선택할 수 있습니다.

네트워킹 요구 사항에 따라 각 가용 영역의 프라이빗 서브넷에서 AWS PrivateLink 엔드포인트만 활성화하도록 선택할 수도 있습니다. 이 실습에서는 퍼블릭 서브넷에서 실행 중인 인스턴스가 퍼블릭 서브넷의 인터넷 게이트웨이를 통해 ECR와 계속 통신할 수 있게 허용하겠습니다.

그런 다음 엔드포인트에 필요한 프라이빗 DNS 이름을 활성화합니다.

com.amazonaws.region.ecr.dkr.

프라이빗 호스팅 영역을 사용하면 Amazon ECR 기본 DNS 도메인 이름을 사용하여 VPC의 리소스에 액세스할 수 있습니다. Amazon VPC 엔드포인트에서 제공하는 프라이빗 DNS 호스트 이름이나 프라이빗 IPv4 주소를 사용하지 않아도 됩니다. AWS CLI 및 Amazon ECR SDK가 기본적으로 사용하는 Amazon ECR DNS 호스트 이름(https://api.ecr.region.amazonaws.com)은 VPC 엔드포인트로 연결됩니다.

com.amazonaws.region.ecr.api에 대해 프라이빗 호스팅 영역이 활성화된 상태에서 2019년 1월 24일 이전에 릴리스된 SDK를 사용한다면 SDK나 AWS CLI를 사용할 때 엔드포인트를 지정해야 합니다. 엔드포인트를 지정하려면 다음 명령을 사용하세요.

aws --endpoint-url https://api.ecr.region.amazonaws.com

프라이빗 호스팅 영역을 활성화하지 않았다면 다음 명령을 사용하세요.

aws --endpoint-url https://VPC_Endpoint_ID.api.ecr.region.vpce.amazonaws.com ecr describe-repositories

프라이빗 호스팅 영역을 활성화하고 2019년 1월 24일 이후에 릴리스된 SDK를 사용한다면 다음 명령을 사용하세요.

aws ecr describe-repositories

이제 인터페이스에 적용할 보안 그룹을 지정합니다. 보안 그룹을 사용하여 각 호스트가 인터페이스와 통신할 수 있는지 여부를 제어할 수 있습니다. 적용될 보안 그룹은 클러스터의 인스턴스에서 포트 443에 대한 인바운드 연결을 허용해야 합니다.

Auto Scaling 그룹을 사용하여 클러스터의 모든 EC2 인스턴스에 적용되는 보안 그룹이 있을 수 있습니다. 해당 보안 그룹의 모든 인스턴스가 VPC 엔드포인트에 접근할 수 있도록 허용하는 규칙을 생성할 수 있습니다.

마지막으로 [Create endpoint]를 선택합니다. 그러면 새 엔드포인트가 목록에 나타납니다.

S3에 대한 게이트웨이 VPC 엔드포인트 추가

다음 단계에서는 S3에 대한 게이트웨이 VPC 엔드포인트를 생성합니다. ECR는 S3에 도커 이미지 레이어를 저장하므로 이 작업이 필요합니다. 인스턴스는 ECR에서 도커 이미지를 다운로드할 때 ECR에 액세스하여 이미지 매니페스트를 가져오고 S3에서 실제 이미지 레이어를 다운로드해야 합니다.

S3는 게이트웨이라고 하는 조금 다른 유형의 엔드포인트를 사용합니다. 애플리케이션이 S3를 사용 중이라면 VPC에 S3 게이트웨이를 추가할 때 주의해야 합니다. 게이트웨이 엔드포인트를 추가하는 동안, 애플리케이션과 S3 사이의 기존 연결이 잠시 중단될 수 있습니다. 클러스터에 이미 사용 중인 ECS 배포가 많은 경우에는 S3에서 이미지 레이어 다운로드가 발생하거나, 애플리케이션 자체의 S3 사용량이 많을 수도 있습니다. 이 경우에는 S3 게이트웨이가 있는 VPC를 새로 생성한 다음, ECS 클러스터와 컨테이너를 해당 VPC로 마이그레이션하는 것이 가장 좋습니다.

S3 게이트웨이 엔드포인트를 추가하려면 AWS 서비스 목록에서 com.amazonaws.region.s3를 선택하고, ECS 클러스터를 호스팅하는 VPC를 선택합니다. 그러면 선택한 서브넷의 VPC 라우팅 테이블에 게이트웨이 엔드포인트가 추가됩니다. S3 게이트웨이가 있어야 하는 서브넷과 연결된 라우팅 테이블을 선택하십시오.

게이트웨이 엔드포인트는 보안 그룹 대신 IAM 정책 문서를 사용하여 서비스 액세스를 제한합니다. 이 정책은 IAM 정책과 비슷하지만 애플리케이션이 IAM 역할에서 받은 기본 액세스 수준을 바꾸지 않습니다. 대신 게이트웨이를 통해 사용할 수 있는 서비스 영역을 세부적으로 제한합니다.

기본 Full Access 정책을 사용해도 됩니다. 작업 IAM 역할 또는 기타 IAM 사용자 정책에 대한 제한 사항은 이 정책에 덧붙여서 적용됩니다. 최소 액세스 정책에 대한 내용은 Amazon ECR에 대한 최소 Amazon S3 버킷 권한을 참조하세요.

Create를 선택하여 이 게이트웨이 엔드포인트를 VPC에 추가합니다. VPC 서브넷의 라우팅 테이블을 보면 S3에서 ECR 도커 이미지 레이어가 다운로드될 때마다 사용되는 S3 게이트웨이가 표시됩니다.

ECS에 대한 AWS PrivateLink 인터페이스 엔드포인트 생성

EC2 인스턴스는 ECR에서 도커 이미지를 다운로드하는 것 외에도 ECS Control plane과 통신하여 오케스트레이션 지침을 받아야 합니다.

ECS에는 다음과 같은 세 가지 엔드포인트가 필요합니다.

  • com.amazonaws.region.ecs-agent
  • com.amazonaws.region.ecs-telemetry
  • com.amazonaws.region.ecs

ECR 엔드포인트를 생성한 것과 같은 방법으로 세 가지 인터페이스 엔드포인트를 생성합니다. 각각에 대해 엔드포인트를 추가하고 해당 엔드포인트에 대한 서브넷과 보안 그룹을 설정하면 됩니다.

엔드포인트를 생성하여 VPC에 추가한 후 수행할 단계가 하나 더 있습니다. ECS 에이전트가 버전 1.25.1 이상으로 업그레이드되었는지 확인해야 합니다. 자세한 내용은 ECS 에이전트 업그레이드 지침을 참조하세요.

올바른 버전의 ECS 에이전트를 사용 중이라면 현재 VPC에서 실행되는 모든 ECS 에이전트를 재 시작하세요. ECS 에이전트는 영구 웹 소켓 연결을 사용하며 ECS 백엔드와 통신하고 VPC 엔드포인트는 기존 커넥션에 영향을 주지 않습니다. 재 시작하지 않는 이상 에이전트는 기존 커넥션을 계속 사용합니다.

애플리케이션 컨테이너를 중단하지 않고 에이전트를 다시 시작하려면 SSH를 사용하여 클러스터의 각 EC2 인스턴스에 접속하고 다음 명령을 실행하세요.

sudo docker restart ecs-agent

위의 명령어를 사용하면 호스트의 다른 애플리케이션 컨테이너를 중지하지 않고 ECS 에이전트가 다시 시작됩니다. 애플리케이션이 Stateless하다면 언제든지 중지해도 됩니다. 또는 기본 호스트로 SSH 액세스가 없거나 필요하지 않을 수 있습니다. 이런 경우에는 클러스터의 각 EC2 인스턴스를 한 번에 하나씩 다시 부팅합니다. 그러면 이 호스트의 에이전트가 재 시작될 뿐만 아니라 해당 호스트의 서비스에서 런칭한 모든 작업이 다른 호스트에서도 다시 시작됩니다.

결론

이 글에서는 ECR 레이어 다운로드를 위한 S3 게이트웨이를 포함하여 VPC에 ECS와 ECR의 AWS PrivateLink 엔드포인트를 추가하는 방법을 설명했습니다.

ECS 클러스터의 인스턴스는 ECS Control plane과 직접 통신할 수 있습니다. 이러한 인스턴스는 인터넷 게이트웨이나 NAT 게이트웨이를 사용하여 VPC 외부를 경유하지 않고 도커 이미지를 직접 다운로드할 수 있어야 합니다. 모든 컨테이너 오케스트레이션 트래픽은 VPC 내에 유지됩니다.

질문이나 제안이 있으면 의견을 남겨주시기 바랍니다.

이 글은 AWS Compute BlogSetting up AWS PrivateLink for Amazon ECS, and Amazon ECR의 번역본입니다.