Amazon ECR 인터페이스 VPC 엔드포인트

AWS PrivateLink 기반 인터페이스 VPC 엔드포인트로 Amazon ECR API에 비공개로 접근하는 방법과, 엔드포인트 생성·고려사항·정책 설정을 함께 살펴볼게요.

출처: 문서

본문

Amazon ECR이 인터페이스 VPC 엔드포인트를 사용하도록 구성하면 VPC의 보안 태세(security posture)를 개선할 수 있어요. VPC 엔드포인트는 AWS PrivateLink로 구동되며, 이 기술은 비공개 IP 주소(IPv4와 IPv6 모두)를 통해 Amazon ECR API에 비공개로 접근할 수 있게 해줘요. AWS PrivateLink는 VPC와 Amazon ECR 사이의 모든 네트워크 트래픽을 Amazon 네트워크로 제한해요. 인터넷 게이트웨이, NAT 디바이스, 가상 프라이빗 게이트웨이(virtual private gateway)가 필요 없어요. AWS PrivateLink와 VPC 엔드포인트에 대한 자세한 내용은 Amazon VPC User Guide의 VPC Endpoints를 참고하세요.

Amazon ECR VPC 엔드포인트에 대한 고려 사항 (Considerations for Amazon ECR VPC endpoints)

Amazon ECR용 VPC 엔드포인트를 구성하기 전에 다음 사항을 알아두세요.

  • Amazon EC2 인스턴스에서 호스팅되는 Amazon ECS 태스크가 Amazon ECR에서 비공개 이미지를 풀할 수 있도록 하려면, Amazon ECS용 인터페이스 VPC 엔드포인트를 생성해요. 자세한 내용은 Amazon Elastic Container Service Developer Guide의 Interface VPC Endpoints (AWS PrivateLink)를 참고하세요.

  • Fargate에서 호스팅되어 Amazon ECR의 컨테이너 이미지를 풀하는 Amazon ECS 태스크는, 태스크의 태스크 실행 IAM 역할(task execution IAM role)에 조건 키(condition keys)를 추가해 태스크가 사용하는 특정 VPC와 서비스가 사용하는 VPC 엔드포인트로 액세스를 제한할 수 있어요. 자세한 내용은 Amazon Elastic Container Service Developer Guide의 Optional IAM Permissions for Fargate Tasks Pulling Amazon ECR Images over Interface Endpoints를 참고하세요.

  • VPC 엔드포인트에 연결된 보안 그룹(security group)은 VPC의 프라이빗 서브넷에서 포트 443으로 들어오는 연결을 허용해야 해요.

  • Amazon ECR VPC 엔드포인트는 이중 스택(dual-stack, IPv4 및 IPv6) 연결을 지원해요. 이중 스택 VPC 엔드포인트를 만들면 IPv4와 IPv6 비공개 IP 주소 모두를 통해 트래픽을 처리할 수 있어요.

  • VPC 엔드포인트는 US East (N. Virginia)의 AWS API SDK 엔드포인트를 통해 Amazon ECR Public 리포지토리를 지원해요.

  • VPC 엔드포인트는 Amazon Route 53을 통해 제공되는 AWS 제공 DNS만 지원해요. 자체 DNS를 사용하려면 조건부 DNS 전달(conditional DNS forwarding)을 사용할 수 있어요. 자세한 내용은 Amazon VPC User Guide의 DHCP Options Sets를 참고하세요.

  • 컨테이너가 Amazon S3에 기존 연결을 사용 중이라면, Amazon S3 게이트웨이 엔드포인트를 추가할 때 해당 연결이 잠시 중단될 수 있어요. 이 중단을 피하려면 Amazon S3 게이트웨이 엔드포인트를 사용하는 새 VPC를 만든 다음 Amazon ECS 클러스터와 그 컨테이너를 새 VPC로 마이그레이션해요.

  • 풀 스루 캐시 규칙(pull through cache rule)을 사용해 이미지를 처음 풀할 때, AWS PrivateLink를 사용하는 인터페이스 VPC 엔드포인트를 사용하도록 Amazon ECR을 구성했다면, 같은 VPC에 NAT 게이트웨이가 있는 퍼블릭 서브넷을 만들고 프라이빗 서브넷의 모든 아웃바운드 트래픽이 인터넷으로 NAT 게이트웨이를 거치도록 라우팅해야 풀이 동작해요. 이후의 이미지 풀에는 이 작업이 필요 없어요. 자세한 내용은 Amazon Virtual Private Cloud User Guide의 Scenario: Access the internet from a private subnet을 참고하세요.

  • FIPS 140-3 검증 암호화 모듈이 필요한 워크로드의 경우, Amazon ECR은 VPC 엔드포인트에 대해 FIPS 엔드포인트를 지원해요.

Windows 이미지에 대한 고려 사항 (Considerations for Windows images)

Windows 운영 체제 기반 이미지에는 라이선스로 인해 배포가 제한된 아티팩트가 포함돼요. 기본적으로 Windows 이미지를 Amazon ECR 리포지토리에 푸시할 때, 이 아티팩트를 포함하는 레이어는 푸시되지 않는데, 이 레이어는 외부 레이어(foreign layers)로 간주되기 때문이에요. 아티팩트가 Microsoft에서 제공되면 외부 레이어는 Microsoft Azure 인프라에서 검색돼요. 따라서 컨테이너가 Azure에서 이 외부 레이어를 풀할 수 있게 하려면 VPC 엔드포인트를 만드는 것 외에 추가 단계가 필요해요.

Windows 이미지를 Amazon ECR에 푸시할 때 Docker 데몬에서 --allow-nondistributable-artifacts 플래그를 사용해 이 동작을 재정의할 수 있어요. 이 플래그를 활성화하면 라이선스가 있는 레이어가 Amazon ECR에 푸시되어, Azure에 대한 추가 액세스 없이 VPC 엔드포인트를 통해 Amazon ECR에서 이 이미지를 풀할 수 있어요.

중요 (Important) --allow-nondistributable-artifacts 플래그를 사용한다고 해서 Windows 컨테이너 기본 이미지 라이선스 조건을 준수해야 하는 의무가 사라지지는 않아요. Windows 콘텐츠를 공개 또는 제3자 재배포로 게시할 수 없어요. 사용자 자신의 환경 안에서의 사용은 허용돼요.

이 플래그를 Docker 설치에서 사용할 수 있게 하려면 Docker 데몬 구성 파일을 수정해야 해요. Docker 설치에 따라 일반적으로 Docker Engine 섹션 아래의 설정·기본 설정 메뉴에서 구성하거나 C:\ProgramData\docker\config\daemon.json 파일을 직접 편집해 구성할 수 있어요.

다음은 필요한 구성의 예시예요. 값을 이미지를 푸시하는 리포지토리 URI로 바꿔요.

{
    "allow-nondistributable-artifacts": [
        "111122223333.dkr.ecr.us-west-2.amazonaws.com"
    ]
}

Docker 데몬 구성 파일을 수정한 후에는 이미지를 푸시하기 전에 Docker 데몬을 다시 시작해야 해요. 기본 레이어가 리포지토리에 푸시되었는지 확인해서 푸시가 성공했는지 검증해요.

참고 (Note) Windows 이미지의 기본 레이어는 큽니다. 레이어 크기 때문에 푸시 시간이 더 오래 걸리고 Amazon ECR에서 이러한 이미지에 대한 추가 스토리지 비용이 발생해요. 이러한 이유로 이 옵션은 빌드 시간과 지속적인 스토리지 비용을 줄이기 위해 꼭 필요한 경우에만 사용하는 것을 권장해요. 예를 들어 mcr.microsoft.com/windows/servercore 이미지는 Amazon ECR에서 압축했을 때 약 1.7 GiB 크기예요.

Amazon ECR용 VPC 엔드포인트 만들기 (Create the VPC endpoints for Amazon ECR)

Amazon ECR 서비스용 VPC 엔드포인트를 만들려면 Amazon VPC User Guide의 Creating an Interface Endpoint 절차를 사용해요.

Amazon ECR VPC 엔드포인트는 이중 스택(IPv4 및 IPv6) 연결을 지원해요. 이중 스택 VPC 엔드포인트를 만들면 IPv4와 IPv6 비공개 IP 주소 모두를 통해 트래픽을 자동으로 처리해요. 엔드포인트는 클라이언트의 네트워크 구성과 엔드포인트의 기능에 따라 적절한 IP 버전으로 트래픽을 라우팅해요.

기존 IPv4 전용 VPC 엔드포인트가 있고 이중 스택 엔드포인트로 마이그레이션하려면, 기존 엔드포인트를 이중 스택 연결을 지원하도록 수정하거나 새 이중 스택 엔드포인트를 만들 수 있어요. 엔드포인트를 만들거나 수정할 때 VPC와 서브넷이 사용하려는 IP 버전을 지원하는지 확인하세요. 이중 스택 엔드포인트를 만든 후에는 엔드포인트가 IPv4와 IPv6 모두를 지원해요.

  • Amazon EC2 인스턴스에서 호스팅되는 Amazon ECS 태스크에는 Amazon ECR 엔드포인트와 Amazon S3 게이트웨이 엔드포인트가 모두 필요해요.

  • 플랫폼 버전 1.4.0 이상을 사용하는 Fargate에서 호스팅되는 Amazon ECS 태스크에는 Amazon ECR VPC 엔드포인트와 Amazon S3 게이트웨이 엔드포인트가 모두 필요해요.

  • 플랫폼 버전 1.3.0 이하를 사용하는 Fargate에서 호스팅되는 Amazon ECS 태스크에는 com.amazonaws.region.ecr.dkr Amazon ECR VPC 엔드포인트와 Amazon S3 게이트웨이 엔드포인트만 필요해요.

참고 (Note) 엔드포인트가 생성되는 순서는 중요하지 않아요.

com.amazonaws.region.ecr.dkr

이 엔드포인트는 Docker Registry API에 사용돼요. push와 pull 같은 Docker 클라이언트 명령이 이 엔드포인트를 사용해요. 이 엔드포인트를 생성할 때 프라이빗 DNS 호스트 이름(private DNS hostname)을 활성화해야 해요. 그러려면 VPC 엔드포인트를 생성할 때 Amazon VPC 콘솔에서 Enable Private DNS Name(프라이빗 DNS 이름 활성화) 옵션을 선택해야 해요. FIPS 140-3 준수 연결에는 FIPS 엔드포인트 이름 com.amazonaws.region.ecr-fips.dkr 을 사용해요.

com.amazonaws.region.ecr.api

참고 (Note) 지정된 region은 Amazon ECR이 지원하는 AWS 리전의 리전 식별자를 나타내며, 예를 들어 US East (Ohio) 리전의 경우 us-east-2 입니다.

FIPS 140-3 준수 연결에는 FIPS 엔드포인트 이름 com.amazonaws.region.ecr-fips.dkr 과 com.amazonaws.region.ecr-fips.api 를 사용해요.

이 엔드포인트는 Amazon ECR API 호출에 사용돼요. DescribeImages, CreateRepository 같은 API 작업이 이 엔드포인트로 이동해요. 이 엔드포인트를 생성할 때 프라이빗 DNS 호스트 이름을 활성화하는 옵션이 있어요. VPC 엔드포인트를 생성할 때 VPC 콘솔에서 Enable Private DNS Name(프라이빗 DNS 이름 활성화) 을 선택해 이 설정을 활성화해요. VPC 엔드포인트에 대해 프라이빗 DNS 호스트 이름을 활성화하면 SDK나 AWS CLI를 최신 버전으로 업데이트해서, SDK 또는 AWS CLI를 사용할 때 엔드포인트 URL을 지정할 필요가 없게 해요. FIPS 140-3 준수 연결에는 FIPS 엔드포인트 이름 com.amazonaws.region.ecr-fips.api 를 사용해요.

프라이빗 DNS 호스트 이름을 활성화하고 2019년 1월 24일 이전에 릴리스된 SDK 또는 AWS CLI 버전을 사용한다면, --endpoint-url 파라미터로 인터페이스 엔드포인트를 지정해야 해요. 다음 예제는 엔드포인트 URL의 형식을 보여줘요.

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

VPC 엔드포인트에 대해 프라이빗 DNS 호스트 이름을 활성화하지 않았다면, 인터페이스 엔드포인트의 VPC 엔드포인트 ID를 지정하는 --endpoint-url 파라미터를 사용해야 해요. 다음 예제는 엔드포인트 URL의 형식을 보여줘요.

aws ecr create-repository --repository-name name --endpoint-url https://VPC_endpoint_ID.api.ecr.region.vpce.amazonaws.com

FIPS 140-3 준수 연결에는 FIPS 엔드포인트 URL을 사용해요:

aws ecr create-repository --repository-name name --endpoint-url https://api.ecr-fips.region.amazonaws.com

Amazon S3 게이트웨이 엔드포인트 만들기 (Create the Amazon S3 gateway endpoint)

Amazon ECS 태스크가 Amazon ECR에서 비공개 이미지를 풀하려면 Amazon S3용 게이트웨이 엔드포인트를 만들어야 해요. Amazon ECR은 이미지 레이어를 저장하기 위해 Amazon S3를 사용하므로 게이트웨이 엔드포인트가 필요해요. 컨테이너가 Amazon ECR에서 이미지를 다운로드할 때, 이미지 매니페스트를 얻기 위해 Amazon ECR에 접근한 다음 실제 이미지 레이어를 다운로드하기 위해 Amazon S3에 접근해야 해요. 다음은 각 Docker 이미지의 레이어를 포함하는 Amazon S3 버킷의 Amazon Resource Name(ARN)이에요.

arn:aws:s3:::prod-region-starport-layer-bucket/*

참고 (Note) Amazon ECR용 이중 스택 VPC 엔드포인트를 만드는 경우, 이중 스택 Amazon S3 게이트웨이 또는 인터페이스 엔드포인트도 만들어야 합니다. 자세한 내용은 S3 설명서를 참고하세요.

Amazon VPC User Guide의 Creating a gateway endpoint 절차를 사용해 Amazon ECR용 다음 Amazon S3 게이트웨이 엔드포인트를 만들어요. 엔드포인트를 만들 때 VPC의 라우팅 테이블을 선택해야 해요.

com.amazonaws.region.s3

Amazon S3 게이트웨이 엔드포인트는 IAM 정책 문서를 사용해 서비스에 대한 액세스를 제한해요. 태스크 IAM 역할이나 다른 IAM 사용자 정책에 넣은 제한이 이 정책 위에 여전히 적용되기 때문에 Full Access 정책을 사용할 수 있어요. Amazon ECR 사용에 필요한 최소 권한으로 Amazon S3 버킷 액세스를 제한하려면 Minimum Amazon S3 Bucket Permissions for Amazon ECR을 참고하세요.

Amazon ECR용 최소 Amazon S3 버킷 권한 (Minimum Amazon S3 Bucket Permissions for Amazon ECR)

Amazon S3 게이트웨이 엔드포인트는 IAM 정책 문서를 사용해 서비스에 대한 액세스를 제한해요. Amazon ECR용 최소 Amazon S3 버킷 권한만 허용하려면, 엔드포인트에 대한 IAM 정책 문서를 만들 때 Amazon ECR이 사용하는 Amazon S3 버킷에 대한 액세스를 제한해요.

다음 표는 Amazon ECR에 필요한 Amazon S3 버킷 정책 권한을 설명해요.

Permission Description
arn:aws:s3:::prod-region-starport-layer-bucket/* 각 Docker 이미지의 레이어가 포함된 Amazon S3 버킷에 대한 액세스를 제공해요. Amazon ECR이 지원하는 AWS 리전의 리전 식별자를 나타내며, 예를 들어 US East (Ohio) 리전의 경우 us-east-2 입니다.

예제 (Example) 다음 예제는 Amazon ECR 작업에 필요한 Amazon S3 버킷에 액세스를 제공하는 방법을 보여줘요.

{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::prod-region-starport-layer-bucket/*"]
    }
  ]
}

CloudWatch Logs 엔드포인트 만들기 (Create the CloudWatch Logs endpoint)

인터넷 게이트웨이가 없는 VPC를 사용하면서 로그 정보를 CloudWatch Logs로 보내는 awslogs 로그 드라이버를 사용하는 Fargate 시작 유형의 Amazon ECS 태스크는, CloudWatch Logs용 com.amazonaws.region.logs 인터페이스 VPC 엔드포인트를 만들어야 해요. 자세한 내용은 Amazon CloudWatch Logs User Guide의 Using CloudWatch Logs with interface VPC endpoints를 참고하세요.

Amazon ECR VPC 엔드포인트용 엔드포인트 정책 만들기 (Create an endpoint policy for your Amazon ECR VPC endpoints)

VPC 엔드포인트 정책은 엔드포인트를 만들거나 수정할 때 엔드포인트에 연결하는 IAM 리소스 정책이에요. 엔드포인트를 만들 때 정책을 연결하지 않으면, AWS가 서비스에 대한 전체 액세스를 허용하는 기본 정책(default policy)을 자동으로 연결해요. 엔드포인트 정책은 사용자 정책이나 서비스별 정책을 재정의하거나 대체하지 않아요. 엔드포인트에서 지정된 서비스로의 액세스를 제어하는 별도의 정책이에요. 엔드포인트 정책은 JSON 형식으로 작성해야 해요. 자세한 내용은 Amazon VPC User Guide의 Controlling Access to Services with VPC Endpoints를 참고하세요.

두 Amazon ECR VPC 엔드포인트 모두에 단일 IAM 리소스 정책을 만들어 연결하는 것을 권장해요.

다음은 Amazon ECR용 엔드포인트 정책의 예시예요. 이 정책은 특정 IAM 역할이 Amazon ECR에서 이미지를 풀할 수 있게 해줘요.

{
	"Statement": [{
		"Sid": "AllowPull",
		"Principal": {
			"AWS": "arn:aws:iam::1234567890:role/role_name"
		},
		"Action": [
			"ecr:BatchGetImage",
			"ecr:GetDownloadUrlForLayer",
                    "ecr:GetAuthorizationToken"
		],
		"Effect": "Allow",
		"Resource": "*"
	}]
}

다음 엔드포인트 정책 예시는 지정된 리포지토리가 삭제되지 않도록 방지해요.

{
	"Statement": [{
			"Sid": "AllowAll",
			"Principal": "*",
			"Action": "*",
			"Effect": "Allow",
			"Resource": "*"
		},
		{
			"Sid": "PreventDelete",
			"Principal": "*",
			"Action": "ecr:DeleteRepository",
			"Effect": "Deny",
			"Resource": "arn:aws:ecr:region:1234567890:repository/repository_name"
		}
	]
}

다음 엔드포인트 정책 예시는 앞의 두 예시를 단일 정책으로 결합한 것이에요.

{
	"Statement": [{
			"Sid": "AllowAll",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "*",
			"Resource": "*"
		},
		{
			"Sid": "PreventDelete",
			"Effect": "Deny",
			"Principal": "*",
			"Action": "ecr:DeleteRepository",
			"Resource": "arn:aws:ecr:region:1234567890:repository/repository_name"
		},
		{
			"Sid": "AllowPull",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::1234567890:role/role_name"
			},
			"Action": [
				"ecr:BatchGetImage",
				"ecr:GetDownloadUrlForLayer",
                          "ecr:GetAuthorizationToken"
			],
			"Resource": "*"
		}
	]
}

Amazon ECR용 VPC 엔드포인트 정책을 수정하려면

  1. https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 열어요.

  2. 탐색 창에서 Endpoints(엔드포인트) 를 선택해요.

  3. 아직 Amazon ECR용 VPC 엔드포인트를 만들지 않았다면 Amazon ECR용 VPC 엔드포인트 만들기를 참고해요.

  4. 정책을 추가할 Amazon ECR VPC 엔드포인트를 선택하고 화면 하단의 Policy(정책) 탭을 선택해요.

  5. Edit Policy(정책 편집) 을 선택하고 정책을 변경해요.

  6. Save(저장) 을 선택해 정책을 저장해요.

공유 서브넷 (Shared subnets)

나와 공유된 서브넷에서는 VPC 엔드포인트를 생성, 설명, 수정, 삭제할 수 없어요. 하지만 나와 공유된 서브넷에서 VPC 엔드포인트를 사용할 수는 있어요.

더 알아보기 (Learn more)