

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SNS メッセージ配信ステータス
<a name="sns-topic-attributes"></a>

Amazon SNS では、以下の Amazon SNS エンドポイントでトピックに送信された通知メッセージの配信ステータスをログに記録できます。
+ Amazon Data Firehose
+ Amazon Simple Queue Service
+ AWS Lambda
+ HTTPS
+ プラットフォームアプリケーションエンドポイント

配信ステータスログは Amazon CloudWatch Logs に送信され、メッセージ配信オペレーションに関するインサイトを提供します。これらのログは、次の目的に役立ちます。
+ メッセージがエンドポイントに正常に配信されたかどうかを確認する。
+ Amazon SNS へのエンドポイントから Amazon SNS に送信された応答を特定する。
+ メッセージのドウェル時間 (発行のタイムスタンプからエンドポイントへの配信までの時間) を測定する。

配信ステータスのログ記録は AWS マネジメントコンソール、、 AWS SDKs、クエリ API、または を使用して設定できます AWS CloudFormation。

# 配信ステータスのログ記録に関する前提条件
<a name="topics-attrib-prereq"></a>

このトピックでは、Amazon SNS による CloudWatch への配信ログの書き込みを有効にするために必要な IAM アクセス許可の概要と、デフォルトのロググループの命名規則について説明します。これにより、CloudWatch Logs でメッセージ配信ログをモニタリングおよび分析するための正しい設定とアクセスが可能になります。

**必要な IAM アクセス許可**

配信ステータスのログ記録用にアタッチされた IAM ロールには、Amazon SNS が CloudWatch Logs に書き込めるように、次のアクセス許可が含まれている必要があります。設定時に、これらのアクセス許可を持つ既存のロールを使用するか、新しいロールを作成できます。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}
```

------

**ロググループの命名規則**

デフォルトでは、Amazon SNS は、次の命名規則を使用して、配信ステータスログ用の CloudWatch ロググループを作成します。このグループ内のログストリームは、エンドポイントプロトコル (Lambda、Amazon SQS など) に対応しています。CloudWatch Logs コンソールでこれらのログを表示するアクセス許可があることを確認してください。

```
sns/<region>/<account-id>/<topic-name>
```

# を使用した配信ステータスのログ記録の設定 AWS マネジメントコンソール
<a name="topics-attrib"></a>

このトピックでは、Amazon SNS トピックに関するメッセージ配信ステータスのログ記録を有効にする方法について説明します。ログ記録の設定、IAM ロールの割り当て、モニタリングとトラブルシューティングを目的とした CloudWatch Logs による配信ログのキャプチャの検証などを取り上げます。

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションパネルで、[**トピック**] を選択します。

1. 目的の**トピック**を選択し、**[編集]** を選択します。

1. **[配信ステータスのログ記録]** セクションを展開します。

1. ログ記録を有効にする**プロトコル** (HTTP、Lambda、Amazon SQS など) を選択します。

1. **[成功サンプルレート]** (CloudWatch Logs を受信するための成功メッセージの割合) を入力します。

1. **[IAM ロール]** セクションでは、**成功**のログ記録と**失敗**のログ記録の両方のロールを設定する必要があります。
   + **既存のサービスロールを使用** – Amazon SNS が CloudWatch にログを書き込む際に必要となるアクセス許可を持つ既存の IAM ロールを選択します。
   + **新しいサービスロールを作成** – **[新しいロールの作成]** を選択して、IAM コンソールで成功および失敗した配信の IAM ロールを定義します。アクセス許可の詳細については、「[配信ステータスのログ記録に関する前提条件](topics-attrib-prereq.md)」を参照してください。

1. **[Save changes]** (変更の保存) をクリックします。

   ログ記録を有効にすると、メッセージ配信ステータスを含む CloudWatch Logs を表示して解析することができます。CloudWatch の使用方法の詳細については、「[CloudWatch のドキュメント](https://aws.amazon.com/documentation/cloudwatch)」を参照してください。

**ログの設定の確認**

1. CloudWatch Logs コンソールにサインインします。

1. `sns/<region>/<account-id>/<topic-name>` という名前のロググループを見つけます。

1. 設定したエンドポイントプロトコルのログストリームが存在することを確認します。

1. トピックにテストメッセージを送信して、配信の成功または失敗を示すログエントリが表示されることを確認します。

# AWS SDKs を使用した配信ステータスのログ記録の設定
<a name="msg-status-sdk"></a>

 AWS SDKs は、メッセージ配信ステータスのログ記録のトピック属性を設定するための APIs を複数の言語で提供します。例えば、[SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html) API を使用して以下を設定します。
+ `LambdaSuccessFeedbackRoleArn` – Lambda エンドポイントへのメッセージ配信が成功した場合の IAM ロール。
+ `LambdaSuccessFeedbackSampleRate` – Lambda エンドポイントへの配信が成功したメッセージのサンプリングレート。
+ `LambdaFailureFeedbackRoleArn` – Lambda エンドポイントへのメッセージ配信が失敗した場合の IAM ロール。

** AWS CLI コマンドの例**

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-west-2:123456789012:MyTopic \
    --attribute-name LambdaSuccessFeedbackRoleArn \
    --attribute-value arn:aws:iam::123456789012:role/MyFeedbackRole
```

## トピック属性
<a name="topic-attributes"></a>

メッセージ配信ステータスには、次のトピック属性名の値を使用してください。

**HTTP**
+ `HTTPSuccessFeedbackRoleArn` – HTTP エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が成功したことを示します。
+ `HTTPSuccessFeedbackSampleRate` – HTTP エンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `HTTPFailureFeedbackRoleArn` – HTTP エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が失敗したことを示します。

**Amazon Data Firehose**
+ `FirehoseSuccessFeedbackRoleArn` – Amazon Data Firehose エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が成功したことを示します。
+ `FirehoseSuccessFeedbackSampleRate` – Amazon Data Firehose エンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `FirehoseFailureFeedbackRoleArn` – Amazon Data Firehose エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が失敗したことを示します。

**AWS Lambda**
+ `LambdaSuccessFeedbackRoleArn` – Lambda エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が成功したことを示します。
+ `LambdaSuccessFeedbackSampleRate` – Lambda エンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `LambdaFailureFeedbackRoleArn` – Lambda エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が失敗したことを示します。

**プラットフォームアプリケーションエンドポイント**
+ `ApplicationSuccessFeedbackRoleArn` – AWS アプリケーションエンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信ステータスの成功。
+ `ApplicationSuccessFeedbackSampleRate` – AWS アプリケーションエンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `ApplicationFailureFeedbackRoleArn` – AWS アプリケーションエンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信ステータスが失敗しました。
**注記**  
配信ステータスをプッシュ通知サービスに直接ログ記録するように、アプリケーションの属性を設定することもできます。詳細については、「[メッセージの配信ステータスの Amazon SNS アプリケーション属性を使用する](https://docs.aws.amazon.com/sns/latest/dg/sns-msg-status.html)」を参照してください。

**Amazon SQS**
+ `SQSSuccessFeedbackRoleArn` – Amazon SQS エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が成功したことを示します。
+ `SQSSuccessFeedbackSampleRate` – Amazon SQS エンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `SQSFailureFeedbackRoleArn` – Amazon SQS エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が失敗したことを示します。

プラットフォームアプリケーションエンドポイントのログは、他のエンドポイントと同じ CloudWatch Logs グループに書き込まれます。

**注記**  
 `<ENDPOINT>SuccessFeedbackRoleArn` および `<ENDPOINT>FailureFeedbackRoleArn` 属性は、お客様に代わって CloudWatch Logs を使用する書き込みアクセス許可を Amazon SNS に付与するために使用します。`<ENDPOINT>SuccessFeedbackSampleRate` 属性は、正常な配信メッセージのサンプルレートの割合 (0〜100) を指定するためのものです。`<ENDPOINT>FailureFeedbackRoleArn` 属性を設定した後は、メッセージの配信に失敗すると、必ず CloudWatch Logs が生成されます。

# AWS トピック属性を設定するための SDK の例
<a name="topic-attributes-sdks"></a>

次のサンプルコードは、`SetTopicAttributes` を使用する方法を説明しています。

------
#### [ CLI ]

**AWS CLI**  
**トピックの属性を設定するには**  
次の `set-topic-attributes` の例では、指定したトピックの `DisplayName` 属性を設定します。  

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-west-2:123456789012:MyTopic \
    --attribute-name DisplayName \
    --attribute-value MyTopicDisplayName
```
このコマンドでは何も出力されません。  
+  API の詳細については、「*AWS CLI コマンドリファレンス*」の「[SetTopicAttributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/set-topic-attributes.html)」を参照してください。

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SetTopicAttributesRequest;
import software.amazon.awssdk.services.sns.model.SetTopicAttributesResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class SetTopicAttributes {

    public static void main(String[] args) {
        final String usage = """

                Usage:    <attribute> <topicArn> <value>

                Where:
                   attribute - The attribute action to use. Valid parameters are: Policy | DisplayName | DeliveryPolicy .
                   topicArn - The ARN of the topic.\s
                   value - The value for the attribute.
                """;

        if (args.length < 3) {
            System.out.println(usage);
            System.exit(1);
        }

        String attribute = args[0];
        String topicArn = args[1];
        String value = args[2];

        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        setTopAttr(snsClient, attribute, topicArn, value);
        snsClient.close();
    }

    public static void setTopAttr(SnsClient snsClient, String attribute, String topicArn, String value) {
        try {
            SetTopicAttributesRequest request = SetTopicAttributesRequest.builder()
                    .attributeName(attribute)
                    .attributeValue(value)
                    .topicArn(topicArn)
                    .build();

            SetTopicAttributesResponse result = snsClient.setTopicAttributes(request);
            System.out.println(
                    "\n\nStatus was " + result.sdkHttpResponse().statusCode() + "\n\nTopic " + request.topicArn()
                            + " updated " + request.attributeName() + " to " + request.attributeValue());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  API の詳細については、*AWS SDK for Java 2.x API リファレンス*の「[SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/SetTopicAttributes)」を参照してください。

------
#### [ JavaScript ]

**SDK for JavaScript (v3)**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sns#code-examples)での設定と実行の方法を確認してください。
別のモジュールでクライアントを作成し、エクスポートします。  

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```
SDK モジュールとクライアントモジュールをインポートし、API を呼び出します。  

```
import { SetTopicAttributesCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

export const setTopicAttributes = async (
  topicArn = "TOPIC_ARN",
  attributeName = "DisplayName",
  attributeValue = "Test Topic",
) => {
  const response = await snsClient.send(
    new SetTopicAttributesCommand({
      AttributeName: attributeName,
      AttributeValue: attributeValue,
      TopicArn: topicArn,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'd1b08d0e-e9a4-54c3-b8b1-d03238d2b935',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
  return response;
};
```
+  詳細については、「[AWS SDK for JavaScript デベロッパーガイド](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sns-examples-managing-topics.html#sns-examples-managing-topicsstttopicattributes)」を参照してください。
+  API の詳細については、**AWS SDK for JavaScript API リファレンスの「[SetTopicAttributes](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sns/command/SetTopicAttributesCommand)」を参照してください。

------
#### [ Kotlin ]

**SDK for Kotlin**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/sns#code-examples)での設定と実行の方法を確認してください。

```
suspend fun setTopAttr(
    attribute: String?,
    topicArnVal: String?,
    value: String?,
) {
    val request =
        SetTopicAttributesRequest {
            attributeName = attribute
            attributeValue = value
            topicArn = topicArnVal
        }

    SnsClient.fromEnvironment { region = "us-east-1" }.use { snsClient ->
        snsClient.setTopicAttributes(request)
        println("Topic ${request.topicArn} was updated.")
    }
}
```
+  API の詳細については、*AWS SDK for Kotlin API リファレンス*の「[SetTopicAttributes](https://sdk.amazonaws.com/kotlin/api/latest/index.html)」を参照してください。

------
#### [ PHP ]

**SDK for PHP**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;


/**
 * Configure the message delivery status attributes for an Amazon SNS Topic.
 *
 * This code expects that you have AWS credentials set up per:
 * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
 */

$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);
$attribute = 'Policy | DisplayName | DeliveryPolicy';
$value = 'First Topic';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->setTopicAttributes([
        'AttributeName' => $attribute,
        'AttributeValue' => $value,
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```
+  API の詳細については、*AWS SDK for PHP API リファレンス*の「[SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/SetTopicAttributes)」を参照してください。

------
#### [ Ruby ]

**SDK for Ruby**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
# Service class to enable an SNS resource with a specified policy
class SnsResourceEnabler
  # Initializes the SnsResourceEnabler with an SNS resource client
  #
  # @param sns_resource [Aws::SNS::Resource] The SNS resource client
  def initialize(sns_resource)
    @sns_resource = sns_resource
    @logger = Logger.new($stdout)
  end

  # Sets a policy on a specified SNS topic
  #
  # @param topic_arn [String] The ARN of the SNS topic
  # @param resource_arn [String] The ARN of the resource to include in the policy
  # @param policy_name [String] The name of the policy attribute to set
  def enable_resource(topic_arn, resource_arn, policy_name)
    policy = generate_policy(topic_arn, resource_arn)
    topic = @sns_resource.topic(topic_arn)

    topic.set_attributes({
                           attribute_name: policy_name,
                           attribute_value: policy
                         })
    @logger.info("Policy #{policy_name} set successfully for topic #{topic_arn}.")
  rescue Aws::SNS::Errors::ServiceError => e
    @logger.error("Failed to set policy: #{e.message}")
  end

  private

  # Generates a policy string with dynamic resource ARNs
  #
  # @param topic_arn [String] The ARN of the SNS topic
  # @param resource_arn [String] The ARN of the resource
  # @return [String] The policy as a JSON string
  def generate_policy(topic_arn, resource_arn)
    {
      Version: '2008-10-17',
      Id: '__default_policy_ID',
      Statement: [{
        Sid: '__default_statement_ID',
        Effect: 'Allow',
        Principal: { "AWS": '*' },
        Action: ['SNS:Publish'],
        Resource: topic_arn,
        Condition: {
          ArnEquals: {
            "AWS:SourceArn": resource_arn
          }
        }
      }]
    }.to_json
  end
end

# Example usage:
if $PROGRAM_NAME == __FILE__
  topic_arn = 'MY_TOPIC_ARN' # Should be replaced with a real topic ARN
  resource_arn = 'MY_RESOURCE_ARN' # Should be replaced with a real resource ARN
  policy_name = 'POLICY_NAME' # Typically, this is "Policy"

  sns_resource = Aws::SNS::Resource.new
  enabler = SnsResourceEnabler.new(sns_resource)

  enabler.enable_resource(topic_arn, resource_arn, policy_name)
end
```
+  詳細については、「[AWS SDK for Ruby デベロッパーガイド](https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/sns-example-enable-resource.html)」を参照してください。
+  API の詳細については、**AWS SDK for Ruby API リファレンスの「[SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForRubyV3/sns-2010-03-31/SetTopicAttributes)」を参照してください。

------
#### [ SAP ABAP ]

**SDK for SAP ABAP**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples)での設定と実行の方法を確認してください。

```
    TRY.
        lo_sns->settopicattributes(
            iv_topicarn = iv_topic_arn
            iv_attributename  = iv_attribute_name
            iv_attributevalue = iv_attribute_value ).
        MESSAGE 'Set/updated SNS topic attributes.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Topic does not exist.' TYPE 'E'.
    ENDTRY.
```
+  API の詳細については、*AWS SDK for SAP ABAP API リファレンス*の「[SetTopicAttributes](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)」を参照してください。

------

# を使用した配信ステータスのログ記録の設定 CloudFormation
<a name="msg-status-cloudformation"></a>

`DeliveryStatusLogging` を使用して を設定するには CloudFormation、JSON または YAML テンプレートを使用して CloudFormation スタックを作成します。詳細については、「 CloudFormation ユーザーガイド」の「 `AWS::SNS::Topic`リソースの `DeliveryStatusLogging`プロパティ」を参照してください。以下は、新しいトピックを作成したり、Amazon SQS プロトコルのすべての`DeliveryStatusLogging`属性で既存のトピックを更新したりするための JSON および YAML の CloudFormation テンプレートの例です。

`SuccessFeedbackRoleArn` および `FailureFeedbackRoleArn` で参照されている IAM ロールに、必要な CloudWatch Logs のアクセス許可があることを確認してください。

------
#### [ JSON ]

```
"Resources": {
    "MySNSTopic" : {
        "Type" : "AWS::SNS::Topic",
        "Properties" : {
            "TopicName" : "TestTopic",
            "DisplayName" : "TEST",
            "SignatureVersion" : "2",
            "DeliveryStatusLogging" : [{
                "Protocol": "sqs",
                "SuccessFeedbackSampleRate": "45",
                "SuccessFeedbackRoleArn": "arn:aws:iam::123456789012:role/SNSSuccessFeedback_test1",
                "FailureFeedbackRoleArn": "arn:aws:iam::123456789012:role/SNSFailureFeedback_test2"
            }]
        }
    }
}
```

------
#### [ YAML ]

```
Resources:
  MySNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName:TestTopic
      DisplayName:TEST
      SignatureVersion:2
      DeliveryStatusLogging:
       - Protocol: sqs
         SuccessFeedbackSampleRate: 45
         SuccessFeedbackRoleArn: arn:aws:iam::123456789012:role/SNSSuccessFeedback_test1
         FailureFeedbackRoleArn: arn:aws:iam::123456789012:role/SNSFailureFeedback_test2
```

------