자습서: Amazon S3과 함께 AWS Lambda 사용 - 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 함수를 호출하는 알림 구성을 포함하는 소스 버킷입니다.

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

사전 요구 사항

이 자습서는 사용자가 Lambda 작업과 Lambda 콘솔에 대한 기본 지식을 알고 있다고 가정합니다. 그렇지 않은 경우 AWS Lambda 시작하기의 지침에 따라 첫 Lambda 함수를 생성합니다.

이 설명서의 절차에 따르려면 명령을 실행할 셸 또는 명령줄 터미널이 필요합니다. 명령은 프롬프트 기호($)와 해당하는 경우 현재 디렉터리의 이름이 앞에 붙은 상태로 목록에 표시됩니다.

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

긴 명령의 경우 이스케이프 문자(\)를 사용하여 명령을 여러 행으로 분할합니다.

Linux 및 macOS는 선호 셸과 패키지 관리자를 사용합니다. Windows 10에서 Linux용 Windows Subsystem을 설치하여 Ubuntu와 Bash의 Windows 통합 버전을 가져옵니다.

npm을 설치하여 함수의 종속성을 관리합니다.

이 자습서에서는 AWS CLI 명령을 사용하여 Lambda 함수를 생성하고 호출합니다. ASK CLI를 설치하고 AWS 자격 증명으로 이를 구성합니다.

실행 역할 생성

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

실행 역할을 만들려면

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

  2. 역할 생성을 선택합니다.

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

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

    • 권한AWSLambdaExecute.

    • 역할 이름lambda-s3-role.

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

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

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

  1. Amazon S3 콘솔을 엽니다.

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

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

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

함수 생성

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

참고

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

예 index.js

// dependencies const AWS = require('aws-sdk'); const util = require('util'); const sharp = require('sharp'); // get reference to S3 client const s3 = new AWS.S3(); exports.handler = async (event, context, callback) => { // Read options from the event parameter. console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); const srcBucket = event.Records[0].s3.bucket.name; // Object key may have spaces or unicode non-ASCII characters. const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); const dstBucket = srcBucket + "-resized"; const dstKey = "resized-" + srcKey; // Infer the image type from the file suffix. const typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { console.log("Could not determine the image type."); return; } // Check that the image type is supported const imageType = typeMatch[1].toLowerCase(); if (imageType != "jpg" && imageType != "png") { console.log(`Unsupported image type: ${imageType}`); return; } // Download the image from the S3 source bucket. try { const params = { Bucket: srcBucket, Key: srcKey }; var origimage = await s3.getObject(params).promise(); } catch (error) { console.log(error); return; } // set thumbnail width. Resize will set the height automatically to maintain aspect ratio. const width = 200; // Use the Sharp module to resize the image and save in a buffer. try { var buffer = await sharp(origimage.Body).resize(width).toBuffer(); } catch (error) { console.log(error); return; } // Upload the thumbnail image to the destination bucket try { const destparams = { Bucket: dstBucket, Key: dstKey, Body: buffer, ContentType: "image" }; const putResult = await s3.putObject(destparams).promise(); } catch (error) { console.log(error); return; } console.log('Successfully resized ' + srcBucket + '/' + srcKey + ' and uploaded to ' + dstBucket + '/' + dstKey); };

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

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

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

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

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

배포 패키지를 만들려면

  1. Linux 환경에서 명령줄 터미널 또는 셸을 엽니다. 로컬 환경의 Node.js 버전이 함수의 Node.js 버전과 일치하는지 확인합니다.

  2. 함수 코드를 lambda-s3 폴더에 index.js로 저장합니다.

  3. npm을 사용하여 Sharp 라이브러리를 설치합니다. Linux의 경우 다음 명령을 사용합니다.

    lambda-s3$ npm install sharp

    macOS의 경우 다음 명령을 사용합니다.

    lambda-s3$ npm install --arch=x64 --platform=linux --target=12.13.0 sharp

    이 단계를 완료한 후에는 다음과 같은 폴더 구조를 갖게 됩니다.

    lambda-s3 |- index.js |- /node_modules/sharp └ /node_modules/...
  4. 함수 코드와 종속 항목을 포함하는 배포 패키지를 생성합니다.

    lambda-s3$ zip -r function.zip .

함수를 만들려면

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

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

역할 파라미터의 경우 번호 시퀀스를 AWS 계정 ID로 바꿉니다. 위의 예제 명령은 함수 구성으로 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 작업을 수행할 수 있는 권한을 부여합니다. 다음 조건이 충족되는 경우에만 에 함수를 호출할 수 있는 권한이 부여됩니다.

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

    • 버킷은 계정에서 소유합니다. 버킷을 삭제할 경우, 다른 계정에서 동일한 ARN 내에 버킷을 생성할 수 있습니다.

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

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

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

중요

이 절차는 버킷에서 객체가 생성될 때마다 함수를 호출하도록 버킷을 구성합니다. 원본 버킷에만 이 옵션을 구성하고 트리거된 함수에서는 원본 버킷에 객체를 생성하지 않아야 합니다. 그렇지 않으면 함수가 루프에서 계속 호출될 수 있습니다.

알림을 구성하려면

  1. Amazon S3 콘솔을 엽니다.

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

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

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

    • 이름lambda-trigger.

    • 이벤트All object create events.

    • 전송 대상Lambda function.

    • LambdaCreateThumbnail.

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

설정 테스트

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

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

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

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

리소스 정리

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않으면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

Lambda 함수 삭제 방법

  1. Lambda 콘솔의 기능 페이지를 엽니다.

  2. 생성한 함수를 선택합니다.

  3. 작업, 삭제를 선택합니다.

  4. 삭제를 선택합니다.

실행 역할을 삭제하려면

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

  2. 생성한 실행 역할을 선택합니다.

  3. Delete role(역할 삭제)을 선택합니다.

  4. 예, 삭제를 선택합니다.

S3 버킷 삭제 방법

  1. Amazon S3 콘솔을 엽니다.

  2. 생성한 원본 버킷을 선택합니다.

  3. 삭제를 선택합니다.

  4. 텍스트 상자에 원본 버킷의 이름을 입력합니다.

  5. 확인을 선택합니다.