2020년 3월 22일 일요일

[AWS] AWS CloudFront에서만 S3 Bucket에서 파일을 가져갈 수 있도록 Bucket policy 작성하기

AWS CloudFront에서만 S3 Bucket에서 파일을 가져갈 수 있도록 Bucket policy 작성하기


AWS S3를 Origin으로 사용하는 CloudFront 배포를 만드는 경우가 있습니다. 예를 들면, S3에 저장된 파일들을 CDN으로 배포하려는 경우와 S3에서 정적 웹호스팅 기능을 사용하면서 SSL을 적용하기 위해서 CloudFront를 이용하는 경우가 있습니다.

위의 두 경우 모두 S3 Bucket에 저장한 파일을 Public Internet에 제공하기 위한 것이기 때문에, S3 Bucket의 정책을 퍼블릭하게 설정하게 됩니다. 하지만 CloudFront를 이용해서 S3 Bucket의 파일들을 Public Internet에 공개한다면 Bucket의 정책을 퍼블릭하게 설정하지 않고, CloudFront 배포에서만 접근하도록 설정하면 됩니다.

방법은 아주 간단합니다. S3 Bucket 정책의 Pricipal에 허용하려는 CloudFront 배포의 Origin Access Identity (OAI)를 명세하는 것입니다.


CloudFront 배포에서 Origin Access Identity (OAI)를 가져오기

OAI는 CloudFront에서 생성할 수 있습니다. CloudFront 배포의 'Origins and Origin Groups' 탭에서 Origin을 선택해서 Edit을 클릭하면 아래 이미지와 같은 화면을 볼 수 있습니다.

여기에서 'Origin Domain Name'을 클릭하면 Origin으로 사용 가능한 목록이 나오는데, 이 목록에서 연결할 S3 Bucket을 선택하면 아래에 'Restrict Bucket Access'항목이 나타납니다. 이 항목의 옵션을 'Yes'로 선택하면, 'Origin Access Identify'항목에서 OAI를 새로 생성하거나 기존의 값을 선택할 수 있습니다.

설정을 완료하고 'Edit'을 누르면 Origin 목록에서 Origin의 OAI를 확인할 수 있습니다.

S3 Bucket의 정책에 OAI 적용하기

OAI가 적용된 정책은 아래와 같습니다.
CloudFront에서 확인할 수 있는 OAI의 형태는 origin-access-identity/cloudfront/EH1HDMB1FH2TC와 같은 형태인데 여기에서 EH1HDMB1FH2TC만 복사해서 Bucket 정책의 {OAI}자리에 붙여 넣으면 됩니다.
그리고 {YOUR_BUCKET_NAME} 자리에는 Bucket 이름을 입력해주세요.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity {OAI}"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{YOUR_BUCKET_NAME}/*"
        }
    ]
}

설정이 끝나면, S3에 저장된 파일들은 S3 url로 접근하면 AccessDenied 에러가 발생하게 됩니다. 하지만 CloudFront로 연결한 URL로 접근하면 정상적으로 파일 접근이 되는 것을 확인 할 수 있습니다.

참고자료

댓글 없음:

댓글 쓰기