[AWS] 교차계정의 S3 와 CloudFront 간 안전한 오리진 구성하기

안녕하세요, 누리클라우드입니다. AWS에서 S3에 저장된 컨텐츠를 CloudFront의 오리진으로 하여 배포하고자 할 때, 한 계정에서 구성은 특별히 복잡하지 않습니다.

그리고, S3와 CloudFront를 각각 오리진 계정과 배포 계정으로 나누어서 구성해야 하는 경우가 있는데, 이 경우에도 S3의 버킷을 퍼블릭 엑세스를 허용해도 좋다면 역시 어렵지 않습니다.

그런데, 오리진 계정의 S3 버킷에 외부 접근은 차단하고 반드시 배포계정의 CloudFront를 통해서만 접근할 수 있도록 구성해야 한다면 S3 버킷에 대한 접근제어를 적절하게 구성해 주어야 합니다.

CloudFront Origin Access Identity(OAI) 생성 및 설정

먼저, 배포 계정의 CloudFront에서는 Origin Access Identity(OAI)를 생성하고 '배포'를 생성 시 'Restrict Bucket Access'를 yes로 하여 OAI를 방금 만들어 둔 ID로 선택하여 생성해 줍니다.

이 때, '배포' 생성과정에서 지정하게 되는 Origin Domain Name은 오리진 계정의 S3 버킷을 기입해야 하므로 [버킷이름].s3.amazonaws.com 형식으로 된 도메인을 수동으로 기입하여 줍니다.

S3 버킷 설정

오리진 계정의 S3에서는, 버킷의 [권한>버킷 정책]에 아래 내용으로 입력 후 저장합니다.

이 때, CloudFront OAI의 Amazon S3 Canonical User ID는 예: 06456789ca4f9f615e52eaae632639537f81c08cb771e90f4889b473134a4483f1ad529cfd863107985aa39df 형식입니다.

{
	"Version":"2012-10-17",
	"Id":"PolicyForCloudFrontPrivateContent",
	"Statement":[
		{
			"Sid":" Grant a CloudFront Origin Identity access to support private content",
			"Effect":"Allow",
			"Principal":{
				"CanonicalUser":"06456789ca4f9f615e52eaae632639537f81c08cb771e90f4889b473134a4483f1ad529cfd863107985aa39df"
			},
			"Action":"s3:GetObject",
			"Resource":"arn:aws:s3:::[버킷 이름]/*"
		}
	]
}

위와 같이 저장하면, 자동으로 아래와 같이 Canonical User ID가 OAI로 변경 저장이 된다. 이 때 주의할 점은, 처음부터 OAI로 입력하면 정책 반영이 잘 안될 수 있으니 반드시 Canonical User ID로 정책을 지정해야 합니다.

{
	"Version": "2008-10-17",
	"Id": "PolicyForCloudFrontPrivateContent",
	"Statement": [
		{
			"Sid": "1",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAJE3VIRSJKK3"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::[버킷 이름]/*"
		}
	]
}

S3에서는, [권한>ACL(엑세스 제어 목록)>다른 AWS 계정에 대한 엑세스] 항목에 "정식 ID"를 입력하여 접근 권한을 특정 ID에 대해 허용해 주는 설정을 해도 되지만, ACL은 버킷이나 오브젝트 각각에 적용해 주어야 합니다.

반면 버킷정책에서 위와 같이 OAI에 대한 접근 허용을 해 두면 신규로 업로드 되는 오브젝트나 폴더에 대해 현재 버킷과 동일한 접근권한이 부여가 되므로 권한관리에 더욱 편리합니다.

중요:

Amazon S3 권한에 대한 변경 사항을 저장한 후 변경 사항이 적용되기까지 약간 지연될 수 있습니다. 변경 사항이 적용되기 전에 버킷의 객체에 액세스하려 하면 권한 거부 오류가 발생할 수 있습니다.

주의!

혹, CloudFront의 엑세스 로그를 다른 AWS 계정의 버킷에 저장할때는 S3 버킷에 대한 접근 자격으로 CloudFront에서 생성한 OAI나 OAI의 "표준 사용자 ID"를 입력하면 안된다! CloudFront 계정의 "표준 사용자 ID"를 찾아서 입력해 주어야 합니다.

* 표준 사용자 ID 찾기: https://docs.aws.amazon.com/ko_kr/general/latest/gr/acct-identifiers.html

* 표준 사용자 ID는 Root로 로그인하여 찾거나 IAM 유저권한으로는 API나 CLI를 통해 찾을 수 있지만, 간단히 S3 버킷을 하나 만들고 나면 버킷의 권한 탭에서 엑세스제어목록 중 AWS 계정에 대한 엑세스 항목에서 계정 칼럼에서 찾을 수 있습니다.

참고링크:

https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#private-content-granting-permissions-to-oai