

# 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 のよくある質問の中の[信頼性](https://aws.amazon.com/sns/faqs/#Reliability)を参照してください。

**警告**  
Lambda 非同期呼び出しは各イベントを少なくとも 1 回処理し、レコードの重複処理が発生する可能性があります。重複するイベントに関連する潜在的な問題を避けるため、関数コードを冪等にすることを強くお勧めします。詳細については、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>

SNS トピックを Lambda 関数のトリガーとして追加する最も簡単な方法は、Lambda コンソールを使用することです。コンソールからトリガーを追加すると、Lambda は SNS トピックからのイベントの受信を開始するために必要なアクセス許可とサブスクリプションを自動的に設定します。

**SNS トピックを Lambda 関数のトリガーとして追加するには (コンソール)**

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 がその関数を呼び出すことを許可します。
+ Lambda 関数を Amazon SNS トピックにサブスクライブします。
**注記**  
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"
      }
    }
  ]
}
```