[AWS] CloudFront S3 Restrict Bucket Access 수정하기

반응형

이번 글에서는 CloudFront로만 접근을 제한한 S3 Bucket의 Bucket Policy를 수정해보겠습니다.

0. Restrict Bucket Access란?

S3 Bucket에 CloudFront만 접근할 수 있도록 설정하는 옵션입니다.

1. OAI (Origin Access Identity)

이번 실습에선 이미 S3 버킷과 연결된 CloudFront가 있다고 가정하겠습니다.

자세한 내용은 아래의 책을 참고하시길 바랍니다.

 

아마존 웹 서비스를 다루는 기술:실무에서 알아야 할 기술은 따로 있다!

COUPANG

www.coupang.com

image.png

또한, CloudFront를 생성할때 'Restirct Bucket Access'를 Yes로 선택해 S3로의 접근을 CloudFront로 한정했습니다. 'Grand Read Permission on'을 Yes로 선택해 해당 접근제한 내용을 S3의 Bucket Policy에 저장했습니다. 마지막으로, S3에 접근할때 사용할 식별자 'OAI(Origin Access Identity)'를 선택했습니다.

위의 설명대로 S3와 연결된 CloudFront를 생성한다면 아래와 같이 Bucket Policy가 자동으로 생성되어 있습니다.

{
    "Version": "2012-10-17",
    "Id": "Policy1575355558817",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAQG9MTQ30UVF"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::daily-mission.com/*"
        }
    ]
}

위의 내용을 해석해보면, S3 (daily-mission.com)의 GetObject Action은 AWS의 CloudFront 중 OAI(Origin Access Identity)EAQG9MTQ30UVF 인 경우에만 허용한다고 해석할 수 있습니다.

즉, 해당 S3 Bucket의 리소스를 Get하기 위해선 위의 조건을 만족하는 CloudFront에서만 접근할 수 있습니다.

OAI(Origin Access Identity)란 Origin 즉 S3에 접근할때 사용할 식별자입니다. 이 식별자를 통해 S3의 접근을 허용할지 결정하며, S3 Bucket Policy에는 이 식별자가 등록되어 있습니다.

2. Bucket Policy OAI 수정

위의 상황에서, 경우에따라서 OAI를 수정 해야할 때가 있습니다. 한번 수정해보도록 하겠습니다. (물론, 제대로 CloudFront를 생성한 경우에는 수정할 필요가 전혀없습니다. 하지만, 어쩌다보니 해당 오류를 알게되어 이 글을 씁니다.)

먼저, 변경할 OAI를 선택하기 위해 Oring Acess Identity 탭에서 OAI 목록을 확인합니다.

image.png

현재 Bucket Policy에는 EAQG9MTQ30UVF가 CloudFront 접근 OAI로 등록되어있습니다. 저는 E3AO0U1I3YX5PU로 변경해보겠습니다. 아래와 같이 해당 OAI ID를 복사해 Bucket Policy를 변경 후 저장합니다.

{
    "Version": "2012-10-17",
    "Id": "Policy1575355558817",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3AO0U1I3YX5PU"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::daily-mission.com/*"
        }
    ]
}

Resource에는 본인 소유의 Bucket을 명시해주면 됩니다.

그러면 Bucket Policy에 위배된다는 경고구문과 함께 에러가 발생합니다. (항상 발생하지는 않습니다)

이는 종종 발생하는 에러로 이를 해결하기 위해선 https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/example-bucket-policies.html 를 참고해 'CanonicalUserID' 형식으로 변경해 저장하면 됩니다.

아래 형식에서 "CloudFront Origin Identity Canonical User ID" 부분을 변경할 OAI의 Canonical User ID로 입력하고, 저장하면 S3에서 자동으로 해당 내용을 이전의 OAI형식으로 변환해 저장해줍니다.

{
   "Version":"2012-10-17",
   "Id":"Policy1575355558817",
   "Statement":[
     {
       "Sid":"1",
       "Effect":"Allow",
       "Principal":{"CanonicalUser":"CloudFront Origin Identity Canonical User ID"},
       "Action":"s3:GetObject",
       "Resource":"arn:aws:s3:::daily-mission.com/*"
     }
   ]
}

위의 형식은 Principal 부분의 OAI가 Cannonical User ID로 기존과 다릅니다.

Canonical User ID는 동일한 화면에서 확인 할 수 있습니다.

image.png

현재 저의 경우에선 'E3AO0U1I3YX5PU' 에 해당하는 Canonical User ID인 '23a64cde5e8240b8dcaea9100978d6d77b27313fc8431865387e12d6e6fa1284913386e2e63a786528aa5673f4e218a0'를 위의 형식에 입력 후 저장하면 알아서 이전의 형식인 OAI로 변환해서 저장해줍니다.

{
   "Version":"2012-10-17",
   "Id":"Policy1575355558817",
   "Statement":[
     {
       "Sid":"1",
       "Effect":"Allow",
       "Principal":{"CanonicalUser":"23a64cde5e8240b8dcaea9100978d6d77b27313fc8431865387e12d6e6fa1284913386e2e63a786528aa5673f4e218a0"},
       "Action":"s3:GetObject",
       "Resource":"arn:aws:s3:::daily-mission.com/*"
     }
   ]
}

즉 위의 방식대로 변경 후 새로고침을 눌러보면 아래처럼 변경되어 있습니다.

{
    "Version": "2012-10-17",
    "Id": "Policy1575355558817",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3AO0U1I3YX5PU"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::daily-mission.com/*"
        }
    ]
}

3. 결론

S3 Bucket OAI 수정시 에러가 발생하면?
-> Cannoncial User ID 형식으로 변경해 저장하면 된다.


파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY