CloudFormation으로 CloudFront OAI 설정 해보기

CloudFormation으로 CloudFront OAI 설정 해보기

CloudFormation으로 CloudFront OAI를 설정해 보는 과정을 정리해 봤습니다.
Clock Icon2022.02.02 07:20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요 클래스메소드 김재욱(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 버킷에 업로드한 이미지가 문제없이 출력되는 것을 볼 수 있습니다.

참고

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.