1. 서비스 소개

AWS S3는 이미 널리 알려진 Storage 서비스입니다.

  • 모든 종류의 데이터를 원하는 형식으로 저장
  • 저장할 수 있는 데이터의 전체 볼륨과 객체 수에는 제한이 없음
  • Amazon S3는 간단한 key 기반의 객체 스토리지이며, 데이터를 저장 및 검색하는데 사용할 수 있는 고유한 객체 키를 할당.
  • Amazon S3는 간편한 표준 기반 REST 웹 서비스 인터페이스를 제공
  • 요금 정책 (링크)
  • 안전하다
S3 FAQ를 참고한 내용이며, 더 자세한 내용은 공식문서에서 확인할 수 있습니다.



AWS CloudFront는 정적, 동적 컨텐츠를 빠르게 응답하기 위한 캐시 기능을 제공하는 CDN 서비스입니다.



캐싱을 지원하기 때문에 S3에 저장된 컨텐츠를 직접 접근하지 않아도 되므로 S3의 비용이 감소하며, 더 빠른 응답을 지원하므로 꼭 함께 적용해주는 것이 좋습니다.
  • 애플리케이션과 인프라에 대한 “관문”으로 사용함으로써 중요한 콘텐츠, 데이터, 코드 및 인프라에 대한 주요 공격을 차단
  • 콘텐츠, API 또는 애플리케이션을 SSL/TLS를 통해 전송 가능
  • 특정 콘텐츠에 대한 액세스 제한 가능
  • 가용성 향상 : 캐싱을 통한 Origin의 워크로드를 줄일 수 있음
  • Amazon S3, Amazon EC2 또는 Elastic Load Balancing과 같은 AWS Origin을 사용하는 경우, 이러한 서비스와 CloudFront 간에 전송된 데이터에 대해서는 요금이 청구되지 않음
CloudFront FAQ를 참고한 내용이며, 더 자세한 내용은 공식문서에서 확인할 수 있습니다.




2. S3 버킷 생성
이제 S3와 CloudFront를 연동하는 방법에 대해 알아보겠습니다.

먼저, IAM을 통해 S3 전용 계정으로 사용하실 것을 권장합니다. ( 참고 )

다음으로 S3에 버킷을 생성합니다.
버킷을 생성하는 방법은 간단하므로 자세한 방법은 생략하며, 여기를 참고하시길 바랍니다.




3. CloudFront 연동
CloudFront 서비스에 접근합니다.


1) 배포 생성

create Distribution을 클릭합니다.



2) 배포 방식 선택


배포 방식을 선택해야 하는데, 일반적으로 Web을 선택하면 됩니다. ( 참고 )
  • Web
    • HTTP(S)를 통해 동적, 정적 파일( .html, .css, .php 등)을 제공하는 방식입니다.
  • RTMP (Real Time Messaging Protocol)
    • Adobe Flash 멀티 미디어는 HTTP 또는 HTTPS를 통해 제공할 수 없지만, CloudFront RTMP 배포를 사용하여 제공합니다.



Get Started 버튼을 누르면 배포에 대한 설정을 해야하는데요.
자세한 설명은 각 항목의 오른쪽 아이콘 또는 공식문서를 보시길 바랍니다.
아래의 내용들은 문서 읽기가 귀찮은 분들을 위해 간단한 설명과 샘플을 제공하는 것일 뿐이며, 공식문서가 잘되어 있으므로 꼭! 공식문서를 보시길 권장합니다.


3) 배포 설정 (1) - Origin에 대한 셋팅

  • Origin Domain Name
    • 말그대로 Origin Domain Name을 작성합니다.
    • input box를 클릭하면 현재 사용할 수 있는 S3 버킷과 ELB 등의 목록이 표시되므로, 여기서 선택할 수도 있습니다. 
  • Origin Path - ( 선택값 ) 
    • AWS 리소스나 사용자 지정 Origin에 있는 디렉터리에서 콘텐츠를 요청하게 하려면 슬래시(/) 뒤에 디렉터리 경로를 입력합니다.
    • 예를 들어, /production을 작성했다면 {OriginDomainName}/sample.jpg를 요청했을 때, {OriginDomainName}/production/sample.jpg에 대한 요청이 됩니다.
  • Origin ID
    • 해당 배포 내의 Origin 또는 Origin Group을 고유하게 구별하는 문자열입니다.
    • Origin Domain Name을 목록에서 선택했다면 자동으로 설정됩니다.
  • Restrict Bucket Access
    • 이 항목은 S3 버킷 Origin에만 노출됩니다. (웹 사이트 endpoint로 구성된 경우는 제외)
    • 사용자가 S3 URL에 직접 접근할 수 없고, CloudFront URL만 하려면 YES를 체크하고,추가적으로 아래의 항목들을 작성합니다. S3 URL도 허용하려면 NO를 체크하면 됩니다. (일반적으로 YES를 체크해서 CloudFront URL을 사용하는 것이 좋습니다.)
      • Origin Access Identity
        • 새로운 원본 액세스 ID를 만들것인지, AWS 계정에 연결된 기존 원본 액세스 ID를 사용할지를 선택합니다.
      • Comment
        • 코멘트를 작성합니다.
      • Grant Read Permissions on Bucket
        • CloudFront에서 S3에 접근하기 위해 버킷의 read 권한을 부여하기 위해 설정합니다.
        • Amazon S3 버킷에 대한 읽기 권한을 자동으로 부여하려는 경우, Yes, Update Bucket Policy를 선택합니다.
        • 버킷 권한을 업데이트하는 대신 권한을 수동으로 업데이트하려는 경우, No, I will Update Permissions를 선택합니다.
  • Origin Custom Headers
    • CloudFront가 Origin에 요청을 할 때마다 사용자 지정 헤더를 포함하여 전달하도록 설정합니다.




4) 배포 설정 (2) - 캐시에 대한 셋팅

  • Path Pattern
    • CloudFront로 파일을 가져올 규칙입니다.
    • 새 배포를 만들 때 기본값은 *(모든 파일)이며, 이 값은 여기서 수정할 수는 없고 배포 생성 후 추가할 수 있습니다.
  • Viewer Protocol Policy
    • 사용자가 CloudFront 콘텐츠를 액세스 할 때의 프로토콜을 설정합니다.
  • Allowed HTTP Methods
    • CloudFront에서 Origin을 처리하기 위해 허용할 HTTP 메소드를 지정합니다.
  • Field-level Encryption Config
    • 신용 카드 번호 또는 개인 식별 정보 등의 중요한 보안 데이터를 강화하기 위해 필드 레벨 암호화를 적용할 수 있습니다.
  • Cached HTTP Methods
    • OPTIONS 메소드로 요청할 때, CloudFront에서 Origin의 응답을 캐싱할지 여부를 지정합니다.
    • GET, HEAD 요청에 대한 응답은 항상 캐싱합니다.
  • Cache Based on Selected Request Headers
    • CloudFront에서 지정된 헤더의 값을 기반으로 객체를 캐싱할지 여부를 지정합니다.
      • None (improves caching)(없음(캐싱 향상)
        • CloudFront가 헤더 값을 기반으로 객체를 캐시하지 않습니다.
      • Whitelist(화이트리스트)
        • CloudFront가 지정된 헤더의 값(Whitelist)만을 기반으로 객체를 캐시합니다.
        • 즉, Whitelist Headers(화이트리스트 헤더)를 사용하여 CloudFront에서 캐시의 기준으로 설정할 헤더를 선택합니다.
      • 모두
        • CloudFront가 이 캐시 동작과 연결된 객체를 캐싱하지 않습니다.
        • 그 대신 CloudFront가 모든 요청을 Origin에 전송합니다. (Amazon S3 Origin에는 권장하지 않음)
  • Object Caching
    • Origin 서버에서 객체에 Cache-Control 헤더를 추가하여 파일의 캐시 유지 시간을 설정합니다.
    • 유지 시간이 지나면 CloudFront에서 파일이 삭제됩니다
    • Use Origin Cache Headers를 선택하면 Default TTL이 적용되며, 1일(86400초)이 기본값입니다.
    • Customize를 선택하면 Minimum TTL, Maximum TTL를 작성해줘야 합니다.
  • Forward Cookies
    • Origin의 쿠키를 CloudFront를 거쳐 사용자에게 전달할지 설정합니다.
      • None
        • 쿠키를 전달하지 않습니다.
      • Whitelist
        • 선택한 쿠키만 전달합니다.
      • All
        • 쿠키를 모두 전달합니다.
  • Query String Forwarding and Caching
    • CloudFront에서 Origin으로 쿼리 문자열을 전달합니다.
    • Origin에서 쿼리 문자열에 따라 파일을 구분하여 보여주고 싶을 때 설정합니다.
    • 설정하지 않으면 캐시 성능이 향상됩니다. 
  • Smooth Streaming
    • 실시간 스트리밍 프로토콜인 Microsoft Smooth Streaming을 사용하고자 할 때 설정합니다.
    • Microsoft Smooth Streaming 포맷의 미디어 파일을 배포하려는데 IIS 서버가 없으면 를 선택합니다.
    • Microsoft Smooth Streaming 포맷의 미디어 파일을 배포하기 위한 Origin으로 사용하려는 Microsoft IIS 서버가 있거나, Smooth Streaming 미디어 파일을 배포하지 않으려는 경우 아니요를 선택합니다.
  • Restrict Viewer Access
    • CloudFront에서 서명된 URL 또는 Cookie를 통해서만 private content에 접근할 수 있도록 설정합니다.
  • Compress Objects Automatically ( 참고 )
    • 최종 사용자 요청 헤더에 Accept-Encoding: gzip을 포함하는 경우, CloudFront가 특정 유형의 파일을 자동 압축할 것인지 설정합니다.
    • CloudFront가 콘텐츠를 압축하면 파일 크기가 더 작아지므로 다운로드 속도가 빨라지고 웹 페이지는 사용자에게 더 빨리 렌더링됩니다.
  • Lambda Function Associations
    • 아래의 CloudFront 이벤트가 발생했을 때, Lambda 함수를 실행하도록 선택할 수 있습니다.
      • Viewer Request
        • CloudFront가 최종 사용자의 요청을 수신할 때(최종 사용자 요청)
      • Viewer Response
        • CloudFront가 Origin에 요청을 전달하기 전(Origin 요청)
      • Origin Request
        • CloudFront가 Origin의 응답을 수신할 때(Origin 응답)
      • Origin Response
        • CloudFront가 최종 사용자에게 응답을 반환하기 전(최종 사용자 응답)




5) 배포 설정 (3) - 배포에 대한 셋팅


  • Price Class
    • 가격 등급을 선택합니다. ( 요금표 )
    • Edge Location 사용 범위를 설정할 때, 서비스할 지역을 고려하여 아래의 옵션을 선택하면 됩니다.
      • Use Only US and Europe
        • 미국과 유럽의 에지 로케이션만 사용합니다.
      • Use Only US, Europe and Asia
        • 미국과 유럽, 아시아의 에지 로케이션만 사용합니다.
      • Use All Edge Locations
        • 모든 에지 로케이션을 사용합니다. 요금이 더 많이 발생
  • AWS WAF Web ACL
    • AWS WAF는 CloudFront에 전달되는 HTTP 및 HTTPS 요청을 모니터링할 수 있게 해주고 콘텐츠에 대한 액세스를 제어할 수 있게 해주는 웹 애플리케이션 방화벽입니다.
    • AWS WAF 기반으로 요청을 허용 또는 차단하려는 경우 사용합니다.
  • Alternate Domain Names(CNAMEs)
    • CloudFront에서 할당하는 도메인이 아닌, 다른 도메인을 사용할 경우 작성합니다.
    • 도메인 이름을 소유하거나, 도메인 이름을 사용할 권한이 있어야 하며, 사용 권한은 아래 항목인 SSL/TLS 인증서를 추가하여 확인합니다.
    • 여러 개의 도메인을 작성할 수도 있습니다.
  • SSL Certificate
    • HTTPS 프로토콜을 사용하기 위한 인증서 설정입니다.
    • 배포에 사용할 대체 도메인 이름을 지정한 경우, 대체 도메인 이름이 포함된 인증서를 선택합니다.
      • Default CloudFront Certificate
        • CloudFront의 인증서를 사용합니다.
      • Custom SSL Certificate
        • 사용자가 구입한 도메인과 인증서를 사용합니다.
        • Request or Import a Certificate with ACM 버튼을 클릭하여 인증서를 등록합니다.
  • Supported HTTP Versions
    • CloudFront와 통신하는 데 사용하도록 하려는 HTTP 버전을 선택합니다.
    • HTTP/2를 사용하기 위해서는 클라이언트 쪽에서 TLS 1.2 이상을 지원해야 하며 SNI(Server Name Identification)를 지원해야 합니다.
  • Default Root Object
    • CloudFront 배포 도메인의 최상위(루트 URL)로 요청할 때, CloudFront에서 Origin으로부터 요청할 객체를 작성합니다.
    • 기본 루트 객체를 지정하면 배포 콘텐츠가 노출되지 않기 때문에, 작성해주는 것이 좋습니다.
      • 기본 루트 객체를 지정하는 경우 객체 이름만 입력하면 됩니다. (ex: index.html)
      • 물론 index.html 파일은 Origin에 존재해야 합니다.
  • Logging
    • CloudFront 접속 로그에 대한 설정입니다.
    • 로깅을 활성화해도 추가 비용이 들지는 않지만, 파일을 Amazon S3 버킷에 저장하고 액세스하는 데 일반 Amazon S3 요금이 발생합니다. 활성화 하면 아래의 항목들을 작성해줘야 합니다.
      • Bucket for Logs
        • CloudFront 로그를 저장할 S3 버킷을 선택합니다.
      • Log Prefix
        • S3 버킷에 로그를 저장할 때 사용될 디렉터리 명을 설정합니다.
      • Cookie Logging
        • 쿠키를 액세스 로그에 포함할 것인지 선택합니다.
  • Enable IPv6
    • CloudFront는 항상 IPv4 요청에 응답합니다.
    • CloudFront에서 IPv4 IP 주소의 요청 및 IPv6 주소의 요청에 응답하도록 하려면 IPv6 사용을 선택합니다.
    • 일반적으로, 콘텐츠를 액세스하려는 사용자 중에 IPv6 네트워크의 사용자가 있을 경우 IPv6를 사용하도록 설정해야 합니다. 그러나 서명된 URL이나 서명된 쿠키를 사용하여 콘텐츠에 대한 액세스를 제한하며, IpAddress 파라미터를 포함하는 사용자 지정 정책을 사용하여, 콘텐츠에 액세스할 수 있는 IP 주소를 제한하려는 경우에는 IPv6를 사용하도록 설정하지 말고, 배포를 2개 만드는 것이 좋습니다.
  • Comment
    • 배포의 설명을 작성합니다.
  • Distribution State
    • 배포가 완료되었을 때 활성화 또는 비활성화할지 여부를 나타냅니다. 
      • Enabled
        • 바로 사용할 수 있는 상태
      • Disabled
        • 배포만 생성, 비활성화 상태



이상으로 설정을 모두 마치고 Create Distribution 버튼을 클릭하여 배포를 생성합니다.




6) 배포 생성



배포가 생성되면 좌측의 Distributions을 클릭하여 배포 목록을 확인합니다.




7) 배포 상태 확인

Status는 In Progress이므로 Edge에 배포되고 있는 상태입니다.
State는 Enabled이므로 CloudFront를 사용하고 있다는 것을 알려줍니다.

Deployed는 배포가 완료된 상태이며, 약 10분 정도 소요된 것 같습니다.




8) 테스트 - CloudFront 도메인으로 S3 객체 접근
마지막으로 CloudFront에서 기본 할당된 Domain Name(dq582wpwqowa9.cloudfront.net)을 통해 버킷의 객체에 접근해보도록 하겠습니다.


버킷에 다음과 같이 sample.jpg 파일이 있을 때, 브라우저에서 아래와 같이 요청하면 파일이 다운로드 되는 것을 확인할 수 있습니다.

dq582wpwqowa9.cloudfront.net/sample.jpg



html 파일이 있다면 html 파일로도 접근이 가능합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>CloudFront 테스트</title>
</head>
<body>
<h1>Hello World!</H1>
</body>
</html>

dq582wpwqowa9.cloudfront.net/index.html





이상으로 CloudFront에 대해 알아보았습니다.


[참고 자료]

https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html

http://pyrasis.com/book/TheArtOfAmazonWebServices/Chapter12/02