AWS CLI로 Amazon CloudFront OAI (Origin Access Identity) 설정하기

AWS CLI을 이용하여 CloudFront Distribution에 OAI를 설정하는 방법에 대해 다루어 보았어요.
2020.08.24

안녕하세요! 클래스메소드 신입 엔지니어 정하은입니다🐣

지난 블로그에 이어 CloudFront에 대한 내용으로 돌아왔습니다! 지난 블로그에서는 S3 버킷 생성에서 CloudFront 배포까지 다루었는데요. 이번 블로그와 함께 읽어주시면 배경에 대한 이해에 도움이 될 거라 생각되니, 혹시나 이번 글이 처음이신 분들은 아래 링크의 글을 읽어주신다면 감사드려요?

그럼 바로 CloudFront Distribution에 OAI을 설정 하는 이유와, AWS CLI에서 OAI를 설정하는 방법에 대해서 알아볼게요!

OAI (Origin Access Identity) 란?

한국어로는 원본 액세스 ID라고 부르는 OAI.. 이름만 들어서는 무슨 역할을 하는건지 알 수 없는 이건 무엇때문에 사용하는걸까요?

혹시 지난 블로그에서 제가 S3 엔드포인트와 CloudFront 도메인을 사용해서 모두 접속이 가능하다고 했던 이야기를 기억하시나요? 그런데 S3 엔드포인트로 접근 했을 때 문제점이 제기되는데요.

S3 엔드포인트 주소는 버킷명을 포함하고 있죠. 그런데 버킷명을 알고 있다고 하는 것은 즉, 버킷에 직접 접근을 하고 있다는 건데요. 이렇게 되면 권한을 갖지 않은 바깥의 유저가 버킷 내 다른 Object에도 접근할 수 있는 위험성이 있습니다. 그렇기 때문에 타 유저가 CloudFront 배포로만 웹사이트에 접근할 수 있도록 설정을 해주어야하는데요. 이 때 사용하는 것이 바로 OAI 랍니다.

OAI 설정해보기

그럼 이제 AWS CLI로 CloudFront에 OAI를 설정해볼게요. 지난 블로그 내용에 이어 다루고 있기 때문에, S3 버킷과 CloudFront Distribution 생성까지 마친 상태에서 진행하고 있다는 점 주의해주세요!

OAI 생성하기

먼저 아래의 명령어를 입력해서 OAI를 생성해주세요.

aws cloudfront create-cloud-front-origin-access-identity --cloud-front-origin-access-identity-config CallerReference="oai-example", Comment="OAI-Example"

여기서 CallerReference는 OAI 생성 시에 해당 OAI 생성 여부를 비교하기 위해 사용하는 값입니다. 여러분께서 알기 쉬운 값으로 입력하셔도 무관하구요. Comment의 마찬가지로 원하시는 문구로 입력해주세요.

입력 사항에 문제가 없다면, OAI가 생성이 되어 정보가 아래에 출력되실 거에요.

CloudFront Distribution 정책 수정하기

이제 생성한 OAI와 Distribution을 연결해볼게요.

그 전에 우선 웹사이트용 Distribution 정책을 수정 할 필요가 있는데요. 우선 아래의 커맨드를 입력해서 Distribution 정보를 출력해주세요. (DistributionID라고 적힌 부분은 여러분이 웹사이트 배포를 위해 생성하셨던 Distribution의 ID를 입력해주세요.)

aws cloudfront get-distribution --id DistributionID

출력된 내용이 아래와 같이 나올텐데요. "CallerReference" 바로 위에 있는 괄호부터 "IsIPV6Enabled" 바로 아래에 있는 괄호까지 복사해주세요.

그러고 난 뒤, vi config-policy.json 을 입력하여 json 파일을 하나 생성해주세요. json 파일명은 크게 중요하지 않으니 아무렇게나 입력하셔도 무관합니다. 그 다음에는 복사했던 내용을 그대로 붙여넣기 해주세요.

내용 중에 "Origins"이라고 적힌 부분을 찾으시면, 안쪽 괄호에 "S3OriginConfig"라는 걸 발견하실 수 있으실 거에요. 옆의 "" 안에 origin-access-identity/cloudfront/OAI ID 라고 입력해주세요. OAI ID는 방금 여러분께서 생성하신 OAI의 ID 값을 입력해주세요! 입력을 마치시면 저장하신 뒤, 아래의 명령어를 입력해주세요.

aws cloudfront update-distribution --id DistributionID --if-match DistributionETag --distribution-config file://config-policy.json

위 명령어는 Distribution 내용을 수정할 때 사용하는데요. 이 명령어를 실행하기 위해서는 --if-match 다음에 ETag라는 값이 필요합니다. ETag는 아까 여러분께서 출력하신 Distribution 정보 내용 중에서 맨 처음에 나오는 값이니 복사해서 입력해주세요.

그리고 명령어가 제대로 실행되면 수정된 내용이 출력이 되니 잘 변경되었는지 확인해주세요.

S3 버킷 정책 수정하기

다음으로 S3 버킷 정책을 수정하여, OAI로만 접근이 가능하도록 수정해볼게요. vi policy.json을 입력해서 아래와 같이 수정해주세요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow", 
      "Principal": {"CanonicalUser":"OAI의 Amazon S3 Canonical User ID"}, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::버킷명/*" 
    } 
  ] 
}

수정을 마치시면 저장하시고 아래의 명령어를 입력하여 수정한 S3 버킷 정책을 반영 시켜주세요.

aws s3api put-bucket-policy --bucket 버킷명 --policy file://policy.json

그럼 이제 S3 엔드포인트로 접속했을 때, 어떻게 되는지 확인해봅시다!

위처럼 Access Denied가 뜨는 걸 확인하실 수 있을 거에요. 그럼 CloudFront 도메인에서는 제대로 접속되는지 확인해봐야겠죠?

CloudFront 도메인에서는 잘 접속되네요!

S3 버킷의 Public한 접근을 제한하기

위의 과정까지 진행하시고, 마지막으로 설정 해주셔야하는 부분이 있는데요. 바로 버킷으로의 Public한 접근을 제한하는 것입니다. OAI로도 일단 접근은 제한되었지만 혹시나 모를 상황에 대비해 모든 Public한 접근을 제한해줄게요. 아래의 명령어를 입력해서 설정을 변경해주세요.

aws s3api put-public-access-block --bucket 버킷명 --public-access-block-configuration  "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

제대로 설정이 반영되었는지 아래 명령어로 확인해보면 접근 제한이 모두 true로 변경된 것을 확인하실 수 있어요.

aws s3api get-public-access-block --bucket 버킷명
{
  "PublicAccessBlockConfiguration": {
    "BlockPublicAcls": true,
    "IgnorePublicAcls": true,
    "BlockPublicPolicy": true,
    "RestrictPublicBuckets": true
  }
}

Management Console에서 확인하셔도 On으로 변경된 것을 보실 수 있답니다.

후기

사실 이미 AWS Management Console 상에서 OAI 설정을 해보신 분이라면 아시겠지만, Management Console에서는 몇 번 클릭하는 것만으로도 금방 OAI 설정을 끝낼 수 있는데요. 제가 AWS CLI로 하는 것이 편리하다고 했음에도 불구하고 이 설정은 Management Console 상에서보다 손이 더 많이 간다고 느꼈습니다.

그렇기 때문에 위와 같은 번거로움을 줄이고 싶으시다면,

  1. OAI 생성
  2. 생성할 Distribution의 설정 json 파일을 생성 
  3. aws cloudfront create-distribution --distribution-config file://config-policy.json 명령어로 Distribution 생성
  4. 버킷 정책 수정

위와 같은 방법으로 CloudFront Distribution 생성 시에 설정까지 한꺼번에 마치시는 것을 추천드립니다!

그리고 OAI 설정 외에도 CloudFront의 다른 설정들도 위 방법을 응용해서 변경할 수 있으니, 여러분의 배포 조건에 맞춰 시험해보셔도 좋을 것 같아요?

마지막으로

사실 CloudFront 설정을 부분을 따로 공부해보면서 OAI 설정과 같이 다루려고 했는데요. 검증하는 부분에 대한 미숙함이나 예상 외의 변수가 있어 결국 추후로 미루게 되었습니다ㅠㅠ

나중에 웹사이트를 확장해보면서 설정 관련한 테스트는 계속 진행할 예정이니 언젠가 블로그로 꼭 다루고 싶다는 바람입니다!

다음 블로그에서는 도메인을 변경하는데 사용할 서비스에 대한 내용이 되지 않을까 싶네요? (아마 이 글을 읽으면서 다음엔 이게 오겠구나라고 예상하신 분들이 계실거라 생각됩니다ㅎㅎ)

이번 글도 읽어주신 여러분들께 감사드리며, 다음 글도 여러분들께 도움이 될 수 있는 글로 찾아뵐게요!