
CloudFormation으로 CloudFront OAI 설정 해보기
この記事は公開されてから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 버킷에 업로드한 이미지가 문제없이 출력되는 것을 볼 수 있습니다.