

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Statut de distribution de message Amazon SNS
<a name="sns-topic-attributes"></a>

Amazon SNS prend en charge la journalisation de l'état de livraison des messages de notification envoyés à des rubriques comportant les points de terminaison Amazon SNS suivants : 
+ Amazon Data Firehose
+ Amazon Simple Queue Service
+ AWS Lambda
+ HTTPS
+ Point de terminaison de l'application de plateforme

Les journaux d'état de livraison sont envoyés à Amazon CloudWatch Logs, fournissant des informations sur les opérations de livraison des messages. Ces journaux vous aident à :
+ Déterminez si un message a été correctement envoyé à un point de terminaison.
+ Identifiez la réponse du point de terminaison à Amazon SNS.
+ Mesurez le temps d'attente des messages (temps entre l'horodatage de publication et le transfert au terminal).

Vous pouvez configurer la journalisation de l'état de livraison à l' AWS Management Console aide de l'API,, Query ou AWS CloudFormation. AWS SDKs

# Conditions préalables à l'enregistrement de l'état de livraison
<a name="topics-attrib-prereq"></a>

Cette rubrique décrit les autorisations IAM nécessaires pour permettre à Amazon SNS d'écrire des journaux de livraison et explique la convention CloudWatch de dénomination des groupes de journaux par défaut. Cela garantit que vous disposez de la configuration et de l'accès appropriés pour surveiller et analyser les journaux de distribution des messages dans CloudWatch les journaux.

**Autorisations IAM requises**

Le rôle IAM associé à la journalisation de l'état de livraison doit inclure les autorisations suivantes pour permettre à Amazon SNS d'écrire CloudWatch dans Logs. Vous pouvez utiliser un rôle existant avec ces autorisations ou créer un nouveau rôle lors de la configuration.

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

****  

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

------

**Convention de dénomination des groupes de journaux**

Par défaut, Amazon SNS crée des groupes de journaux pour les CloudWatch journaux d'état de livraison en utilisant la convention de dénomination suivante. Les flux de journaux au sein de ce groupe correspondent aux protocoles des terminaux (par exemple, Lambda, Amazon SQS). Vérifiez que vous êtes autorisé à consulter ces journaux dans la console CloudWatch Logs.

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

# Configuration de l'enregistrement de l'état de livraison à l'aide du AWS Management Console
<a name="topics-attrib"></a>

Cette rubrique explique comment activer la journalisation de l'état de livraison des messages pour les rubriques Amazon SNS, notamment la configuration des paramètres de journalisation, l'attribution de rôles IAM et la vérification que les CloudWatch journaux capturent les journaux de livraison à des fins de surveillance et de résolution des problèmes.

1. Connectez-vous à la [console Amazon SNS](https://console.aws.amazon.com/sns/home).

1. Dans le panneau de navigation, choisissez **Rubriques**.

1. Sélectionnez le **sujet** souhaité, puis choisissez **Modifier**.

1. Développez la section **Enregistrement de l'état de livraison**.

1. Choisissez le **protocole** pour lequel vous souhaitez activer la journalisation (par exemple, HTTP, Lambda, Amazon SQS).

1. Entrez le **taux d'échantillonnage de réussite**, qui est le pourcentage de messages réussis pour lesquels vous souhaitez recevoir des CloudWatch journaux.

1. Dans la section **Rôles IAM**, vous devez configurer les rôles pour la journalisation des **réussites** et des **échecs** :
   + **Utiliser un rôle de service existant** : sélectionnez un rôle IAM existant disposant des autorisations requises pour qu'Amazon SNS puisse y écrire des journaux. CloudWatch
   + **Créer un nouveau rôle de service** : choisissez **Créer de nouveaux rôles** pour définir les rôles IAM pour les livraisons réussies et échouées dans la console IAM. Pour plus de détails sur les autorisations, voir[Conditions préalables à l'enregistrement de l'état de livraison](topics-attrib-prereq.md).

1. Sélectionnez **Enregistrer les modifications**.

   Après avoir activé la journalisation, vous pouvez afficher et analyser les CloudWatch journaux contenant l'état de livraison des messages. Pour plus d'informations sur l'utilisation CloudWatch, consultez la [CloudWatchdocumentation](https://aws.amazon.com/documentation/cloudwatch).

**Vérification de la configuration du journal**

1. Connectez-vous à la console CloudWatch Logs.

1. Localisez le groupe de journaux nommé`sns/<region>/<account-id>/<topic-name>`.

1. Assurez-vous que les flux de journaux existent pour le protocole de point de terminaison configuré.

1. Envoyez un message test à votre sujet et vérifiez que les entrées du journal apparaissent, indiquant les livraisons réussies ou échouées.

# Configuration de l'enregistrement de l'état de livraison à l'aide du AWS SDKs
<a name="msg-status-sdk"></a>

Ils AWS SDKs fournissent, APIs en plusieurs langues, des attributs de rubrique pour l'enregistrement de l'état de livraison des messages. Par exemple, utilisez l'[SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html)API pour configurer :
+ `LambdaSuccessFeedbackRoleArn`— Rôle IAM pour une transmission réussie des messages aux points de terminaison Lambda.
+ `LambdaSuccessFeedbackSampleRate`— Taux d'échantillonnage des messages envoyés avec succès aux points de terminaison Lambda.
+ `LambdaFailureFeedbackRoleArn`— Rôle IAM en cas d'échec de transmission de messages aux points de terminaison Lambda.

**Exemple de AWS CLI commande**

```
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
```

## Attributs de rubrique
<a name="topic-attributes"></a>

Utilisez les valeurs de nom d'attribut de rubrique suivantes pour l'état de livraison des messages :

**HTTP**
+ `HTTPSuccessFeedbackRoleArn`— État de livraison du message réussi pour une rubrique Amazon SNS abonnée à un point de terminaison HTTP. 
+ `HTTPSuccessFeedbackSampleRate`— Pourcentage de messages réussis à échantillonner pour une rubrique Amazon SNS abonnée à un point de terminaison HTTP.
+ `HTTPFailureFeedbackRoleArn`— État d'échec de livraison du message pour une rubrique Amazon SNS abonnée à un point de terminaison HTTP.

**Amazon Data Firehose**
+ `FirehoseSuccessFeedbackRoleArn`— État de livraison du message réussi pour une rubrique Amazon SNS abonnée à un point de terminaison Amazon Data Firehose.
+ `FirehoseSuccessFeedbackSampleRate`— Pourcentage de messages réussis à échantillonner pour une rubrique Amazon SNS abonnée à un point de terminaison Amazon Data Firehose.
+ `FirehoseFailureFeedbackRoleArn`— État d'échec de livraison du message pour une rubrique Amazon SNS abonnée à un point de terminaison Amazon Data Firehose. 

**AWS Lambda**
+ `LambdaSuccessFeedbackRoleArn`— État de livraison du message réussi pour une rubrique Amazon SNS abonnée à un point de terminaison Lambda.
+ `LambdaSuccessFeedbackSampleRate`— Pourcentage de messages réussis à échantillonner pour une rubrique Amazon SNS abonnée à un point de terminaison Lambda.
+ `LambdaFailureFeedbackRoleArn`— État d'échec de livraison du message pour une rubrique Amazon SNS abonnée à un point de terminaison Lambda. 

**Points de terminaison des applications de plate-forme**
+ `ApplicationSuccessFeedbackRoleArn`— État de livraison du message réussi pour une rubrique Amazon SNS abonnée à un point de terminaison d' AWS application.
+ `ApplicationSuccessFeedbackSampleRate`— Pourcentage de messages réussis à échantillonner pour une rubrique Amazon SNS abonnée à un point de terminaison d' AWS application.
+ `ApplicationFailureFeedbackRoleArn`— État d'échec de livraison du message pour une rubrique Amazon SNS abonnée à un point de terminaison d' AWS application.
**Note**  
En outre, vous pouvez configurer les attributs de l'application pour enregistrer l'état de livraison directement dans les services de notification push. Pour plus d'informations, consultez la page [Utilisation des attributs d'application Amazon SNS pour le statut de distribution du message](https://docs.aws.amazon.com/sns/latest/dg/sns-msg-status.html). 

**Amazon SQS**
+ `SQSSuccessFeedbackRoleArn`— État de livraison du message réussi pour une rubrique Amazon SNS abonnée à un point de terminaison Amazon SQS. 
+ `SQSSuccessFeedbackSampleRate`— Pourcentage de messages réussis à échantillonner pour une rubrique Amazon SNS abonnée à un point de terminaison Amazon SQS. 
+ `SQSFailureFeedbackRoleArn`— État d'échec de livraison du message pour une rubrique Amazon SNS abonnée à un point de terminaison Amazon SQS. 

Les journaux des points de terminaison des applications de plate-forme sont écrits dans le même groupe de CloudWatch journaux que les autres points de terminaison.

**Note**  
 Les `<ENDPOINT>FailureFeedbackRoleArn` attributs `<ENDPOINT>SuccessFeedbackRoleArn` et sont utilisés pour donner à Amazon SNS un accès en écriture lui permettant d'utiliser CloudWatch Logs en votre nom. L'attribut `<ENDPOINT>SuccessFeedbackSampleRate` permet de spécifier le pourcentage de la fréquence d’échantillonnage (0-100) des messages diffusés avec succès. Une fois que vous avez configuré l'`<ENDPOINT>FailureFeedbackRoleArn`attribut, tous les messages ayant échoué génèrent des CloudWatch journaux. 

# AWS Exemples de SDK pour configurer les attributs des rubriques
<a name="topic-attributes-sdks"></a>

Les exemples de code suivants illustrent comment utiliser `SetTopicAttributes`.

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

**AWS CLI**  
**Pour définir un attribut pour une rubrique**  
L’exemple `set-topic-attributes` suivant définit l’attribut `DisplayName` pour la rubrique spécifiée.  

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-west-2:123456789012:MyTopic \
    --attribute-name DisplayName \
    --attribute-value MyTopicDisplayName
```
Cette commande ne produit aucune sortie.  
+  Pour plus de détails sur l'API, reportez-vous [SetTopicAttributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/set-topic-attributes.html)à la section *Référence des AWS CLI commandes*. 

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

**SDK pour Java 2.x**  
 Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le [référentiel d’exemples de code 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);
        }
    }
}
```
+  Pour plus de détails sur l'API, voir [SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/SetTopicAttributes)la section *Référence des AWS SDK for Java 2.x API*. 

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

**SDK pour JavaScript (v3)**  
 Il y en a plus sur GitHub. Trouvez l'exemple complet et découvrez comment le configurer et l'exécuter dans le [ référentiel d’exemples de code AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sns#code-examples). 
Créez le client dans un module séparé et exportez-le.  

```
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({});
```
Importez le kit SDK et les modules client et appelez l’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;
};
```
+  Pour plus d’informations, consultez le [AWS SDK pour JavaScript Guide du développeur](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sns-examples-managing-topics.html#sns-examples-managing-topicsstttopicattributes). 
+  Pour plus de détails sur l'API, voir [SetTopicAttributes](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sns/command/SetTopicAttributesCommand)la section *Référence des AWS SDK pour JavaScript API*. 

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

**SDK pour Kotlin**  
 Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le [référentiel d’exemples de code 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.")
    }
}
```
+  Pour plus de détails sur l'API, consultez [SetTopicAttributes](https://sdk.amazonaws.com/kotlin/api/latest/index.html)la section *AWS SDK pour la référence de l'API Kotlin*. 

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

**Kit SDK pour PHP**  
 Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le [référentiel d’exemples de code 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());
}
```
+  Pour plus de détails sur l'API, voir [SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/SetTopicAttributes)la section *Référence des AWS SDK pour PHP API*. 

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

**Kit SDK pour Ruby**  
 Il y en a plus sur GitHub. Trouvez l'exemple complet et découvrez comment le configurer et l'exécuter dans le [ référentiel d'exemples de code 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
```
+  Pour plus d’informations, consultez le [Guide du développeur AWS SDK pour Ruby](https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/sns-example-enable-resource.html). 
+  Pour plus de détails sur l'API, voir [SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForRubyV3/sns-2010-03-31/SetTopicAttributes)la section *Référence des AWS SDK pour Ruby API*. 

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

**Kit SDK pour SAP ABAP**  
 Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le [référentiel d’exemples de code 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.
```
+  Pour plus de détails sur l'API, consultez [SetTopicAttributes](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)la section de référence du *AWS SDK pour l'API SAP ABAP*. 

------

# Configuration de l'enregistrement du statut de livraison à l'aide CloudFormation
<a name="msg-status-cloudformation"></a>

Pour configurer `DeliveryStatusLogging` l'utilisation CloudFormation, utilisez un modèle JSON ou YAML pour créer une CloudFormation pile. Pour plus d'informations, consultez la `DeliveryStatusLogging` propriété de la `AWS::SNS::Topic` ressource dans le guide de CloudFormation l'utilisateur. Vous trouverez ci-dessous des exemples de CloudFormation modèles en JSON et YAML permettant de créer une nouvelle rubrique ou de mettre à jour une rubrique existante avec tous les `DeliveryStatusLogging` attributs du protocole Amazon SQS.

Assurez-vous que les rôles IAM sont référencés `SuccessFeedbackRoleArn` et `FailureFeedbackRoleArn` disposent des autorisations de CloudWatch journalisation requises.

------
#### [ 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
```

------