AWS Lambda
개발자 가이드

자습서: Amazon S3과 함께 AWS Lambda 사용

버킷에 업로드된 각 이미지 파일에 대해 썸네일을 만들어 보겠습니다. 객체 생성 시 Amazon S3가 호출할 수 있는 Lambda 함수(CreateThumbnail)를 생성할 수 있습니다. 그런 다음 Lambda 함수 코드는 소스 버킷에서 이미지 객체를 읽고 썸네일 이미지 대상 버킷을 생성할 수 있습니다.

이 자습서를 완료하면 계정에 다음과 같은 Amazon S3, Lambda 및 IAM 리소스가 생성됩니다.

Lambda 리소스

  • Lambda 함수.

  • Lambda 함수에 연결된 액세스 정책은 Lambda 함수를 호출하는 Amazon S3 권한을 부여합니다.

IAM 리소스

  • 이 역할과 연결된 권한 정책을 통해 Lambda 함수에 필요한 권한을 부여하는 실행 역할입니다.

Amazon S3 리소스

  • Lambda 함수를 호출하는 알림 구성을 포함하는 소스 버킷입니다.

  • 함수가 크기 변경된 이미지를 저장하는 대상 버킷입니다.

사전 요구 사항

This tutorial assumes that you have some knowledge of basic Lambda operations and the Lambda console. If you haven't already, follow the instructions in AWS Lambda 시작하기 to create your first Lambda function.

To follow the procedures in this guide, you will need a command line terminal or shell to run commands. Commands are shown in listings preceded by a prompt symbol ($) and the name of the current directory, when appropriate:

~/lambda-project$ this is a command this is output

For long commands, an escape character (\) is used to split a command over multiple lines.

On Linux and macOS, use your preferred shell and package manager. On Windows 10, you can install the Windows Subsystem for Linux to get a Windows-integrated version of Ubuntu and Bash.

실행 역할 만들기

함수에 AWS 리소스에 액세스할 수 있는 권한을 제공하는 실행 역할을 만듭니다.

실행 역할을 만들려면

  1. IAM 콘솔에서 역할 페이지를 엽니다.

  2. [Create role]을 선택합니다.

  3. 다음 속성을 사용하여 역할을 만듭니다.

    • 신뢰할 수 있는 엔터티AWS Lambda.

    • 권한AWSLambdaExecute.

    • 역할 이름lambda-s3-role.

AWSLambdaExecute 정책은 함수가 Amazon S3의 객체를 관리하고 CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다.

버킷 생성 및 샘플 객체 업로드

다음 단계에 따라 버킷을 만들고 객체를 업로드합니다.

  1. Amazon S3 콘솔을 엽니다.

  2. 두 개의 버킷을 만듭니다. 대상 버킷 이름은 source 다음에 resized가 와야 하고, 여기에서 source는 소스에 사용할 버킷의 이름입니다. 예: mybucket, mybucketresized.

  3. 원본 버킷에서 .jpg 객체 HappyFace.jpg를 업로드합니다.

    Amazon S3에 연결하기 전에 Lambda 함수를 수동으로 호출하면, 원본 버킷을 지정하는 함수에 샘플 이벤트 데이터를 전달하고 HappyFace.jpg를 새로 생성한 객체로 전달하므로 이 샘플 객체를 먼저 생성해야 합니다.

함수 만들기

다음은 Amazon S3 이벤트 입력을 수신하고 이벤트에 포함된 메시지를 처리하는 예제 코드입니다. 이 코드는 소스 버킷의 이미지 크기를 변경하고 출력을 대상 버킷에 저장합니다.

참고

다른 언어로 작성된 샘플 코드는 샘플 Amazon Simple Storage Service 함수 코드 단원을 참조하십시오.

예 index.js

// dependencies var async = require('async'); var AWS = require('aws-sdk'); var gm = require('gm') .subClass({ imageMagick: true }); // Enable ImageMagick integration. var util = require('util'); // constants var MAX_WIDTH = 100; var MAX_HEIGHT = 100; // get reference to S3 client var s3 = new AWS.S3(); exports.handler = function(event, context, callback) { // Read options from the event. console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); var srcBucket = event.Records[0].s3.bucket.name; // Object key may have spaces or unicode non-ASCII characters. var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); var dstBucket = srcBucket + "resized"; var dstKey = "resized-" + srcKey; // Sanity check: validate that source and destination are different buckets. if (srcBucket == dstBucket) { callback("Source and destination buckets are the same."); return; } // Infer the image type. var typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { callback("Could not determine the image type."); return; } var imageType = typeMatch[1]; if (imageType != "jpg" && imageType != "png") { callback('Unsupported image type: ${imageType}'); return; } // Download the image from S3, transform, and upload to a different S3 bucket. async.waterfall([ function download(next) { // Download the image from S3 into a buffer. s3.getObject({ Bucket: srcBucket, Key: srcKey }, next); }, function transform(response, next) { gm(response.Body).size(function(err, size) { // Infer the scaling factor to avoid stretching the image unnaturally. var scalingFactor = Math.min( MAX_WIDTH / size.width, MAX_HEIGHT / size.height ); var width = scalingFactor * size.width; var height = scalingFactor * size.height; // Transform the image buffer in memory. this.resize(width, height) .toBuffer(imageType, function(err, buffer) { if (err) { next(err); } else { next(null, response.ContentType, buffer); } }); }); }, function upload(contentType, data, next) { // Stream the transformed image to a different S3 bucket. s3.putObject({ Bucket: dstBucket, Key: dstKey, Body: data, ContentType: contentType }, next); } ], function (err) { if (err) { console.error( 'Unable to resize ' + srcBucket + '/' + srcKey + ' and upload to ' + dstBucket + '/' + dstKey + ' due to an error: ' + err ); } else { console.log( 'Successfully resized ' + srcBucket + '/' + srcKey + ' and uploaded to ' + dstBucket + '/' + dstKey ); } callback(null, "message"); } ); };

배포 패키지는 Lambda 함수 코드 및 종속성이 포함되어 있는 .zip 파일입니다.

배포 패키지를 만들려면

  1. 폴더(examplefolder)를 생성한 다음 하위 폴더(node_modules)를 생성합니다.

  2. Node.js 플랫폼을 설치합니다. 자세한 정보는 Node.js 웹 사이트를 참조하십시오.

  3. 종속 항목을 설치합니다. 이 코드 예제는 다음 라이브러리를 사용합니다.

    • Node.js로 작성된 JavaScript용 AWS SDK

    • gm, GraphicsMagick(node.js용)

    • 비동기 유틸리티 모듈

    AWS Lambda 런타임에는 Node.js에 이미 JavaScript용 AWS SDK가 있으므로 다른 라이브러리만 설치하면 됩니다. 명령 프롬프트를 열고 examplefolder로 이동한 후 Node.js의 일부인 npm 명령을 사용하여 라이브러리를 설치합니다.

    npm install async gm
  4. 샘플 코드를 index.js 파일에 저장합니다.

  5. 앞의 코드를 검토하고 다음 사항을 확인합니다.

    • 이 함수는 파라미터로 받은 이벤트 데이터에서 원본 버킷 이름과 객체 키 이름을 알고 있습니다. 객체가 .jpg인 경우, 코드는 썸네일을 만들고 대상 버킷에 저장합니다.

    • 이 코드는 대상 버킷이 존재하고 해당 이름이 원본 버킷 이름과 resized 문자열이 이어진 것이라고 가정합니다. 예를 들어 이벤트 데이터에서 식별된 원본 버킷이 examplebucket인 경우 코드는 사용자에게 examplebucketresized 대상 버킷이 있다고 가정합니다.

    • 생성하는 썸네일의 경우 코드는 resized- 문자열과 소스 객체 키 이름이 연결된 키 이름을 가져옵니다. 예를 들어 소스 객체 키가 sample.jpg인 경우 코드는 키가 resized-sample.jpg인 썸네일 객체를 만듭니다.

  6. 파일을 index.jsexamplefolder로 저장합니다. 이 단계를 완료한 후에는 다음과 같은 폴더 구조를 갖게 됩니다.

    index.js /node_modules/gm /node_modules/async
  7. index.js 파일과 node_modules 폴더를 function.zip으로 압축합니다.

함수를 만들려면

  • create-function 명령을 사용해 Lambda 함수를 만듭니다.

    $ aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs8.10 \ --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/lambda-s3-role

위의 명령은 함수 구성으로 10초의 제한 시간 값을 지정합니다. 업로드하는 객체의 크기에 따라 다음 AWS CLI 명령을 사용하여 제한 시간 값을 늘려야 할 수도 있습니다.

$ aws lambda update-function-configuration --function-name CreateThumbnail --timeout 30

Lambda 함수 테스트

이 단계에서는 샘플 Amazon S3 이벤트 데이터를 사용하여 Lambda 함수를 수동으로 호출합니다.

Lambda 함수를 테스트하려면

  1. 다음 Amazon S3 샘플 이벤트 데이터를 파일에 저장하고 이 파일을 inputFile.txt로 저장합니다. sourcebucket 이름 및 .jpg 객체 키를 제공하여 JSON을 업데이트해야 합니다.

    { "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"us-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"sourcebucket", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::sourcebucket" }, "object":{ "key":"HappyFace.jpg", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] }
  2. 다음과 같은 Lambda invoke 명령을 실행하여 함수를 호출합니다. 이 명령은 비동기 실행을 요청합니다. 선택에 따라 RequestResponseinvocation-type 파라미터 값으로 지정하여 동기식으로 함수를 호출할 수 있습니다.

    $ aws lambda invoke --function-name CreateThumbnail --invocation-type Event \ --payload file://inputfile.txt outputfile.txt
  3. 대상 버킷에 썸네일이 생성되었는지 확인합니다.

이벤트를 게시하도록 Amazon S3 구성

이 단계에서는 Amazon S3가 객체 생성 이벤트를 AWS Lambda에 게시하고 Lambda 함수를 호출하게 하도록 나머지 구성을 추가합니다. 이 단계에서는 다음 작업을 수행합니다.

  • Lambda 함수의 액세스 정책에 권한을 추가하여 Amazon S3가 함수를 호출하도록 허용합니다.

  • 원본 버킷에 알림 구성을 추가합니다. 알림 구성에서 다음을 제공합니다.

    • Amazon S3가 게시하게 하려는 이벤트 유형. 이 자습서에서는 객체가 생성될 때 Amazon S3가 이벤트를 게시할 수 있도록 s3:ObjectCreated:* 이벤트 유형을 지정합니다.

    • 호출할 Lambda 함수.

함수 정책에 권한을 추가하려면

  1. 다음 Lambda CLI add-permission 명령을 사용하여 Amazon S3 서비스 보안 주체(s3.amazonaws.com)에게 lambda:InvokeFunction 작업을 수행할 수 있는 권한을 부여합니다. 다음 조건이 충족되는 경우에만 에 함수를 호출할 수 있는 권한이 부여됩니다.

    • 객체 생성 이벤트가 특정 버킷에서 감지됩니다.

    • 해당 버킷은 특정 AWS 계정의 소유입니다. 버킷 소유자가 버킷을 삭제하면 다른 AWS 계정이 동일한 이름의 버킷을 생성할 수 있습니다. 이 조건을 통해 특정 AWS 계정만 Lambda 함수를 호출할 수 있습니다.

    $ aws lambda add-permission --function-name CreateThumbnail --principal s3.amazonaws.com \ --statement-id some-unique-id --action "lambda:InvokeFunction" \ --source-arn arn:aws:s3:::sourcebucket \ --source-account bucket-owner-account-id
  2. AWS CLI get-policy 명령을 실행하여 함수의 액세스 정책을 확인합니다.

    $ aws lambda get-policy --function-name function-name

원본 버킷에 알림 구성을 추가하여 Amazon S3에 객체 생성 이벤트를 Lambda에 게시하도록 요청합니다.

알림을 구성하려면

  1. Amazon S3 콘솔을 엽니다.

  2. 소스 버킷을 선택합니다.

  3. [Properties]를 선택합니다.

  4. 이벤트에서 다음과 같은 설정으로 알림을 구성합니다.

    • 이름lambda-trigger.

    • 이벤트ObjectCreate (All).

    • 전송 대상Lambda function.

    • LambdaCreateThumbnail.

이벤트 구성에 대한 자세한 정보는 Amazon Simple Storage Service 콘솔 사용 설명서이벤트 알림 활성화를 참조하십시오.

설정 테스트

이제 다음과 같이 설정을 테스트할 수 있습니다.

  1. Amazon S3 콘솔을 사용하여 .jpg 또는 .png 객체를 원본 버킷에 업로드합니다.

  2. CreateThumbnail 함수를 사용하여 대상 버킷에 썸네일이 생성되었는지 확인합니다.

  3. CloudWatch 콘솔에서 로그를 봅니다.