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

이 게시물에서는 AWS CDK를 사용하여 AWS SNS 메시지에서 트리거되는 AWS Lambda 함수를 빌드할 것입니다.

모든 코드can be found in this repository .

설정



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

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



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


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

SNS 주제 만들기



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

npm i @aws-cdk/aws-sns

lib/how-to-trigger-lambda-from-sns-stack.ts를 열고 새 SNS 주제를 추가한 다음 배포합니다.

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

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

    const topic = new sns.Topic(this, 'OurSnsTopic', {
      displayName: 'Our SNS Topic',
    });
  }
}



멋진! 스택을 배포합시다.
npm run cdk deploy

람다 생성



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('Record: %j', record);
  });
};

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

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

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

    const topic = new sns.Topic(this, 'OurSnsTopic', {
      displayName: 'Our SNS Topic',
    });

    const lambdaFunction = new lambda.Function(this, 'Function', {
      code: lambda.Code.fromAsset('src'),
      handler: 'index.handler',
      functionName: 'SnsMessageHandler',
      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 sns from '@aws-cdk/aws-sns';
import * as lambda from '@aws-cdk/aws-lambda';
import * as lambdaEventSources from '@aws-cdk/aws-lambda-event-sources';

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

    const topic = new sns.Topic(this, 'OurSnsTopic', {
      displayName: 'Our SNS Topic',
    });

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

    const eventSource = new lambdaEventSources.SnsEventSource(topic);

    lambdaFunction.addEventSource(eventSource);
  }
}


한 번 더 배포 ...

npm run cdk deploy


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



테스트



AWS CLI를 사용하여 스택을 테스트할 것입니다.

먼저 SNS 주제의 ARN이 필요하며 다음 명령을 사용하여 얻을 수 있습니다.

aws sns list-topics --query "Topics[?contains(TopicArn, 'OurSnsTopic')]"


그런 다음 이전 명령의 TopicArn을 사용하여 AWS CLI를 사용하여 Our SNS Topic에 새 메시지를 게시합니다. 귀하의 주제 ARN은 다를 수 있지만 저에게 이 명령은 다음과 같습니다.

aws sns publish \
    --topic-arn "arn:aws:sns:us-east-2:472331918655:HowToTriggerLambdaFromSnsStack-OurSnsTopic2ED19057-1GAA1XT2U6XXH" \
    --message "Hello from SNS"


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



정리



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

npm run cdk destroy


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

좋은 웹페이지 즐겨찾기