S3에서 AWS Lambda를 트리거하는 방법

이 게시물에서는 AWS CDK를 사용하여 AWS S3 Put 요청에서 트리거하는 AWS Lambda 함수를 빌드할 것입니다.

모든 코드can be found in this repository .

설정



CDK 앱을 설정하려면 몇 가지 명령을 실행해야 합니다.

mkdir how-to-trigger-lambda-from-s3
cd how-to-trigger-lambda-from-s3
npx cdk init app --language typescript



그러면 다음과 같은 디렉토리 구조가 제공됩니다.


또한 AWS CLI를 구성했는지 확인하십시오. 자세한 내용은 the AWS CLI quickstart guide을 참조하십시오.

S3 버킷 생성



S3 CDK 패키지를 설치합니다.

npm i @aws-cdk/aws-s3

lib/how-to-trigger-lambda-from-s3-stack.ts를 열고 새 S3 버킷을 추가하고 배포합니다.

import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';

export class HowToTriggerLambdaFromS3Stack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const bucket = new s3.Bucket(this, 'OurBucket', {
      /**
       * The following properties ensure the bucket is properly 
       * deleted when we run cdk destroy */
      autoDeleteObjects: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY
    })
  }
}


npm run cdk deploy
일부 IAM 변경 사항을 확인해야 할 수도 있습니다.

람다 생성



Lambda CDK 패키지를 설치합니다.

npm i @aws-cdk/aws-lambda


Lambda 함수를 배포하려면 Lambda의 소스 코드가 상주할 S3 버킷을 제공하는 CDK 앱을 부트스트랩해야 합니다. 이것은 일회성 작업입니다.

npm run cdk bootstrap


src/index.js를 생성하고 다음 코드를 붙여넣습니다.

exports.handler = async (event) => {
  event.Records.forEach((record) => {
    console.log('Event Name: %s', record.eventName);
    console.log('S3 Request: %j', record.s3);
  });
};

lib/how-to-trigger-lambda-from-s3-stack.ts를 열고 새 Lambda 함수를 추가하고 배포합니다.

import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
import * as lambda from '@aws-cdk/aws-lambda';

export class HowToTriggerLambdaFromS3Stack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const bucket = new s3.Bucket(this, 'OurBucket', {
      /**
       * The following properties ensure the bucket is properly 
       * deleted when we run cdk destroy */
      autoDeleteObjects: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY
    });

    const lambdaFunction = new lambda.Function(this, 'Function', {
      code: lambda.Code.fromAsset('src'),
      handler: 'index.handler',
      functionName: 'BucketPutHandler',
      runtime: lambda.Runtime.NODEJS_12_X,
    });
  }
}



다시 배포...

npm run cdk deploy


더 많은 IAM 변경 사항을 확인해야 할 수도 있습니다.

이벤트 소스 만들기



Lambda 이벤트 소스 CDK 패키지를 설치합니다.

npm i @aws-cdk/aws-lambda-event-sources


lib/how-to-trigger-lambda-from-s3-stack.ts를 열고 Lambda 함수에 새 S3EventSource를 추가합니다.

import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
import * as lambda from '@aws-cdk/aws-lambda';
import * as lambdaEventSources from '@aws-cdk/aws-lambda-event-sources';

export class HowToTriggerLambdaFromS3Stack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const bucket = new s3.Bucket(this, 'OurBucket', {
      /**
       * The following properties ensure the bucket is properly 
       * deleted when we run cdk destroy */
      autoDeleteObjects: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY
    });

    const lambdaFunction = new lambda.Function(this, 'Function', {
      code: lambda.Code.fromAsset('src'),
      handler: 'index.handler',
      functionName: 'BucketPutHandler',
      runtime: lambda.Runtime.NODEJS_12_X,
    });

    const s3PutEventSource = new lambdaEventSources.S3EventSource(bucket, {
      events: [
        s3.EventType.OBJECT_CREATED_PUT
      ]
    });

    lambdaFunction.addEventSource(s3PutEventSource);
  }
}


한 번 더 배포 ...

npm run cdk deploy


마지막으로 IAM 변경을 승인해야 할 수도 있습니다.



테스트



S3 버킷에 업로드하는 데 사용할 텍스트 파일을 생성합니다.

echo "This is a test" > testFile.txt


AWS CLI를 사용하여 이전의 S3 버킷에 이 파일을 업로드합니다. 버킷 이름은 다양하지만 나에게 이 명령은 다음과 같습니다.

aws s3 cp ./testFile.txt s3://howtotriggerlambdafroms3stack-ourbucket48caf57c-1p9g74rol1cza/testFile.txt


CloudWatch를 확인하여 Lambda가 실행되었는지 확인합니다. /aws/lambda/BucketPutHandler라는 LogGroup을 찾아 최신 LogStream을 엽니다. 이와 유사한 일부 로그 메시지가 표시되어야 합니다.



정리



완료되면 스택을 삭제하는 것을 잊지 마십시오!

npm run cdk destroy


읽어 주셔서 감사합니다! 도움이 되셨다면 여기에서 저를 팔로우 해주세요

좋은 웹페이지 즐겨찾기