Notice
Recent Posts
Recent Comments
Today
Total
04-20 07:15
Archives
관리 메뉴

Jeongchul Kim

AWS Lambda Serverless 프로젝트 3 - SNS, Lambda, S3 본문

AWS

AWS Lambda Serverless 프로젝트 3 - SNS, Lambda, S3

김 정출 2018. 4. 21. 21:53


AWS Lambda Serverless 프로젝트 3 - SNS, Lambda, S3



AWS Lambda Serverless 프로젝트 1 - AWS CLI, Lambda, S3, IAM

AWS Lambda Serverless 프로젝트 2 - IAM, Lambda, Elastic Transcoder, NPM, S3, CloudWatch

AWS SNS(Simple Notification Service) 설정


작업의 다음 단계는 간단한 알림 서비스(SNS)를 serverless-video-transcoded 버킷에 연결하는 것입니다. Elastic Transcoder가 새 파일을이 버킷에 저장 한 후에는 전자 메일을 보내고 새 파일을 공개적으로 액세스 할 수있게 만들고 메타 데이터가 포함 된 JSON 파일을 만들 수있는 두 개의 다른 Lambda 함수를 호출해야합니다.


SNS 주제와 세 가지 구독을 만듭니다. 한 구독은 전자 메일에 사용되며, 다른 두 항목은 Lambda 함수를 트리거합니다. serverless-video-transcoded 버킷은 새 비디오가 나타나자마자 자동으로 이벤트 알림을 만들고 SNS 주제에 알림을 보내 워크 플로우의이 부분을 시작할 수 있습니다.


다음의 그림은 가운데에 SNS 주제가 있고 새 알림를 사용하는 세 명의 구독자가 있는 시스템의 부분을 표시합니다.


AWS 콘솔에서 SNS를 클릭 한 다음 주제 작성을 선택하여 새 SNS 주제를 작성하십시오. 주제에 코드 변환 된 비디오 알림과 같은 이름을 지정합니다.
serverless-video-transcoded 버킷에 새 객체가 추가되면 SNS에 이벤트가 푸시되도록 S3을 SNS에 연결해야합니다. 이를 위해 S3와 통신 할 수 있도록 SNS 보안 정책을 수정해야합니다.

1.서비스 메뉴에서 SNS (Simple Notification Service)를 클릭합니다.


2. 주제 생성 버튼을 클릭합니다.


3. 주제 이름(transcoded-video-notification)과 표시 이름(transcoding-noti)을 입력하고 “주제 생성" 버튼을 클릭합니다.


4. 주제 탭으로 가서 “기타 주제 작업” 드롭다운 메뉴를 클릭하고 “주제 정책 편집" 버튼을 클릭합니다.

5. 주제 정책 편집에서 고급 보기 버튼을 클릭해서 다음의 코드처럼 Condition을 조건으로 변경합니다.

"Condition" : {
"ArnLike": {
"aws:SourceArn": [ARN-S3-TRANSCODED-BUCKET]
}
}   


수정하고 정책 업데이트 버튼을 클릭합니다.


[ARN-S3-TRANSCODED-BUCKET] S3 버킷의 ARN을 확인하기 위해서는 S3 콘솔에서 serverless-video-transcoded 버킷을 클릭하고 “버킷 ARN 복사” 버튼을 클릭합니다.



AWS S3와 SNS 연동

AWS에서 S3 콘솔로 이동하여 serverless-video-transcoded 버튼을 클릭합니다.

속성 탭으로 이동해 이벤트를 클릭합니다.


알림 추가 버튼을 클릭하고 이벤트 이름은 Transcoded Video로 입력하고 ObjectCreate(모두)  체크박스를 클릭합니다. 접두사는 mp4 이며, 전송대상은 SNS주제를 선택합니다. SNS는 transcoded-video-notifications 를 클릭합니다.



새로 생성된 이벤트를 확인할 수 있습니다. SNS와 S3의 연동은 끝났습니다.


SNS로부터 email 설정


요구 사항 중 하나는 각 트랜스 코딩 파일에 대한 이메일을받는 것입니다. 새 트랜스 코딩 파일이 저장 될 때마다 S3 버킷에서 이벤트를받는 SNS 항목이 있습니다. 전자 메일 수신을 시작할 수 있도록 해당 항목에 대한 새 전자 메일 구독을 만들어야합니다.


SNS 콘솔에서 다음 단계를 수행합니다

1. 주제를 클릭 한 다음 SNS 주제의 이름 (transcoded-video-notification)의 체크박스를 클릭합니다.

2. Actions를 클릭하고 Topic에 가입을 선택하십시오. 서브 스크립 션 생성 대화 상자가 나타납니다.


3. 대화 상자에서 전자 메일을 프로토콜로 선택하고 전자 메일 주소를 엔드포인트로 입력합니다.

4. “구독 생성" 버튼을 클릭하여 저장하고 대화 상자를 종료합니다.


직접 serverless-video-uploaded 버킷에서 비디오 업로드하여 테스트를 해보면 SNS는 즉시 확인 이메일 보내고, 추가 알림을 받으려면 활성화를 해야합니다. 그리고 앞으로 버킷에 파일이 추가될 때마다 이메일을 받게됩니다.


비디오 파일 권한(permissions) 설정


두 번째로 생성할 Lambda 함수는 Transcoded 된 파일의 권한 설정을 공개적으로 액세스할 수 있도록 변경합니다.

이를 통해 새로 URL을 이용해 모든 사람이 재생하고 다운로드 할 수 있습니다.



먼저, AWS에서 첫 번째 람다 함수를 작성한 것처럼 두 번째 람다 함수를 작성합니다. Lambda 콘솔로 이동합니다.

함수 생성 버튼을 클릭합니다.




다음에서 “새로 작성" 버튼을 클릭하고  함수의 이름은 set-permissions 으로 입력하고 런타임은 Node.js4.3을 선택하고 기존 역할은 “lambda-s3-exeuction-role”을 선택합니다. “함수 생성" 버튼을 클릭합니다.


코드 입력 편집기로 가서 다음의 코드를 붙여넣습니다.

우선 코드부터 살펴보죠 다음의 사이트를 이동합시다.

https://raw.githubusercontent.com/KimJeongChul/architect-cloud/master/serverless/set-permissons/SetPermissions.js


var AWS = require('aws-sdk');
var s3 = new AWS.S3();

exports.handler = function(event, context, callback){
   var message = JSON.parse(event.Records[0].Sns.Message); (1)


(1) 버킷 이름과 키는 첫 번째 함수와 약간 다른 방식으로 추출됩니다. 그 이유는 이벤트가 S3에서 직접 가져 오는 것이 아니라 SNS에서 시작했기 때문입니다.


   var sourceBucket = message.Records[0].s3.bucket.name;
   var sourceKey = decodeURIComponent(message.Records[0].s3.object.key.replace(/\+/g, ' '));
   var params = {
       Bucket: sourceBucket,
       Key: sourceKey,
       ACL: 'public-read' (2)
   };

   s3.putObjectAcl(params, function(err, data){
       if (err) {
           callback(err);
       }
   });
};


(2) 이 함수의 목표는 올바른 ACL (Access Control List)을 설정하는 것입니다. "public-read"는 파일을 공개적으로 액세스 할 수 있도록합니다.


자 붙여넣기가 완료되었다면 js 파일이름과 핸들러 이름을 변경해주세요.



위의 방식은 AWS Lambda 콘솔에서 하는 방법이였고 이번에는 local에서 npm으로 deploy 해보겠습니다.


우선 다음의 명령어로 새로운 디렉토리를 생성해 SetPermission.js를 생성합니다.

$ mkdir ~/set-permissions && cd ~/set-permissions
$ curl -o SetPermissions.js https://raw.githubusercontent.com/KimJeongChul/architect-cloud/master/serverless/set-permissons/SetPermissions.js

$ cat SetPermissions.js


또한 package.json 도 가져와야 합니다.

package.json에서는 vi를 이용해 [ARN-LAMBDA-SET-PERMISSIONS] 의 내용을 본인의 Lambda ARN으로 변경해야 합니다.


$ curl -o package.json https://raw.githubusercontent.com/KimJeongChul/architect-cloud/master/serverless/set-permissons/package.json

$ vi package.json


Lambda의 set-permissions으로 Deploy을 진행합니다.


$ npm install
$ npm run deploy


Lambda와 SNS 연동


자 이제 Lambda와 SNS 연동을 진행해봅시다.


1. AWS 서비스 메뉴에서 SNS를 클릭하여 SNS 콘솔로 이동합니다. 주제 메뉴를 클릭하고 transcoded-video-notification에서 ARN을 클릭합니다.



2. 주제 세부 정보에서 “구독 생성" 버튼을 클릭하고 올라온 창에서 프로토콜을 “AWS Lambda”로 선택하고 엔드포인트를 새로 생성한 Lambda set-permissions의 ARN을 선택합니다. 이후에 “구독 생성" 버튼을 클릭합니다.


자 그러나 이 역할에는 객체 ACL을 변경할 수 있는 권한이 없습니다. 사용중인 역할(lambda-s3-execution-role)에 대한 새로운 인라인 정책을 만들어야 해결할 수 있습니다.


1. AWS 서비스 메뉴에서 IAM을 클릭하고 역할을 선택한 다음 lambda-s3-execution-role 버튼을 클릭합니다.


2. 권한 탭에서 “인라인 정책 추가" 버튼을 클릭합니다.


3. 서비스에서 S3를 선택하고 작업에서 PubObjectAcl을 선택합니다. 그리고 리소스에서 ARN 추가 파란색 버튼을 클릭합니다.


4. ARN 추가에서 Bucket name에 serverless-video-transcoded를 입력하고 Object name에는 *(별)을 넣거나 “모두 선택" 체크 박스를 클릭합니다. 이후에 “추가" 버튼을 클릭합니다.


다음에서 권한 추가 버튼을 클릭하고 이름은  PutObjectAcl을 입력하고 “Create policy” 버튼을 클릭합니다.



새로 생성된 인라인 정책을 볼 수 있습니다.

프로덕션 환경에서는 특히 다른 리소스를 사용하고 다른 권한이 필요한 경우 람다 함수에 대해 별도의 역할을 만들어야합니다.


두 번째 Lambda 함수 테스트


테스트를 위해 serverless-video-uploaded 버킷에 비디오를 업로드하거나 비디오의 이름을 변경하여 두 번째 set-permissions 함수를 테스트할 수 있습니다.

함수가 작동했는지 확인하려면 serverless-video-transcoded 버킷에서 새로 생성 된 파일을 찾아 선택하고 [사용 권한]을 클릭합니다.


열기 / 다운로드 확인란을 선택한 상태에서 Everyone에 대해 두 번째 Read object 컬럼에서 Yes로 구성되어 있어야합니다. 이제 바로 위에있는 URL을 복사하여 다른 사용자와 공유 할 수 있습니다.


복사한 Link로 URL 이동하면 비디오를 볼 수 있습니다.


이번 포스트는 여기까지 완료하겠습니다.







Comments