-
AWS의 Cloud Front 란 ( CDN 서비스 )DevOps/AWS 2020. 9. 6. 23:24
CND이란?
- Cloud Front는 CDN (Contents Delivery Network)이다.
- 이미지나 동영상 같은 정적인 콘텐츠들을 서비스한다.
- 서버가 있는 데이터 센터에서 서비스를 하게 되면 네트워크 latency로 인해 성능이 저하가 된다.
- 따라서 전 세계의 여러 개의 데이터 센터에 서버를 넣고 ( edge Node, edge Server )
- 클라이언트와 가까운 데이터 센터로부터 콘텐츠를 제공하는 서비스이다.
- 얼마나 많은 지역별 데이터 센터에 edge Node를 설치하고 서비스를 제공하느냐 혹은
- 각 edge Node의 네트워크 대역폭이나 용량 등은 충분한지에 따라 서비스의 품질을 결정하게 된다.
- 그 예로 Akamai와 Limelight 등의 업체가 있다.
- 아마존의 경우도 Cloud Front라는 이름으로 CDN 서비스 제공을 시작하였다.
1. Client가 웹 사이트에 접속한다.
웹 사이트의 이름은 www.example.com 이라고 하자.
2. Client는 DNS 서버를 통해서 www.example.com 의 주소를 look up 한다.
이때 www.example.com은 은 Cloud Front의 URL로 맵핑이 되어있어야 하는데
CNAME 레코드를 이용해서 www.example.com 을 해당 사이트에 대한 Cloud Fornt URL로 맵핑 한다.
여기서는 asd.cloudfront.net 이라고 가정하자.
3. Client는 asd.cloudfront.net의 주소를 다시 look up 하는데
Route53에 의해서 Client와 가장 가까운 위치에 있는 Cloud Front의 edge Node 주소를 리턴받게 된다.
4. Client는 리턴 받은 ip 주소를 가지고 Cloud Front의 edge Server 로 접속 한다.
5. Cloud Front에는 URL에 따라서 resource에 위치를 RULE로 정해놓는데
위의 예에서는 /image 디렉토리 파일은 S3에 원본을 두고 Cloud Front에 캐슁 하도록 하고
/css/ 아래 파일들은 원격지에 있는 ( Amazon 이 아닌 ) 서버에 두고 캐슁을 하도록 하였다.
그리고 *.jsp 파일은 캐슁 없이 직접 원본 서버로 가도록 하였다.
6. 만약 /image/나 /css/에 있는 파일은 Client가 요청 하였을 경우 edge Node의 캐쉬를 체크해보고
캐쉬에 내용이 없다면 원본 서버로 부터 파일을 읽어서 캐쉬에 저장한 후 Client에 리턴한다.
캐쉬에 있을 경우에는 바로 리턴하게 된다.Origin Server
앞에서 설명한 시나리오에서 원본 파일이 저장되는 곳을 Origin Server라고 한다.
Origin Server는 Amazon의 S3 Bucket이나 EC2 인스턴스 혹은 Amazon 밖의 서버가 될 수 있다.
서비스가 가능한 콘텐츠의 종류
- Cloud Front를 통해서 서비스가 가능한 컨텐츠의 종류는 다음과 같다.
- DownLoad Distribution : Http 프로토콜을 이용해서 다운로드할 수 있는 이미지나 기타 정적 인리 소스 파일
- Streaming Distribution : Http Progressive Download 나 RTSP(Real Time Streaming Protocol을 지원하는 동영상 콘텐츠
Cache 동작
- CND은 기본적으로 콘텐츠를 Edge Node에 캐시 해놓는 것을 기능으로 한다.
- 캐시이기 때문에 유지 시간 TTL이 있는데 TTL 시간은 24시간이고 최대 1시간으로 까지 줄일 수 있다.
- 만약 파일을 잘못 올렸거나 수정이 필요한 경우
- 캐시의 TTL 시간에 의해서 edge Node에 반영되는 시간까지 최소 1시간이 소요된다.
- 이런 문제를 해결하기 위해 Cloude Front는 Invalidation API ( 특정 파일을 캐시에서 지우는 기능 )을 제공한다.
- 한 번에 최대 3개의 invalidation request를 실행할 수 있으며
- 각 invalidation request는 최대 1000개의 파일까지만 지원한다.
- 그리고 invalidation request는 모든 edge Node에 반영되어야 하기 때문에
- 보통 5 ~ 10 분 정도의 시간이 소요된다.
- 그래서 조금 더 빠르게 캐시에서 콘텐츠를 업데이트하기 위해
- 버전을 사용하기를 권장을 하는데 쉽게 이야기하자면 파일명을 바꾸도록 하는 것이다.
- /image/photo.png가 있을 때 이 파일이 변경되기를 원한다면
- HTML 원본에서 해당 이미지 명을 /image/photo_v2.png로 변경하고
- 새로운 파일명도 photo_v2.png로 저장을 하면
- 별도의 cache invalidation 작업 없이 바로 변경 내용을 반영할 수 있다.
- 파일명을 바꾸는 게 부담스러운 경우 Query String을 사용할 수도 있다.
- 예를 들어 /image/photo.png? version=1.0으로 HTML에서 이미지 경로를 걸어 놓으면
- Cloud Front는 "photo.png? version=1.0"을 Key로 캐시에 파일을 저장을 하고
- Origin Server에 이렇게 파일을 요청하게 되면
- 이 파일은 정적인 콘텐츠이기 때문에 Query String 은 무시되고
- Origin Server는 "photo.png" 파일만 리턴한다.
- 원본 콘텐츠가 바뀌었을 경우 원본 콘텐츠의 파일명은 변활 할 필요가 없이 똑같이 "photo.png" 파일로
- 저장하되 HTML 참조명을 /image/photo.png? version=2.0으로만 바꿔주게 되면
- Cloud Front 입장에서는 resource의 이름이 아까와는 다른 이름이기 때문에
- Cache에서 찾지 못하고 다시 Origin Server로 요청하게 된다.
- 참고로 Queyr String을 버전명으로 사용하기 위해서는
- Cloud Front 설정에서 Query String by pass 기능을 ON 해줘야 한다.
비공개 콘텐츠에 대한 접근 제어
- 정적이 콘텐츠를 다루다 보면 특정 사용자에게만 서비스를 제공해야 하는 경우가 있다.
-
ex ) 유료 앱 다운로드, 유료 동영상 서비스
- Cloud Front는 Signed URL이라는 기능을 사용하여, CDN 콘텐츠에 대한 접근 제어 기능을 제공한다.
- CDN의 특정 파일에 대한 접근 가능 정책( { IP주소, 접근 가능 기간 등 } )을 정하고 URL을 생성한 후 암호화하여 사용자에게 제공하는 것
- 해당 URL로 CDN 내의 콘텐츠를 접근하면, 접근 권한에 정의된 조건을 충족했을 시 다운로드를 할 수 있도록 해준다.
Signed URL 부가적인 기능
- SSL을 통해서 콘텐츠를 서비스 하는 기능
- 컨텐츠 서비스 내용을 HTTP access 로그로 남겨서 S3에 저장하는 기능들이 있다.
성능 향상 방법
Cloud Front를 사용하는 데 있어서 몇 가지 성능을 향살 시킬 수 있는 방법이 있다.
1. Domain Sharding
- 일반적으로 웹 브라우저는 하나의 도메인 주소에 대해서 동시에 열 수 있는 네트워크 Connection 수가 제한이 있다.
-
ex ) Chrome은 6개 Fire Fox의 경우 8개이다.
- 그런데 일반적인 웹 페이제에서 동시에 로딩되는 리소스는 대략 20~50개 정도이다.
- 즉 웹브라우저가 여는 Connection에 수로는 한꺼번에 모든 리소스 로딩이 어렵게 된다.
- 일반적인 CDN에서도 적용될 수 있는 기법으로 하나의 시스템에 여러 개의 도메인을 적용하는 것이다.
- 예를 들어 서버의 주소가 210.113.119.210이라고 하고 도메인 명이 www.example.com이라고 하자.
- CNAME으로 image.example.com, resource.example.com , css.example.com 등
- 여러 개의 도메인을 같은 URL을 가리키도록 해놓고
- HTML에서도 iamge ulr을 "src="http://image.example.com/img/myimage.png" 식으로 지정해놓게 되면
- 브라우저 입장에서는 전혀 다른 사이트로 인식하기 때문에 별도의 네트워크 Connection을 열 수 있다.
- 이 방법을 사용하면 브라우저의 Connection을 최대로 열어서 전체적인 웹사이트 Loading Time을 증가시킬 수 있다.
2. Compression
- CND은 네트워크에 관련되는 서비스이기 때문에
- 당연히 원본 콘텐츠의 사이즈가 작으면 성능이 사용하는 대역폭도 작아지고 성능도 더 잘 나온다.
- 압축 기능을 사용하기 위해서는 Origin Server가 Apache와 같은 웹 서버인 경우
- gzip Compression 기능을 웹 서버에 적용해주면 되지만
- S3를 Origin Server로 사용하는 경우 S3 자체에는 gzip Compression 기능을 가지고 있지 않기 때문에
- 콘텐츠를 할 때 gzip으로 압축해서 올리고 "Content-Encoding"을 gzip으로 명기해주면 된다.
참조
'DevOps > AWS' 카테고리의 다른 글
AWS의 Route 53 DNS 서비스 (0) 2020.09.04