Amazon SNS 알림을 사용하여 Lambda 함수 간접 호출 - AWS Lambda

Amazon SNS 알림을 사용하여 Lambda 함수 간접 호출

Lambda 함수를 사용하여 Amazon Simple Notification Service(Amazon SNS) 알림을 처리할 수 있습니다. Amazon SNS는 Lambda 함수를 주제에 전송된 메시지에 대한 대상으로 지원합니다. 동일한 계정 또는 다른 AWS 계정의 주제에 함수를 등록할 수 있습니다. 자세한 내용은 자습서: Amazon Simple Notification Service에서 AWS Lambda 사용 섹션을 참조하세요.

Lambda는 표준 SNS 주제에 대해서만 SNS 트리거를 지원합니다. FIFO 주제는 지원되지 않습니다.

비동기 호출을 위해 Lambda는 메시지를 대기열에 추가하고 재시도를 처리합니다. Amazon SNS가 Lambda에 도달할 수 없거나 메시지가 거부되는 경우, Amazon SNS는 몇 시간 동안 간격을 늘리면서 재시도합니다. 자세한 내용은 Amazon SNS FAQ에서 안정성을 참조하세요.

주의

Lambda 이벤트 소스 매핑은 각 이벤트를 한 번 이상 처리하므로 레코드가 중복될 수 있습니다. 중복 이벤트와 관련된 잠재적 문제를 방지하려면 함수 코드를 멱등성으로 만드는 것이 좋습니다. 자세한 내용은 AWS 지식 센터의 멱등성 Lambda 함수를 만들려면 어떻게 해야 합니까?를 참조하세요.

콘솔을 사용하여 Lambda 함수에 대한 Amazon SNS 주제 트리거 추가

Lambda 함수에 대한 트리거로 SNS 주제를 추가하는 가장 쉬운 방법은 Lambda 콘솔을 사용하는 것입니다. 콘솔을 통해 트리거를 추가하면 Lambda가 SNS 주제에서 이벤트 수신을 시작하는 데 필요한 권한과 구독을 자동으로 설정합니다.

Lambda 함수에 대한 트리거로 SNS 주제를 추가하려면 다음을 수행하세요(콘솔).
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 트리거를 추가할 함수의 이름을 선택합니다.

  3. 구성을 선택하고 트리거를 선택합니다.

  4. 트리거 추가를 선택합니다.

  5. 트리거 구성 아래의 드롭다운 메뉴에서 SNS를 선택합니다.

  6. SNS 주제로 구독할 SNS 주제를 선택합니다.

Lambda 함수에 대한 Amazon SNS 주제 트리거 수동 추가

Lambda 함수에 대한 SNS 트리거를 수동으로 설정하려면 다음 단계를 완료해야 합니다.

  • SNS가 함수를 간접적으로 호출할 수 있도록 함수에 대한 리소스 기반 정책을 정의합니다.

  • Amazon SNS 주제에 대한 Lambda 함수를 구독합니다.

    참고

    SNS 주제와 Lambda 함수가 서로 AWS 다른 계정에 있는 경우 SNS 주제에 대한 크로스 계정 구독을 허용하려면 추가 권한도 부여해야 합니다. 자세한 내용은 Amazon SNS 구독을 위한 크로스 계정 권한 부여를 참조하세요.

AWS Command Line Interface(AWS CLI)를 사용하여 이 두 단계를 모두 완료할 수 있습니다. 먼저, SNS 간접 호출을 허용하는 Lambda 함수에 대한 리소스 기반 정책을 정의하려면 다음 AWS CLI 명령을 사용하세요. --function-name 값을 Lambda 함수 이름으로 바꾸고 --source-arn 값을 SNS 주제 ARN으로 바꿔야 합니다.

aws lambda add-permission --function-name example-function \ --source-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \ --statement-id function-with-sns --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com

SNS 주제의 함수를 구독하려면 다음 AWS CLI 명령을 사용하세요. --topic-arn 값을 SNS 주제 ARN으로 바꾸고, --notification-endpoint 값을 Lambda 함수 ARN으로 바꿉니다.

aws sns subscribe --protocol lambda \ --region us-east-1 \ --topic-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \ --notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:example-function

샘플 SNS 이벤트 셰이프

Amazon SNS는 메시지 및 메타데이터를 포함하는 이벤트와 비동기적으로 함수를 호출합니다.

예 Amazon SNS 메시지 이벤트
{ "Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:us-east-1:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "2019-01-02T12:45:07.000Z", "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==", "SigningCertURL": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem", "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", "Message": "Hello from SNS!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" } }, "Type": "Notification", "UnsubscribeURL": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "TopicArn":"arn:aws:sns:us-east-1:123456789012:sns-lambda", "Subject": "TestInvoke" } } ] }