[AWS] 두 계정 간 S3 CloudFront 연동하기

AWS에서 S3를 오리진으로 CloudFront를 배포하고자 할 때, 단일 계정에서 구성은 특별히 복잡하지 않습니다.
그리고, A계정에는 S3를 B계정에는 CloudFront를 배포해야 하는 경우가 있는데, 이 경우에도 S3의 버킷을 퍼블릭 엑세스를 허용해도 좋다면 역시 복잡하지 않습니다.

그런데, S3 버킷에 직접 접근은 차단하고 반드시 CloudFront를 통해서면 접근할 수 있도록 구성해야 한다면 S3 버킷에 대한 접근제어를 적절하게 구성해 주어야 합니다.

먼저, CloudFront에서는 Origin Access Identity(OAI)를 생성하고 배포 생성 시 "Restrict Bucket Access"를 yes로 하여 OAI를 방금 만들어 둔 ID로 선택하여 생성합니다.
이 때, Origin Domain Name은 다른 계정의 S3 버킷을 기입해야 하므로 [버킷이름].s3.amazonaws.com 형식으로 된 도메인을 기입하여 줍니다.

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:::[버킷 이름]/*"
     }
   ]
}

위와 같이 저장하면, 자동으로 아래와 같이 OAI로 변경 저장이 됩니다.
(주의! 아래 결과로 보여주는 정책처럼 처음부터 OAI로 입력하면 정책 반영이 잘 안된다.)

{
    "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에서는, 버킷의 [권한>엑세스 제어 목록>다른 AWS 계정에 대한 엑세스] 항목에 "정식 ID"를 입력하여 접근 권한을 특정 ID에 대해 허용해 주는 설정을 해두어야 합니다.


중요
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 계정에 대한 엑세스 항목에서 계정 칼럼에서 찾을 수 있다.

댓글

이 블로그의 인기 게시물

AWS SA 자격증 시험 합격 후기

[AWS] Lightsail vs EC2 (서울리전 2018.5 기준)

[AWS] EC2 SMTP 트래픽 제한 해제 하기 - 대량 이메일 발송서버 구성을 위해