본문 바로가기

FrontEnd+

AWS 배포 가이드북 - S3 + CloudFront 편

 

지난 AWS 배포 가이드북 - EC2 편 에 이어서 이번에는 S3와 CloudFront를 다루어보려고 한다.

 

💬 S3 + CloudFront 소개

S3

S3(Simple Storage Service)는 확장성이 뛰어난 클라우드 저장장치이다. S3를 이용하면 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있다. 사용자는 원하는 버킷을 만들고 버킷 내 객체에 데이터를 저장하기만 하면 된다.

S3에서 이야기하는 버킷(Bucket)은 S3의 최상위 단위이자 각 스토리지 계정을 구분하고 ID 역할을 한다. '양동이'라는 뜻 답게 버킷에는 객체를 담을 수 있다.

객체(Object)는 S3에서 기본 저장 단위로, 버킷 내에서 key와 version id로 고유하게 구분할 수 있다. 즉, S3의 구성은 { "버킷 + key + version id" : 객체의 데이터 } 의 형식을 따르는 데이터 Map 구조라고 생각할 수 있다.

객체는 객체 데이터와, 메타 데이터로 구성되는데, 메타 데이터에는 Content-Type 같은 표준 HTTP 메타데이터가 포함되고 객체를 저장할 때 사용자 정의 메타 데이터를 지정할 수도 있다. 

만약 photos/puppy.jpg이라는 객체를 미국 서부(오레곤) region의 awsexamplebucket1 버킷에 저장한다면 https://awsexamplebucket1.s3.us-west-2.amazonaws.com/photos/puppy.jpg라는 url로 주소를 지정할 수 있게 된다.

 

CloudFront

CloudFront는 html, css, js 및 이미지와 같은 정적 및 동적 웹 콘텐츠를 사용자에게 더 빨리 전송할 수 있도록 지원하는 웹 서비스이다.

CloudFront는 현재 47개국 90개 도시에서 215개 이상의 엣지 로케이션 215개 이상과 region별 중간 티어 캐시 13개로 구성된 글로벌 네트워크를 사용하고 있다. 

CloudFront에서 얘기하는 엣지 로케이션(Edge Location)은 전 세계 데이터 센터를 가리킨다. 만약 사용자가 CloudFront를 통해 서비스하는 콘텐츠를 요청하면, 지연시간이 가장 낮은 엣지 로케이션으로 요청이 라우팅된다. 따라서, 사용자의 요청이 통과하는 네트워크의 수가 줄어들고 데이터 전송 속도가 빨라져 더 짧은 지연 시간으로 콘텐츠를 전송할 수 있게된다.

또한 파일(객체)의 사본이 전 세계 여러 엣지 로케이션에 유지(캐시)되므로 안정성이 올라간다.

S3만 사용할 경우 / S3 + CloudFront로 사용할 경우 (출처: AWS post)

 

 

📝 S3 튜토리얼

버킷 만들기

S3에 데이터를 업로드하려면 우선 하나의 S3 버킷을 만들어야 한다. 버킷을 만들기 위해 AWS 계정으로 로그인하고 AWS 관리 콘솔에 접속하고, 검색창에 'S3'를 검색해서 S3 서비스로 이동해보자. 

상단 검색창에 S3 검색

S3 메인화면에서 [버킷 만들기] 버튼을 클릭해서 버킷을 구성을 시작해보자. 

S3 메인화면 - 버킷 만들기 클릭

1. 일반구성

3자 이상 63자 이하로 버킷 이름을 기입한다. 버킷이름에는 소문자, 숫자, 점(.), 하이픈(-)만 들어갈 수 있다. 공백이나 대문자는 안된다. 버킷 이름은 버킷의 객체를 가리키는 url에 표시될 거라, 중요한 정보를 포함하면 안된다.

AWS region을 선택한다. 버킷을 지리적으로 어디에 저장할지 정하는 것인데, 지연 시간 최적화, 비용 최소화, 규정 요구사항 준수 등 다양한 필요에 따라 region을 지정하면 된다. 지리적으로 가장 가가운 region을 선택하자.

버킷 만들기 - 일반 구성

2. 퍼블릭 액세스 차단 설정

S3 퍼블릭 액세스 차단을 사용하면 계정 관리자(CU)와 버킷 소유자(나)가 S3 리소스에 대한 퍼블릭 액세스를 제한하는 중앙 집중식 제어를 쉽게 설정할 수 있다.

버킷과 객체 권한은 서로 독립적이어서, 객체는 해당 버킷으로부터 권한을 상속하지 않는다. 예를 들어, 버킷을 만들고 사용자에게 쓰기 액세스 권한을 부여한다고 해서, 반드시 해당 사용자의 객체에 액세스할 수 있는 것은 아니다.

퍼블릭 액세스 설정 기본값은 모든 퍼블릭 액세스 차단으로 되어있다. 모든 S3 액세스 포인트, 버킷 및 객체의 퍼블릭 액세스가 차단되도록 하려면 이렇게 설정해두는 것이 좋다.

버킷 만들기 - 퍼블릭 액세스 차단 설정

3. 버킷 버전 관리

버전 관리를 사용하면 하나의 버킷에 여러 버전의 객체를 보관할 수 있다. 기본값은 버전관리를 사용하지 않는 것이다. 객체를 하나만 만들 예정이니 비활성화로 유지하자.

버킷 만들기 - 버킷 버전 관리

4. 태그

요금 청구에 참고할 수 있게 태그를 달아줄 수 있다. 스토리지 비용 추적 용도이다. 해당사항이 없으니 skip

버킷 만들기 - 태그

5. 기본 암호화

해당 버킷 내 객체를 암호화할지 설정할 수 있다. 기본 값은 암호화를 하지 않는 것이다. 기본 암호화가 활성화되기 전에 버킷에 있었던 객체의 암호화는 변경되지는 않는다. 해당사항이 없으니 skip

버킷 만들기 - 기본 암호화

6. 고급설정

S3 객체 잠금을 사용하면 객체가 write-once-read-many 모델로 저장된다. 객체를 삭제하거나 덮어쓰지 않도록 보호하고 싶은 경우 사용한다. 해당사항이 없으니 skip

버킷만들기 - 고급설정

 

필요한 모든 설정을 마치고 [버킷 만들기] 버튼을 클릭하면, 앗... 에러가 떴다.

앗...

슬랙에 문의해보니 웨지가 친절하게 답변해주고, CU가 바로 해결해주셨다! (감사합니다)

다시 버킷을 생성하면 성공적으로 생성되었다는 메세지를 확인할 수 있다. 이제 객체에 정적 리소스를 담는 작업으로 넘어가보자.

 

객체(Object)에 리소스 넣기

필요한 파일을 드래그앤 드롭 해준다.

필요할 경우 메타데이터를 설정해준다.

S3 메타이터 설정 - 캐시 설정 및 브라우저 헤더 조회 결과

 

 

📝 클라우드프론트 튜토리얼

Origin 설정

Origin domain 을 생성해둔 S3의 엔드포인트로 설정한다.

 

[S3 bucket access] 에서 'Yes use OAI'를 선택하고 'Create new OAI' 버튼 클릭해서 Create 한다. OAI(Origin Access Identity)의 줄임말이다. 'Yes, update the bucket policy'를 선택한다.

 

[Enable Origin Shield] 에서 'Yes'를 선택한다. Origin Shield region은 'Asia Pacafic (Seoul) ap-northeast-2'로 설정해준다.

 

캐시 설정

최하단의 Create distribution을 클릭한다.

 

 

만약 화면이 이렇게 뜬다면 [일반]-[편집]에서 이 설정을 빼뜨린 것일 확률이 높다.  (설명1, 설명2)

기다리면 배포된다.

S3 변경했을 때 무효화

 

 

+ 용어정리

CDN

CDN(Content Delivery Network)웹 콘텐츠를 사용자와 지리적으로 가까운 곳에서 전송함으로써 전송속도를 높이기 위해 여러 서버를 분산해서 설치해둔 네트워크이다.

CSR에서 CDN 배포를 권장하는 이유는 CSR에서는 번들 크기가 커서 캐싱 전략이 중요하기 때문이다. CDN을 사용하면 지리적으로 가까운 위치에서 캐싱된 자원을 빠르게 가져올 수 있는데, 정적 파일은 거의 변경사항이 없어 CDN을 통해 가져오는 것이 유리하다. 

출처: https://web.dev/content-delivery-networks/