Notice
Recent Posts
Recent Comments
Today
Total
03-29 18:05
Archives
관리 메뉴

Jeongchul Kim

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

AWS

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

김 정출 2018. 4. 21. 20:16


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


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


IAM 역할 생성하기


이제 미래의 Lambda 함수를위한 IAM 역할을 생성해야합니다. 이 역할은 함수가 S3 및 Elastic Transcoder와 상호 작용할 수 있게 합니다. 이 역할에는 AWSLambdaExecute 및 AmazonElasticTranscoderJobsSubmitter라는 두 가지 정책이 추가됩니다.
 - AWSLambdaExecute 정책은 Lambda가 S3 및 CloudWatch와 상호 작용할 수있게합니다. CloudWatch는 로그 파일 수집, 메트릭 추적 및 경보 설정에 사용되는 AWS 서비스입니다.
 - AmazonElasticTranscoderJobsSubmitter 정책을 통해 Lambda는 Elastic Transcoder에 새로운 트랜스 코딩 작업을 제출할 수 있습니다.


서비스 메뉴에서 IAM 을 클릭합니다.



역할 메뉴를 클릭합니다.

역할 만들기 버튼을 클릭합니다.



AWS 서비스를 선택하고 Lambda를 클릭하고 다음:권한 버튼을 클릭합니다.



정책(policy)에서 AWSLambdaExecute, AmazonElasticTranscoderJobsSubmitter를 선택하고 다음 버튼을 클릭합니다.


역할 이름에서 lambda-s3-execution-role 을 입력하고 역할 만들기 버튼을 클릭합니다.


역할 요약 페이지에서 새로 생성된 lamba-s3-execution-role을 확인할 수 있습니다.



Lambda 작성해보기


마침내 첫 번째 람다 함수를 만들 차례입니다. 아직 구현을 제공하지 않을 것입니다. 그러나 이 기능은 업로드 (serverless-video-upload) 버킷에 새로운 파일이 추가 될 때 Elastic Transcoder 작업을 시작합니다

서비스 메뉴에서 Lambda 를 클릭합니다.


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


새로 작성을 선택하고 "transcode-video"기능의 이름을 지정하고 Runtime 드롭 다운에서 Node js 4.3이 선택되었는지 확인합니다. 기존 역할에서 "lambda-s3-execution-role"을 선택합니다. 함수 생성 버튼을 클릭합니다.

transcode-video lambda 함수가 생성된 것을 볼 수 있습니다.


다음의 코드를 볼 수 있습니다.


Elastic Transcoder의 Pipeline 설정하기



다른 형식 및 비트 전송률로 비디오 트랜스 코딩을 수행하려면 Elastic Transcoder 파이프 라인을 설정해야 합니다. 서비스 메뉴를 클릭하고 "Elastic Transcoder"를 클릭합니다.


Create a new Pipeline 버튼을 클릭합니다.



Pipeline 이름을 입력하고 입력 버킷(Input Bucket)을 serverless-video-uploaded로 선택합니다.

트랜스 코딩 된 파일 및 재생 목록 용 Amazon S3 Bucket 구성에서 serverless-video-transcoded 버킷을 지정합니다. 여기서는 서버가없는 비디오를 트랜스 코딩했습니다. Storage Class는 Standard로 설정할 수 있습니다.

thumnails 이미지는 생성하지 않지만 버킷 및 저장소 클래스는 선택해야합니다. 두 번째로 serverless-video-transcoded 버킷을 다시 사용합니다. "Create Pipeline"버튼을 클릭합니다.


Pipeline의 요약을 살펴볼 수 있습니다.


첫 Lambda 함수 만들기



Lambda 함수는 직접 작성한 다음 AWS에 직접 복사 할 수는 있지만 개발 및 구현 수행을 관리하는 지속 가능한 방법은 아닙니다. npm을 사용하여 함수를 AWS에 자동으로 테스트, 패키징 및 배포하는 데 도움을 줍니다. npm을 사용하면 필요한 모든 작업을 수행 할 수 있고 다른 유틸리티에 대해 걱정할 필요가 없기 때문에 npm을 사용합니다.


Lambda는 조정이 필요한 시스템 부분을 처리하거나 다른 서비스에서 직접 수행 할 수없는 부분을 처리합니다.

3 개의 람다 함수를 생성합니다 :
- 첫번째 Lambda 함수는 Elastic Transcoder 작업을 생성하고 제출합니다. 파일이 업로드 버킷에 업로드 될 때마다 자동으로 실행됩니다.
- 두 번째 Lambda 함수는 트랜스 코딩 된 비디오 버킷에 새로운 트랜스 코딩 된 비디오가 나타날 때 실행됩니다. 이 함수는 공개적으로 액세스 할 수 있도록 파일 권한을 변경합니다. 이렇게하면 사용자가 새 파일을보고 다운로드 할 수 있습니다.
- 세 번째 Lambda 함수는 새 트랜스 코딩 파일 생성에 대한 응답으로 실행됩니다. 비디오를 분석하고 메타 데이터 파일을 만들고 S3에 저장합니다.
- Elastic Transcoder는 비디오를 다른 해상도와 비트율로 인코딩합니다. 기본 인코딩 사전 설정을 사용하면 트랜스 코더 용 사용자 정의 프로파일을 만들 필요가 없습니다.
- 트랜스 코딩 된 파일이 트랜스 코딩 된 비디오 버킷에있을 때 SNS에서 알림을 전송합니다. 이 알림은 파일에 대한 정보가 포함 된 전자 메일을 보내고 마지막 두 개의 람다 (Lambda) 기능을 호출하는 데 사용됩니다.



첫 번째 Lambda 함수를 작성할 차례입니다. 설치 중에 작성한 package.json과 동일한 디렉토리에 index.js라는 새 파일을 작성하고 원하는 텍스트 편집기에서 엽니 다. 이 파일에는 첫 번째 기능이 포함됩니다. 중요한 것은 람다 런타임에 의해 호출 될 함수 핸들러를 정의해야한다는 것입니다. 핸들러는 이벤트, 컨텍스트 및 콜백의 세 가지 매개 변수를 사용하며 다음과 같이 정의됩니다.


exports.handler = function(event, context, callback){}


새 파일이 버킷에 배치되면 즉시 람다 함수가 S3에서 호출됩니다. 업로드 된 비디오에 대한 정보는 이벤트 객체를 통해 람다 함수에 전달됩니다. 버킷 이름과 업로드되는 파일의 키가 포함됩니다. 이 기능은 Elastic Transcoder에 대한 작업을 준비합니다. 입력 파일과 가능한 모든 출력을 지정합니다. 마지막으로 작업을 제출하고 Amazon CloudWatch 로그 스트림에 메시지를 작성합니다. 다음 그림은 이 과정을 시각화합니다.



Github에서 다음의 코드를 살펴봅시다.

https://raw.githubusercontent.com/KimJeongChul/architect-cloud/master/serverless/transcode-video/index.js


var AWS = require('aws-sdk');
var elasticTranscoder = new AWS.ElasticTranscoder({
   region: 'us-west-2'
});

exports.handler = function(event, context, callback) {
   var key = event.Records[0].s3.object.key; (1)


(1) 키는 버킷의 객체를 고유하게 식별합니다. 원래 파일 이름과 추가 키 이름 접두사로 구성됩니다. 이 코드는 특별히 안전하지 않습니다. 정상적으로 오류나 예기치 않은 문제를 처리하지 않습니다.


exports.handler = function(event, context, callback) {
   var key = event.Records[0].s3.object.key; (1)

   var sourceKey = decodeURIComponent(key.replace(/\+/g, " ")); (2)
   var outputKey = sourceKey.split('.')[0]; (3)

   console.log('key: ', key, sourceKey, outputKey);


(2) S3 키 이름은 URL로 인코딩됩니다. 파일 이름 "My Birthday Video.mp4"는 "My + Birthday + Video.mp4"로 표시됩니다. 공백으로 원래 파일 이름을 얻으려면 키 이름을 디코딩해야합니다.


(3) 새로운 코드 변환에 원래 키의 확장이 필요하지 않습니다. 키 이름은 출력 비디오의 이름을 지정하는 데 계속 사용할 수 있습니다.


var params = {
       PipelineId: '1523708749338-pwdvoq', (4)
       Input: {
           Key: sourceKey
       },


(4) Elastic Transcoder 파이프 라인의 파이프 라인 ID와 일치하도록 PipelineId를 변경하십시오.


var params = {
       Outputs: [ (5)
           {
               Key: outputKey + '-1080p' + '.mp4',
               PresetId: '1351620000001-000001' //Generic 1080p
           },
           {
               Key: outputKey + '-720p' + '.mp4',
               PresetId: '1351620000001-000010' //Generic 720p
           },
           {
               Key: outputKey + '-web-720p' + '.mp4',
               PresetId: '1351620000001-100070' //Web Friendly 720p
           }
       ]};


(5) 시스템 사전 설정은 탄성 트랜스 코더의 출력을 지정하는 데 사용됩니다. 직접 만들거나 다른 사전 설정을 선택할 수 있습니다. 사용 가능한 모든 사전 미리 설정 목록을 보려면 다음의 사이트에서 확인할 수 있습니다.
https://docs.aws.amazon.com/elastictranscoder/latest/developerguide/system-presets.html


elasticTranscoder.createJob(params, function(error, data){
       if (error){
           callback(error); (6)
       }
   });
};


(6) Elastic Transcoder가 작업 생성에 실패하면 콜백 함수를 통해 CloudWatch에 오류를 기록합니다.


람다 함수를 포함하는 파일의 이름을 index.js가 아닌 다른 이름으로 지정할 수 있습니다. 그럴 경우 AWS의 Lambda 구성 패널에서 핸들러 값을 수정하여 파일의 새 이름을 반영해야합니다. 예를 들어, index.js 대신 TranscodeVideo.js 파일의 이름을 지정하려는 경우 AWS 콘솔에서 핸들러를 TranscodeVideo.handler로 수정해야합니다.




자 이제 만들어진 Lambda를 테스트해봅시다. event를 이용해 함수의 반응 결과를 살펴봅시다.

Lambda 콘솔에서 이벤트 선택의 아랫방향 화살표 버튼을 클릭하여 테스트 이벤트 구성 버튼을 클릭합니다.


다음의 창에서 “새로운 테스트 이벤트 생성" 라디오 버튼을 체크하고, Event 이름을 “TestEvent”로 입력합니다.

밑의 코드창 부분에서 다음의 사이트에서 복사해서 붙여넣기를 진행합니다.

https://raw.githubusercontent.com/KimJeongChul/architect-cloud/master/serverless/transcode-video/event.json


마지막으로 생성 버튼을 클릭합니다.


이후에 테스트 버튼을 클릭합니다. 새로 생긴 테스트의 실행결과가 성공임을 볼 수 있습니다.


event.json에 대한 설명은 다음과 같습니다.


{  
  "Records":[  
     {
        "eventVersion":"2.0",
        "eventSource":"aws:s3",
        "awsRegion":"us-east-1",
        "eventTime":The time, in ISO-8601 format, for example, 1970-01-01T00:00:00.000Z, when S3 finished processing the request,
        "eventName":"event-type",
        "userIdentity":{  
           "principalId":"Amazon-customer-ID-of-the-user-who-caused-the-event"
        },
        "requestParameters":{  
           "sourceIPAddress":"ip-address-where-request-came-from"
        },
        "responseElements":{  
           "x-amz-request-id":"Amazon S3 generated request ID",
           "x-amz-id-2":"Amazon S3 host that processed the request"
        }
        "s3":{
           "s3SchemaVersion":"1.0",
           "configurationId":"ID found in the bucket notification configuration",
           "bucket":{
              "name":"bucket-name",
              "ownerIdentity":{  
                 "principalId":"Amazon-customer-ID-of-the-bucket-owner"
              },
              "arn":"bucket-ARN"
           },
           "object":{
              "key":"object-key",
              "size":object-size,
              "eTag":"object eTag",
              "versionId":"object version if bucket is versioning-enabled, otherwise null",
              "sequencer": "a string representation of a hexadecimal value used to determine event sequence,
                  only used with PUTs and DELETEs"            
           }
        }
     }
  ]
}  

NPM Testing Locally

Lambda 에서 직접 작성하여 확인해 볼 수 있지만, 다양한 라이브러리를 필요로 하고 이에 대해 테스트를 진행해본다면 local 머신에서 먼저 테스트해보는 것도 하나의 방법입니다.


자 이번엔 index.js에 복사 한 후, 머신에서 로컬로 테스트하는 방법을 생각해 볼 수있다. 이를 수행하는 방법은 이벤트를 시뮬 레이팅하고 함수가 해당 이벤트에 반응하도록하는 것입니다. 즉, 함수를 호출하고 컨텍스트, 이벤트 및 콜백 객체를 나타내는 세 개의 매개 변수를 전달해야합니다. 이 함수는 마치 Lambda에서 실행중인 것처럼 실행되며, 배포(deploying)하지 않고도 결과를 볼 수 있습니다.


$ mkdir ~/transcode-video && cd ~/transcode-video
$ vi index.js
$ curl -o index.js https://raw.githubusercontent.com/KimJeongChul/architect-cloud/master/serverless/transcode-video/index.js

위의 curl 명령어과 GitHub의 파일을 이용해 index.js를 생성합니다.

또한 package.json을 입력하여 사용되는 aws 라이브러리와 다른 라이브러리를 추가해야합니다.


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

테스트 스크립트는 함수를 호출하고 생성하려는 파일 인 event.json의 내용을 이벤트 객체로 전달합니다. 테스트 스크립트에는 event.json 파일이 작동해야합니다. 이 파일에는 run-local-lambda가 Lambda 함수에 전달할 이벤트 객체의 사양이 포함되어야합니다.



명시되어 있는대로 진행하려면 tests/event.json tests 디렉토리 안에 event.json이 있어합니다.

$ mkdir tests
$ curl -o tests/event.json https://raw.githubusercontent.com/KimJeongChul/architect-cloud/master/serverless/transcode-video/event.json

run-local-lambda라는 npm 모듈을 사용하여 Lambda 함수를 로컬로 실행할 수 있습니다. 이 모듈을 설치하려면 터미널 창에서 다음 명령을 실행하십시오 (함수의 디렉토리에 있는지 확인하십시오).


$ npm install run-local-lambda save-dev


테스트를 실행하려면 함수 디렉토리의 터미널 창에서 npm test를 실행합니다. 작동하면 key, sourceKey 및 outputKey 값을 터미널에 표시해야합니다.


$ npm install
$ npm test


테스트 스크립트를 실행하면 AccessDenied-Exception이있는 오류 메시지가 표시 될 수 있습니다. 사용자 Lambda는 새로운 Elastic Transcoder 작업을 만들 수있는 권한이 없으므로 정상입니다. 일단 AWS로 업로드되면 함수는  앞에서 정의 된 ID 및 액세스 관리 (IAM) 역할을 수행하기 때문에 올바르게 실행됩니다.이 장의 끝 부분에있는 연습 중 하나는 IAM 사용자에게 정책을 추가하는 것입니다. Lambda를 사용하여 로컬 시스템에서 Elastic Transcoder 작업을 만듭니다.


Deploying to AWS

이제 AWS에 함수를 배포 할 준비가되었습니다. 이를 수행하려면 predeploy를 작성하고 스크립트를 배치하도록 package.json을 수정해야합니다. 사전 deploy 스크립트는 함수의 zip 파일을 만듭니다. deploy 스크립트는 zip 파일을 AWS에 배포합니다.


"scripts": {
   "test": "run-local-lambda --file index.js --event tests/event.json",
   "deploy": "aws lambda update-function-code --function-name [ARN-AWS-LAMBDA-TRANSCODE-VIDEO] --zip-file fileb://Lambda-Deployment.zip"  (1)

   "predeploy": "zip -r Lambda-Deployment.zip * -x *.zip *.json *.log" (2)
 },


(1) AWS CLI가 함수 코드를 배포합니다. 두 가지 주요 매개 변수가 있습니다. --function - name 매개 변수에는 함수 또는 해당 ARN의 이름이 필요합니다. --zip-file 매개 변수에는 함수가 포함 된 zip 파일의 이름이 필요합니다. zip 파일은 사전 배포 스크립트에 의해 생성됩니다.


(2) npm은 배포 스크립트를 실행하기 전에 사전 배포를 실행합니다. predeploy 스크립트는 함수, 로컬 노드 모듈 및 현재 디렉토리에있는 다른 파일의 zip을 작성합니다. zip, json 및 og 파일이 필요하지 않기 때문에 배포 파일로 압축되지 않도록 특별히 지정되었습니다.


우리가 수정해야 할 부분은 ARN-AWS-LAMBDA-TRANSCODE-VIDEO 입니다.


Lambda 콘솔에서 ARN을 확인합니다.


deploy 스크립트에서 ARN 값을 업데이트 한 후 터미널에서 npm run deploy를 실행합니다. 그러면 함수가 압축되어 AWS에 배포됩니다.


$ npm run deploy


배포가 성공적으로 완료되면 시간 초과 및 메모리 크기를 포함하여 터미널에 인쇄 된 현재 기능 구성을 볼 수 있습니다.


S3와 Lambda 연동


AWS에서 함수를 테스트 할 수있는 마지막 단계는 S3을 Lambda에 연결하는 것입니다. 새 파일이 업로드 버킷에 추가 될 때마다 이벤트를 발생시키고 Lambda 함수를 호출하도록 S3을 구성해야합니다.


S3를 구성하려면 다음 단계들을 진행합니다.
1. AWS 콘솔에서 업로드 버킷 (serverless-video-uploaded)을 열고 등록 정보를 선택한 다음 이벤트를 클릭하고 알림 추가를 클릭하십시오.
2. 이벤트에 비디오 업로드와 같은 이름을 지정한 다음 이벤트에서 ObjectCreate (All)를 선택하십시오.
3. 전송 대상 드롭 다운에서 람다 함수를 선택하십시오. 마지막으로 람다 드롭 다운에서 transcode-video 함수를 선택하고 저장을 클릭하십시오.


S3를 Lambda에 처음 연결하는 경우 사용 권한 오류가 표시 될 수 있습니다. 이런 일이 발생하면 Lambda의 콘솔을 사용하여 이벤트를 설정해야합니다.

1. AWS 콘솔에서 Lambda로 들어갑니다.

2. Designer에서 Trigger 사이드 메뉴에서 S3를 선택합니다.


3. 업로드 버킷을 선택하고 이벤트 유형을 Object Created (All)로 설정하고 "Add"버튼을 클릭하십시오.


새로운 trigger가 생성된 것을 확인할 수 있습니다. 저장 버튼을 클릭합니다.


자 이제 AWS 콘솔에서 S3로 넘어가 serverless-video-uploaded 버킷 이름을 클릭하여 속성 탭에 들어가 이벤트를 클릭합니다.



그리고 알림 추가 버튼을 클릭합니다. 이벤트의 이름은 Transcode Video로 입력하고 ObjectCreate(모두) 체크박스를 선택하고 전송대상은 Lambda함수로, Lambda는 transcode-video 를 선택하고 저장 버튼을 클릭합니다.


Testing Lambda in S3

Lambda를 테스트해보기 위해서 serverless-video-uploaded 버킷에 비디오를 업로드합니다.


업로드할 파일은 다음의 사이트에서 비디오를 다운받습니다.

https://github.com/kmu-bigdata/architect-cloud/blob/master/serverless/test.mp4?raw=true

1. serverless-video-uploaded  버킷에 들어가 업로드 버튼을 클릭합니다.


화면에 업로드 대화 상자가 나타납니다. 파일 추가를 클릭하고 컴퓨터에서 파일을 선택한 다음 업로드 버튼을 클릭하십시오. 다른 모든 설정은 그대로 둘 수 있습니다.


serverless-video-uploaded 버킷에 새로 업로드된 비디오 파일을 볼 수 있습니다.


잠시 후에 serverless-video-transcoded 버킷으로 가면 3개의 생성된 비디오 파일을 볼 수 있습니다. 각각의 파일들은 ElasticTranscoder를 통해 해상별(720, web720, 1080p)로 transcode된 비디오입니다.


CloudWatch의 Log 살펴보기


그러나 일이 항상 원활하게 진행되는 것은 아닙니다. 새 파일이 나타나지 않는 등의 문제가 발생할 경우 두 개의 로그에서 오류를 확인할 수 있습니다. 첫 번째는 CloudWatch의 Lambda 로그입니다. 로그를 보려면 다음을 수행하십시오.


1. Lambda 콘솔의 transcode-video 함수에서 모니터링 탭을 클릭합니다.


최신 로그 스트림이 맨 위에 있어야하지만 그렇지 않은 경우 마지막 이벤트 시간 열 머리글을 클릭하여 날짜별로 로그 스트림을 정렬 할 수 있습니다. 로그 스트림을 클릭하면 더 자세한 로그 항목이 표시됩니다. 종종 오류가 발생하면 이러한 로그에 어떤 일이 있었는지 밝혀줍니다.


Elastic Transcoder에서 log 살펴보기


자 다음은 Elastic Transcoder log도 살펴볼까요?

Elastic Transcoder 콘솔로 이동하여 Jobs 사이드메뉴를 클릭하고 Search 버튼을 클릭합니다.


최근 작업 목록에서 Status 컬럼은 작업이 성공적으로 완료되었는지 또는 오류가 있었는 지를 표시합니다. ID를 클릭하면 자세한 내용을 볼 수 있습니다.



다음 포스트에서는 SNS(simple Notification Service)를 이용해보겠습니다.






reference : Serverless Architecture on AWS : With examples using AWS Lambda




Comments