Amazon SNS 알림으로 Lambda 함수 호출하기

Amazon SNS 알림으로 Lambda 함수 호출하기 (Invoking Lambda functions with Amazon SNS notifications)

Lambda 함수로 Amazon Simple Notification Service(Amazon SNS) 알림을 처리할 수 있어요. Amazon SNS는 토픽에 보낸 메시지의 대상으로 Lambda 함수를 지원해요. 같은 계정이나 다른 AWS 계정의 토픽에 함수를 구독할 수 있어요. Lambda는 표준 SNS 토픽에 대해서만 SNS 트리거를 지원해요. FIFO 토픽은 지원되지 않아요.

Lambda는 메시지를 큐잉하고 재시도를 처리하는 방식으로 SNS 메시지를 비동기적으로 처리해요. Amazon SNS가 Lambda에 도달할 수 없거나 메시지가 거부되면 Amazon SNS는 몇 시간에 걸쳐 간격을 늘려 가며 재시도해요.

경고

Lambda 비동기 호출은 각 이벤트를 최소 한 번 처리하며 레코드 중복 처리가 발생할 수 있어요. 중복 이벤트와 관련된 잠재적 문제를 피하려면 함수 코드를 멱등(idempotent)하게 만들 것을 강력히 권장해요.

출처: AWS Lambda 개발자 안내서

본문

Powertools for AWS Lambda의 멱등성 유틸리티

Powertools for AWS Lambda의 멱등성(idempotency) 유틸리티는 Lambda 함수를 멱등하게 만들어 줘요. Python, TypeScript, Java, .NET에서 사용할 수 있어요.

콘솔로 Lambda 함수에 Amazon SNS 토픽 트리거 추가

Lambda 함수에 SNS 토픽 트리거를 추가하는 가장 쉬운 방법은 Lambda 콘솔을 사용하는 것이에요. 콘솔로 트리거를 추가하면 Lambda가 SNS 토픽에서 이벤트를 받기 시작하는 데 필요한 권한과 구독을 자동으로 설정해요.

Lambda 함수에 SNS 토픽 트리거 추가(콘솔)

  1. Lambda 콘솔의 Functions 페이지를 엽니다.
  2. 트리거를 추가할 함수의 이름을 선택합니다.
  3. Configuration을 선택하고 Triggers를 선택합니다.
  4. Add trigger를 선택합니다.
  5. Trigger configuration의 드롭다운 메뉴에서 SNS를 선택합니다.
  6. SNS topic에서 구독할 SNS 토픽을 선택합니다.

Lambda 함수에 Amazon SNS 토픽 트리거 수동 추가

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

  1. SNS가 함수를 호출할 수 있도록 함수에 대한 리소스 기반 정책을 정의합니다.
  2. Lambda 함수를 Amazon SNS 토픽에 구독합니다.

참고

SNS 토픽과 Lambda 함수가 다른 AWS 계정에 있다면 SNS 토픽에 대한 크로스 계정 구독을 허용하는 추가 권한도 부여해야 해요.

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"
      }
    }
  ]
}

더 알아보기 (Learn more)