이전 포스팅에서 S3 버킷을 생성하고, Spring boot를 활용하여 해당 S3에 파일을 업로드하는 방법에 대해서 알아보았다.
이번 포스팅에서는 CloudFront에 대해 간단히 알아보고, AWS CloudFront 서비스를 이용하여 CDN을 구축해보고자 한다.
이후, 다음 포스팅에서는 배포한 CloudFront 경로로 파일을 접근할 수 있게 Spring boot 프로젝트 코드를 수정하고자 한다.
CloudFront
AWS CloudFront는 정적, 동적 콘텐츠를 빠르게 응답하기 위한 캐시 기능을 제공하는 CDN 서비스이다.
CloudFront는 캐싱을 지원하기 때문에 S3에 저장된 콘텐츠를 직접 접근하지 않아도 되어 S3의 비용이 감소된다.
또한 사용자의 위치에서 가까운 프록시 서버의 캐싱 데이터를 활용할 수 있다는 점에서 더 빠른 응답을 기대할 수 있다.
여기서 CDN이란?
CDN(콘텐츠 전송 네트워크)은 지리적으로 분산된 여러 개의 서버.
웹 콘텐츠를 사용자와 가까운 곳에서 전송함으로써 전송 속도를 높인다.
전 세계 데이터센터는 파일 복사본을 임시로 저장하는 프로세스인 캐싱을 사용한다.
따라서 사용자는 가까운 서버를 통해 웹 활성화 디바이스 또는 브라우저에서 인터넷 콘텐츠에 빠르게 접속할 수 있다.
CDN은 웹 페이지, 이미지, 비디오 등의 콘텐츠를 사용자의 물리적 위치와 가까운 프록시 서버에 캐싱한다.
이렇게 하면 콘텐츠가 로딩될 때까지 기다릴 필요 없이 영화 감상, 소프트웨어 다운로드, 은행 잔고 확인, 소셜 미디어 포스팅, 구매 등의 작업을 할 수 있다.
S3에 CDN을 적용하는 것이 필수는 아니지만, 여러 이점이 있기 때문에 S3와 함께 적용해주는 것이 좋다.
CloudFront 배포 과정
AWS의 CloudFront 서비스에 접속하고, CloudFront 배포 생성을 눌러준다.
1) 배포 설정 - 원본 부분
- 원본 도메인: 말 그대로 원본 도메인을 적는 곳이다. 입력 란을 클릭하면 선택 가능한 origin 목록이 제공된다. 현재 우리는 S3에 CloudFront를 적용할 예정이기 때문에 생성한 S3를 선택해준다.
- 원본 경로: AWS 리소스나 사용자 지정 원본에 있는 디렉터리에서 콘텐츠를 요청할 때 이곳에 디렉토리를 기입하여 생략할 수 있다.
예를 들어, 원본 경로에 /src를 기입했는데 사용자가 {OriginDomain}/image.jpg을 요청했다면, {OriginDomain}/src/image.jpg 경로의 파일을 제공한다. - 이름: 해당 배포 내의 원본을 구분하게 해주는 명칭입니다. 원본 도메인 설정 시 자동으로 기입된다.
- S3 버킷 엑세스: S3 버켓에 CloudFront만 접근할 수 있도록 설정하는 곳이다. 즉, '예'를 누르면, s3 url 주소를 통해 캐시 서버를 거치지 않고 직접 접근하는 것이 불가능해진다.
'예'를 눌러주도록 하자. S3+CloudFront 조합을 사용할 때 Signed URL을 통해 제한을 걸었을 때 S3에 곧장 접근할 수 있다면 서명 URL을 쓰는 이유가 없다. - 원본 엑세스액세스 ID: 기존 액세스 ID를 선택하거나, 새로 만들어 준다.
- 버킷 정책: CloudFront가 S3에서 파일을 읽을 수 있는 권한을 버켓 정책에 설정한다. "예, 버킷 정책 업데이트"를 선택할 경우 다른 접속은 제한되고 CloudFront만 접근할 수 있도록 버켓 정책이 설정된다.
- 사용자 정의 헤더 추가: CloudFront가 원본에 요청을 할 때마다 사용자 지정 헤더를 포함하여 전달하도록 설정한다.
- Origin Shield 활성화: CloudFront 캐싱 계층에 Origin Shield를 추가하는 작업. 캐시 적중 가능성, 원본 로드 감소 등 효과를 얻을 수 있지만, 추가 비용이 발생한다.
2) 배포 설정 - 기본 캐시 동작
- 자동으로 객체 압축: 자동으로 gzip을 통해 오리진의 컨텐츠를 압축한다.
최종 사용자 요청 헤더에 Accept-Encoding: gzip을 포함하는 경우, CloudFront가 특정 유형의 파일을 자동 압축할 것인지 설정한다.
CloudFront가 콘텐츠를 압축하면 파일 크기가 더 작아지므로 다운로드 속도가 빨라지고 웹 페이지는 사용자에게 더 빨리 렌더링 된다. - 경로 패턴: CloudFront로 파일을 가져올 규칙이다. 배포 후 수정할 수 있다.
- 뷰어 프로토콜 정책: 사용자가 CloudFront 콘텐츠를 액세스 할 때의 프로토콜을 설정
- 허용된 HTTP 방법: CloudFront에서 Origin을 처리하기 위해 허용할 HTTP 메서드를 지정
- 뷰어 액세스 제한: CloudFront에서 서명된 URL 또는 Cookie를 통해서만 private content에 접근할 수 있도록 설정
3) 배포 설정 - 기본 캐시 동작
- 캐시 키 및 원본 요청: 캐시 정책과 원본 요청에 대한 부분. 기존의 정책을 사용할 수 있으며, 새로운 정책을 만들 수도 있다. 기본으로 설정된 값으로 설정했다.
- 스무스 스트리밍: 실시간 스트리밍 프로토콜인 Microsoft smooth streaming을 사용하고 싶을 때 설정하자.
- 실시간 로그 활성화: 배포에서 수신한 요청에 대한 정보를 얻을 수 있다.
4) 배포 설정 - 설정
- 가격 분류: 어디까지 엣지 로케이션을 사용할지 설정하는 부분이다. US와 유럽 / US, 유럽, 아시아 / 모든 location 이 세 선택지만 존재한다. 모든 location을 선택할 시 다른 두 선택지보다 요금이 많이 나온다.
- 아마존 WAF 웹 ACL: AWS WAF는 CloudFront에 전달되는 HTTP 및 HTTPS 요청을 모니터링할 수 있게 해 주고 콘텐츠에 대한 액세스를 제어할 수 있게 해주는 웹 애플리케이션 방화벽이다.
AWS WAF 기반으로 요청을 허용 또는 차단하려는 경우 사용한다. - 대체 도메인 이름: CloudFront에서 할당하는 도메인이 아닌, 다른 도메인을 사용할 경우 작성합니다.
도메인 이름을 소유하거나, 도메인 이름을 사용할 권한이 있어야 하며, 사용 권한은 아래 항목인 SSL/TLS 인증서를 추가하여 확인합니다.
여러 개의 도메인을 작성할 수도 있습니다. - 사용자 정의 SSL 인증서: HTTPS 프로토콜을 사용하기 위한 인증서 설정이다.
배포에 사용할 대체 도메인 이름을 지정한 경우, 대체 도메인 이름이 포함된 인증서를 선택한다. - 지원되는 HTTP 버전: CloudFront와 통신하는 데 사용하도록 하려는 HTTP 버전을 선택합니다.
HTTP/2를 사용하기 위해서는 클라이언트 쪽에서 TLS 1.2 이상을 지원해야 하며 SNI(Server Name Identification)를 지원해야 합니다. - 기본값 루트 객체: CloudFront 배포 도메인의 최상위(루트 URL)로 요청할 때, CloudFront에서 Origin으로부터 요청할 객체를 작성한다.
기본 루트 객체를 지정하는 경우 객체 이름만 입력하면 됩니다. (ex: index.html) - 표준 로깅: CloudFront 접속 로그에 대한 설정입니다.
로깅을 활성화해도 추가 비용이 들지는 않지만, 파일을 Amazon S3 버킷에 저장하고 액세스 하는 데 일반 Amazon S3 요금이 발생한다. - IPv6: CloudFront는 항상 IPv4 요청에 응답합니다.
CloudFront에서 IPv4 IP 주소의 요청 및 IPv6 주소의 요청에 응답하도록 하려면 IPv6 사용을 선택하자.
배포 확인 및 테스트
설정을 모두 마치고 배포 생성 버튼을 누르면 배포가 시작된다.
이제 배포된 도메인 이름(dqkvehwnfe1ut.cloudfront.net)을 통해 S3에 저장된 다음 파일에 접근해보자.
요청 시 다음과 같이 저장된 이미지가 출력되는 것을 볼 수 있다.
다음 포스팅에서는 배포한 CloudFront 경로로 파일을 접근할 수 있게 SpringBoot 프로젝트 코드를 수정해보자.
참고
https://victorydntmd.tistory.com/335
https://darrengwon.tistory.com/62
https://velog.io/@dlrmsghks7/learncloudfrontforbiginner
https://www.akamai.com/ko/our-thinking/cdn/what-is-a-cdn
'👨💻 개발' 카테고리의 다른 글
IAM이란? (0) | 2021.12.08 |
---|---|
SpringBoot에 CloudFront 적용 (0) | 2021.12.07 |
SpringBoot로 AWS S3에 파일 업로드 하기 (0) | 2021.12.05 |
AWS S3 저장소 구축하기 (0) | 2021.12.05 |
SpringBoot 파일 업로드 구현 (0) | 2021.12.03 |