최근 진행되고 있는 프로젝트에서 AWS S3 와 CloudFront를 사용하여 동영상 서비스를 하고 있는데 CBT중이라 버그 리포팅이 자주 오고 있다.

분명히 테스트때는 정상 작동을 했는데 왜 항상 실제 사용하면 버그가 튀어나올까...?!


Video Thumbnail 파일을 새로 업로드 하였는데 이미지가 바뀌지 않는다는 내용의 문제가 접수되었다. 

Thumbnail 수정 로직은 기존에 사용하던 파일 이름에 확장자만 새로 올린 사진 파일을 따르게 되어있었다. 해서, 사진이 업로드된 S3에는 새로 올려진 파일이 존재하는데, CloudFront에 요청을 하면 캐시되어있는 예전 사진이 보여지는것이었다. 



파일이 새로 올라왔는데 CloudFront는 왜 새로운 파일을 캐시하지 못했을까?


문제 해결을 위해 문서를 찾아보니 다음과 같은 내용을 확인하였다.

CloudFront 배포에서 기존 객체를 업데이트하고 동일한 객체 이름을 사용할 수는 있지만 권장되지는 않습니다. CloudFront에서는 오리진에 새 객체나 업데이트된 객체를 배치할 때가 아닌 객체가 요청된 경우에만 엣지 로케이션에 객체를 배포합니다. 이름이 같은 최신 버전으로 오리진에서 기존 객체를 업데이트한 경우, 다음 두 가지 상황이 모두 발생하기 전까지는 엣지 로케이션에서 오리진으로부터 새 버전을 가져오지 않습니다.

문제에 대한 이유를 찾았으니, 문제 해결을 해보도록 했다.


CloudFront 엣지 캐시에서 객체가 만료되기 전에 이것을 제거하는것, 즉 CloudFront의 객체 무효화를 사용하면 된다. 


1. AWS Console에 접속하여 CloudFront 페이지로 이동한다.


2. 문제가 발생한 Distribution을 선택한다.


3. Invalidations탭을 선택한다.


4. Create Invalidation을 선택한다.



5. Object Paths에 Invalidate할 파일 이름을 적어준다.


이때 Origin Path를 제외하고 난 나머지를 적어주면 된다.

예를 들어, 

Invalidate할 파일이 S3 bucket에 /thumbnail/1234.jpg이고,

CloudFront의 Origin Path가 /thumbnail로 잡혀있다면, 

Create Invalidation의 Object Path에 1234.jpg를 적어주면 된다.



6. Invalidate버튼을 누르고 Status가 Completed가 되길 기다리면 된다. (생각보다 오래 걸린다...)


참고로 Invalidation은 무료 갯수가 제한되어있어서 그 이상 Invalidate을 하게 되면 과금되니 주의해야 한다.


과금 정보는 다음 페이지에서 확인 가능하다.

http://aws.amazon.com/cloudfront/pricing/






참고자료


http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/ReplacingObjectsSameName.html





신고
Posted by jjangAh

요새 AWS에서 제공하는 서비스들을 사용하여 동영상 스트리밍 서비스를 구축을 하고 있다. AWS쪽 관리와 운영 방법을 인수인계를 받는 중에 정리를 위하여 블로그를 작성해보기로 했다.



AWS S3와 CouldFront를 사용하여 동영상 스트리밍 서비스 해보기.



시나리오 

이 동영상 스트리밍 서비스는 권한이 부여된 사용자에게만 서비스를 하기 위하여 Signed Cookie와 Signed URL을 사용하여 서비스 한다. 



준비물은 다음과 같다.


1) AWS CloudFront, S3

2) 서비스 대상 HLS 파일


1. 먼저 S3에 Bucket을 생성한다.





2. 서비스 대상 HLS파일을 S3에 업로드 한다. 파일 업로드 방법은 다양한데, 이번 예제에서는 AWS Consol을 사용하여 업로드 해 보도록 하겠다.


먼저 폴더를 생성한다.


서비스 대상 HLS 파일들을 업로드 한다.



업로드가 완료되었다.



3. CloudFront 설정

CloudFront를 셋팅하기 위해 CloudFront페이지로 접근한다.


3.1 주요 설정

CloudFront의 주요설정은 다음과 같다.

Delivery Method 

- RTMP와 WEB이 있다. HLS는 WEB 방식의 Delivery를 사용하기 때문에 값을 WEB으로 선택한다. 

Origin Domain Name

- CloudFront로 서비스 하고자 하는 S3 Bucket이름이다. 클릭하면 select box가 나타난다.

Origin Path 

- S3 Bucket내의 DocumentRoot. S3 Bucket 내의 디렉토리 중 어느 위치를 해당 CloudFront의 /로 사용할 것인지를 나타낸다.

Restricted Bucket Access 

- S3에서 자체적으로 서비스를 하지 않고 CloudFront를 통해서만 서비스가 가능하도록 한다.

설정값은 Yes.

Origin Access Identity 

- S3 접근에 사용할 접근 정보. 이미 기존에 만들어진 것이 있기 때문에 기존 내용을 사용하면 된다. CloudFront의 좌측 하단 메뉴에서도 관리가 가능하다. 설정 값은 Use Existing Identity.

Grant Read Permissions on Bucket

- Origin Access Identity가 S3에 접근 가능하도록 하기 위해서는 S3의 Policy를 업데이트 해야 한다. 이것을 자동으로 해준다. 설정값은 Yes.

Forward Header 

- CORS가 정상적으로 적용되도록 하기 위해서는 Origin을 Forward해줘야 한다. 설정 값은 WhiteList.

Restricted Viewer Access 

- Signed Cookie, Signed URL이 필요하도록 할 경우 Yes. Signed Cookie, Signed URL을 통해서만 접근이 가능하도록 할 경우 설정한다.


그 외의 옵션은 모두 기본값으로 설정한다.



3.2 CloudFront Key Pairs

Signed Cookie, Signed URL을 사용할 경우 Security Credential에서 CloudFront Key Pairs를 설정해야 한다. Security Credential 메뉴는 우측 상단의 로그인 아이디를 클릭하면 메뉴에 나타난다.

여기에서 CloudFront Key Pairs를 추가하거나 Access Key ID를 확인할 수 있다.



4. 동영상 재생을 하기 위해 HLS 파일 주소 가져오기


지금 하고 있는 프로젝트에서는 Signed URL, Signed Cookie 생성시 expire time을 1분으로 주어 생성된 url을 1분간 유효하도록 하였다. 하지만 1분이 지나면 비디오 시청이 불가능해지므로, 비디오 재생 후 매 30초 마다 Signed Cookie를 발급받는 api를 호출하여 인증 갱신하도록 하였다.


4.1 동영상 시청을 위하여 Signed Cookie를 발급하는 API를 호출한다. 이 API는 CloudFront-Key-Pair-Id, CloudFront-Policy, CloudFront-Signature를 키값으로 하는 쿠키를 발급한다. Signed Cookie 생성은 아래 문서를 참고하여 만든다.

http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-cookies.html


4.2 Signed URL로 비디오 파일을 요청한다. Signed URL은 암호화된 CloudFront-Policy, CloudFront-Signature와 위의 3.2에서 발급된 CloudFront-Key-Pair-Id를 포함하고 있다. 

Signed URL생성은 아래 문서를 참고 한다.

http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html


API에서 생성하는 Signed URL 구성은 다음과 같다.


http://도메인 이름/{Path가 포함된 file명}?Policy={암호화된 Custom Policy값}&Signature={암호화 된 signature값}&Key-Pair-Id={Access Key ID값}



위의 방법을 통해 S3내의 HLS파일을 받아와 플레이어에서 재생시킬 수 있다. 현재 진행중인 프로젝트에서는 html의 video태그와 hls.js를 이용하여 라이브스트리밍을 가능하게 하였다.

마치며...
AWS에서 제공하는 Product로 구성해본 동영상 스트리밍 서비스는 HLS파일이 있다면 매우 간단하고 빠르게 구성하여 서비스 가능하다. 또한 CloudFront설정에서 Signed Cookie와 Signed URL사용으로 파일 보안까지 유지 할 수 있다. 물론 HLS파일이 준비되어있다는 가정 하에 구성한것이라 간단한 작업을 통해 구성될 수 있었다. AWS Elastic Transcoder를 이용하여 Video파일을 HLS파일로 Transcoding을 할 수 있는데 이것은 다음번 포스팅에서 다루도록 하겠다.


신고
Posted by jjangAh