CloudFormation으로 CloudFront OAI 설정 해보기

CloudFormation으로 CloudFront OAI를 설정해 보는 과정을 정리해 봤습니다.
2022.02.02

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 CloudFormation으로 CloudFront OAI를 설정해 보는 과정을 정리해 봤습니다.

파라미터 설정

AWSTemplateFormatVersion: "2010-09-09"
Description: 
  CloudFront OAI Setting

Metadata:
  "AWS::CloudFormation::Interface":
    ParameterGroups:
      - Label: 
          default: "S3, ACM Setting"
        Parameters: 
          - BucketName
          - ACMSSL

    ParameterLabels: 
      BucketName: 
        default: "Enter the name of the S3 bucket"
      ACMSSL: 
        default: "Enter ACM SSL"

# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------# 
Parameters:
  BucketName:
    Type: String
    Default: "S3 Bucket Name"

  ACMSSL:
    Type: String
    Default: "ACM Identifier"

S3 버킷을 생성하고, CloudFront에서 SSL을 설정해야 하기 때문에 버킷 이름과 ACM의 Identifier를 입력 받습니다.

버킷 생성과 정책 설정

Resources:
# ------------------------------------------------------------#
#  S3 Bucket
# ------------------------------------------------------------#        
# Bucket
  Bucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref BucketName
      AccessControl: Private
      BucketEncryption: 
        ServerSideEncryptionConfiguration: 
        - ServerSideEncryptionByDefault:
            SSEAlgorithm: AES256
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  BucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument:
        Statement:
        - Action: "s3:GetObject"
          Effect: Allow
          Resource: !Sub "arn:aws:s3:::${Bucket}/*"
          Principal:
            CanonicalUser: !GetAtt CloudFrontOriginAccessIdentity.S3CanonicalUserId

S3 버킷을 생성하고, CloudFront에서만 접근이 가능하도록 버킷 정책을 업데이트 합니다.

CloudFront 생성과 OAI 설정

# ------------------------------------------------------------#
#  CloudFront
# ------------------------------------------------------------#  
  CloudFrontOriginAccessIdentity:
    Type: "AWS::CloudFront::CloudFrontOriginAccessIdentity"
    Properties:
      CloudFrontOriginAccessIdentityConfig:
        Comment: !Sub "access-identity-${Bucket}"
  CloudFrontDistribution:
    Type: "AWS::CloudFront::Distribution"
    Properties:
      DistributionConfig:
        Origins:
        - DomainName: !GetAtt Bucket.RegionalDomainName
          Id: !Sub "S3origin-${BucketName}"
          S3OriginConfig:
            OriginAccessIdentity: !Sub "origin-access-identity/cloudfront/${CloudFrontOriginAccessIdentity}"
        DefaultCacheBehavior:
          TargetOriginId: !Sub "S3origin-${BucketName}"
          ViewerProtocolPolicy: allow-all
          AllowedMethods:
          - GET
          - HEAD
          Compress: true
          ForwardedValues:
            Cookies:
              Forward: none
            QueryString: false
        ViewerCertificate:
          SslSupportMethod: sni-only
          MinimumProtocolVersion: TLSv1.2_2021
          AcmCertificateArn: !Sub "arn:aws:acm:us-east-1:${AWS::AccountId}:certificate/${ACMSSL}"
        HttpVersion: http2
        Enabled: true

「CloudFrontOriginAccessIdentity」로 새 원본 액세스 ID(OAI)를 생성합니다. 이어서 CloudFrontDistribution으로 CloudFront를 생성하면서, OriginAccessIdentity에 생성한 OAI를 설정합니다. OAI는 Amazon S3 오리진과 연결할 수 있는 특별한 CloudFront 사용자이며, Amazon S3 콘텐츠의 전체 또는 일부를 보호할 수 있습니다

결과 확인

CloudFront로 들어가서 확인해 보면, 설정한 보안 정책과 SSL이 설정되어 있는 것을 확인할 수 있습니다.

OAI 또 한 정상적으로 설정되어 있습니다.

S3 버킷 정책 또 한 잘 설정되어 있는 것을 확인할 수 있습니다.

S3 버킷에 이미지를 업로드 하고 S3에서 접근해 보면 다음과 같이 AccessDenied 에러가 나옵니다.

  • dw790skvg56mc.cloudfront.net

이제 CloudFront 도메인으로 접속해 보도록 하겠습니다. (CloudFront는 블로그 생성 후 삭제 됩니다.)

CloudFront 도메인으로 접속해 보면 S3 버킷에 업로드한 이미지가 문제없이 출력되는 것을 볼 수 있습니다.

참고