

# Amazon SNS 알림을 사용하여 Lambda 함수 간접 호출
<a name="with-sns"></a>

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

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

Lambda는 메시지를 대기열에 넣고 재시도를 처리하여 SNS 메시지를 비동기식으로 처리합니다. Amazon SNS가 Lambda에 도달할 수 없거나 메시지가 거부되는 경우, Amazon SNS는 몇 시간 동안 간격을 늘리면서 재시도합니다. 자세한 내용은 Amazon SNS FAQ에서 [안정성](https://aws.amazon.com/sns/faqs/#Reliability)을 참조하세요.

**주의**  
Lambda 비동기식 간접 호출은 각 이벤트를 한 번 이상 처리하므로 레코드가 중복될 수 있습니다. 중복 이벤트와 관련된 잠재적 문제를 방지하려면 함수 코드를 멱등성으로 만드는 것이 좋습니다. 자세한 내용은 AWS 지식 센터의 [함수를 멱등성 Lambda 함수로 만들려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/lambda-function-idempotent)를 참조하세요.

## Powertools for AWS Lambda 멱등성 유틸리티
<a name="services-sns-powertools-idempotency"></a>

Powertools for AWS Lambda의 멱등성 유틸리티는 Lambda 함수가 멱등성을 가지게 만듭니다. Python, TypeScript, Java 및 .NET에 사용할 수 있습니다. 자세한 내용은 *Powertools for AWS Lambda(Python) 설명서*의 [멱등성 유틸리티](https://docs.powertools.aws.dev/lambda/python/latest/utilities/idempotency/), *Powertools for AWS Lambda(TypeScript) 설명서*의 [멱등성 유틸리티](https://docs.aws.amazon.com/powertools/typescript/2.1.1/utilities/idempotency/), *Powertools for AWS Lambda(Java) 설명서*의 [멱등성 유틸리티](https://docs.powertools.aws.dev/lambda/java/latest/utilities/idempotency/), *Powertools for AWS Lambda(.NET) 설명서*의 [멱등성 유틸리티](https://docs.powertools.aws.dev/lambda/dotnet/utilities/idempotency/)를 참조하세요.

**Topics**
+ [Powertools for AWS Lambda 멱등성 유틸리티](#services-sns-powertools-idempotency)
+ [콘솔을 사용하여 Lambda 함수에 대한 Amazon SNS 주제 트리거 추가](#sns-trigger-console)
+ [Lambda 함수에 대한 Amazon SNS 주제 트리거 수동 추가](#sns-trigger-manual)
+ [샘플 SNS 이벤트 셰이프](#sns-sample-event)
+ [자습서: Amazon Simple Notification Service에서 AWS Lambda 사용](with-sns-example.md)

## 콘솔을 사용하여 Lambda 함수에 대한 Amazon SNS 주제 트리거 추가
<a name="sns-trigger-console"></a>

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

**Lambda 함수에 대한 트리거로 SNS 주제를 추가하려면 다음을 수행하세요(콘솔).**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

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

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

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

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

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

## Lambda 함수에 대한 Amazon SNS 주제 트리거 수동 추가
<a name="sns-trigger-manual"></a>

Lambda 함수에 대한 SNS 트리거를 수동으로 설정하려면 다음 단계를 완료해야 합니다.
+ SNS가 함수를 간접적으로 간접 호출할 수 있도록 함수에 대한 리소스 기반 정책을 정의합니다.
+ Amazon SNS 주제에 대한 Lambda 함수를 구독합니다.
**참고**  
SNS 주제와 Lambda 함수가 서로 AWS 다른 계정에 있는 경우 SNS 주제에 대한 크로스 계정 구독을 허용하려면 추가 권한도 부여해야 합니다. 자세한 내용은 [Amazon SNS 구독을 위한 크로스 계정 권한 부여](with-sns-example.md#with-sns-subscription-grant-permission)를 참조하세요.

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 이벤트 셰이프
<a name="sns-sample-event"></a>

Amazon SNS는 메시지 및 메타데이터를 포함하는 이벤트와 [비동기적으로](invocation-async.md) 함수를 간접 호출합니다.

**Example 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&amp;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"
      }
    }
  ]
}
```