

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.

# Invocation des fonctions Lambda à l’aide des notifications Amazon SNS
<a name="with-sns"></a>

Utilisez une fonction Lambda pour traiter les notifications Amazon Simple Notification Service (Amazon SNS). Amazon SNS prend en charge les fonctions Lambda en tant que cibles pour les messages envoyés à une rubrique. Vous pouvez abonner votre fonction à des rubriques du même compte ou d’autres comptes AWS. Pour voir une procédure, consultez [Tutoriel : Utilisation AWS Lambda avec Amazon Simple Notification Service](with-sns-example.md).

Lambda prend en charge les déclencheurs SNS pour les rubriques SNS standard uniquement. Les rubriques FIFO ne sont pas prises en charge.

Lambda traite les messages SNS de manière asynchrone en les mettant en file d’attente et en gérant les nouvelles tentatives. Si Amazon SNS ne peut pas atteindre Lambda ou si le message est rejeté, Amazon SNS effectue de nouvelles tentatives à intervalles croissants pendant plusieurs heures. Pour plus de détails, consultes [Fiabilité](https://aws.amazon.com/sns/faqs/#Reliability) dans le FAQ sur Amazon SNS.

**Avertissement**  
Les invocations asynchrones traitent chaque événement au moins une fois, et le traitement des enregistrements peut être dupliqué. Pour éviter les problèmes potentiels liés à des événements dupliqués, nous vous recommandons vivement de rendre votre code de fonction idempotent. Pour en savoir plus, consultez [Comment puis-je rendre ma fonction Lambda idempotente ?](https://repost.aws/knowledge-center/lambda-function-idempotent) dans le Centre de connaissances AWS.

## Utilitaire d’idempotence de Powertools pour AWS Lambda
<a name="services-sns-powertools-idempotency"></a>

L’utilitaire d’idempotence de Powertools pour AWS Lambda rend vos fonctions Lambda idempotentes. Il est disponible pour Python, TypeScript, Java et .NET. Pour plus d’informations, consultez [Utilitaire d’idempotence](https://docs.powertools.aws.dev/lambda/python/latest/utilities/idempotency/) dans la *documentation Powertools pour AWS Lambda (Python)*, [Utilitaire d’idempotence](https://docs.aws.amazon.com/powertools/typescript/2.1.1/utilities/idempotency/) dans la *documentation Powertools pour AWS Lambda (TypeScript)*, [Utilitaire d’idempotence](https://docs.powertools.aws.dev/lambda/java/latest/utilities/idempotency/) dans la *documentation Powertools pour AWS Lambda (Java)* et [Utilitaire d’idempotence](https://docs.powertools.aws.dev/lambda/dotnet/utilities/idempotency/) dans la *documentation Powertools pour AWS Lambda (.NET)*.

**Topics**
+ [

## Utilitaire d’idempotence de Powertools pour AWS Lambda
](#services-sns-powertools-idempotency)
+ [

## Ajout d’une rubrique Amazon SNS comme déclencheur de fonction Lambda à l’aide de la console
](#sns-trigger-console)
+ [

## Ajout manuel d’une rubrique Amazon SNS comme déclencheur de fonction Lambda
](#sns-trigger-manual)
+ [

## Exemple de forme d’évènement SNS
](#sns-sample-event)
+ [

# Tutoriel : Utilisation AWS Lambda avec Amazon Simple Notification Service
](with-sns-example.md)

## Ajout d’une rubrique Amazon SNS comme déclencheur de fonction Lambda à l’aide de la console
<a name="sns-trigger-console"></a>

Pour ajouter une rubrique SNS comme déclencheur d’une fonction Lambda, le moyen le plus simple consiste à utiliser la console Lambda. Lorsque vous ajoutez le déclencheur via la console, Lambda configure automatiquement les autorisations et les abonnements nécessaires pour commencer à recevoir des événements provenant de la rubrique SNS.

**Pour ajouter une rubrique SNS comme déclencheur d’une fonction Lambda (console)**

1. Ouvrez la [page Functions](https://console.aws.amazon.com/lambda/home#/functions) (Fonctions) de la console Lambda.

1. Choisissez le nom de la fonction pour laquelle vous souhaitez ajouter le déclencheur.

1. Choisissez **Configuration**, puis **Déclencheurs**.

1. Choisissez **Add trigger (Ajouter déclencheur)**.

1. Sous **Configuration du déclencheur**, dans le menu déroulant, choisissez **SNS**.

1. Pour **Rubrique SNS**, choisissez la rubrique SNS à laquelle vous abonner.

## Ajout manuel d’une rubrique Amazon SNS comme déclencheur de fonction Lambda
<a name="sns-trigger-manual"></a>

Pour configurer manuellement un déclencheur SNS pour une fonction Lambda, vous devez suivre les étapes suivantes :
+ Définir une stratégie basée sur les ressources pour votre fonction afin de permettre à SNS de l’invoquer.
+ Abonner votre fonction Lambda à la rubrique Amazon SNS.
**Note**  
Si votre rubrique SNS et votre fonction Lambda se trouvent sur des comptes AWS distincts, vous devez également octroyer des autorisations supplémentaires pour autoriser les abonnements entre comptes à la rubrique SNS. Pour plus d’informations, consultez [Accorder une autorisation multicompte pour l’abonnement Amazon SNS](with-sns-example.md#with-sns-subscription-grant-permission).

Vous pouvez utiliser l’AWS Command Line Interface (AWS CLI) pour effectuer ces deux étapes. Tout d’abord, pour définir une politique basée sur les ressources pour une fonction Lambda qui autorise les invocations SNS, utilisez la commande AWS CLI suivante. Assurez-vous de remplacer la valeur de `--function-name` par le nom de votre fonction Lambda et la valeur de `--source-arn` par l’ARN de votre rubrique SNS.

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

Pour abonner votre fonction à la rubrique SNS, utilisez la commande AWS CLI suivante. Remplacez la valeur de `--topic-arn` par le nom de votre rubrique ARN et la valeur de `--notification-endpoint` par l’ARN de votre fonction Lambda.

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

## Exemple de forme d’évènement SNS
<a name="sns-sample-event"></a>

Amazon SNS appelle votre fonction [de façon asynchrone](invocation-async.md) avec un événement contenant un message et des métadonnées.

**Example Événement de message 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"
      }
    }
  ]
}
```

# Tutoriel : Utilisation AWS Lambda avec Amazon Simple Notification Service
<a name="with-sns-example"></a>

Dans ce didacticiel, vous utiliserez une fonction Lambda intégrée pour vous abonner Compte AWS à une rubrique Amazon Simple Notification Service (Amazon SNS) dans une rubrique distincte. Compte AWS Lorsque vous publiez des messages sur votre rubrique Amazon SNS, votre fonction Lambda lit le contenu du message et le transmet à Amazon Logs. CloudWatch Pour terminer ce didacticiel, vous devez utiliser le AWS Command Line Interface (AWS CLI).

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/services-sns-tutorial/sns_tut_resources.png)


Pour compléter ce tutoriel, effectuez les tâches suivantes :
+ Dans le **compte A**, créez une rubrique Amazon SNS.
+ Dans le **compte B**, créez une fonction Lambda qui lira les messages de la rubrique.
+ Dans le **compte B**, créez un abonnement à la rubrique.
+ Publiez des messages sur la rubrique Amazon SNS du **compte A** et vérifiez que la fonction Lambda du **compte B les envoie dans Logs**. CloudWatch 

En suivant ces étapes, vous apprendrez à configurer une rubrique Amazon SNS pour invoquer une fonction Lambda. Vous apprendrez également comment créer une politique Gestion des identités et des accès AWS (IAM) qui autorise une ressource d'une autre Compte AWS à invoquer Lambda.

Dans le tutoriel, vous utilisez deux Comptes AWS différents. Les AWS CLI commandes illustrent cela en utilisant deux profils nommés appelés `accountA` et`accountB`, chacun étant configuré pour être utilisé avec un profil différent Compte AWS. Pour savoir comment configurer le AWS CLI pour utiliser différents profils, consultez la section [Paramètres des fichiers de configuration et d'identification](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) dans le *guide de l'AWS Command Line Interface utilisateur de la version 2*. Assurez-vous de configurer la même valeur par défaut Région AWS pour les deux profils.

Si les AWS CLI profils que vous créez pour les deux Comptes AWS utilisent des noms différents, ou si vous utilisez le profil par défaut et un profil nommé, modifiez les AWS CLI commandes dans les étapes suivantes selon vos besoins.

## Conditions préalables
<a name="with-sns-prereqs"></a>

### Installez le AWS Command Line Interface
<a name="install_aws_cli"></a>

Si vous ne l'avez pas encore installé AWS Command Line Interface, suivez les étapes décrites dans la [section Installation ou mise à jour de la dernière version du AWS CLI pour l'](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)installer.

Ce tutoriel nécessite un terminal de ligne de commande ou un shell pour exécuter les commandes. Sous Linux et macOS, utilisez votre gestionnaire de shell et de package préféré.

**Note**  
Sous Windows, certaines commandes CLI Bash que vous utilisez couramment avec Lambda (par exemple `zip`) ne sont pas prises en charge par les terminaux intégrés du système d’exploitation. [Installez le sous-système Windows pour Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) afin d’obtenir une version intégrée à Windows d’Ubuntu et Bash. 

## Créer une rubrique Amazon SNS (compte A)
<a name="with-sns-create-topic"></a>

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_1.png)


**Pour créer la rubrique**
+ Dans le **compte A**, créez une rubrique standard Amazon SNS à l'aide de la commande suivante AWS CLI .

  ```
  aws sns create-topic --name sns-topic-for-lambda --profile accountA
  ```

  Vous devez visualiser des résultats similaires à ce qui suit.

  ```
  {
      "TopicArn": "arn:aws:sns:us-west-2:123456789012:sns-topic-for-lambda"
  }
  ```

  Notez l’Amazon Resource Name (ARN) de votre rubrique. Vous en aurez besoin plus tard dans le tutoriel lorsque vous ajouterez des autorisations à votre fonction Lambda pour vous abonner à cette rubrique.

## Créer un rôle d’exécution de fonction (compte B)
<a name="with-sns-example-create-iam-role"></a>

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_2.png)


Un rôle d'exécution est un rôle IAM qui accorde à une fonction Lambda l'autorisation d' Services AWS accès et de ressources. Avant de créer votre fonction dans le **compte B**, vous devez créer un rôle qui donne à la fonction les autorisations de base pour écrire des journaux dans CloudWatch Logs. Nous ajouterons les autorisations de lecture à partir de votre rubrique Amazon SNS à une étape ultérieure.

**Pour créer un rôle d’exécution**

1. Dans le **compte B**, ouvrez la [page des rôles](https://console.aws.amazon.com/iam/home#/roles) dans la console IAM.

1. Choisissez **Créer un rôle**.

1. Pour **Type d’entité de confiance**, choisissez **Service AWS **.

1. Pour **Cas d’utilisation**, choisissez **Lambda**.

1. Choisissez **Suivant**.

1. Ajoutez une stratégie d’autorisations de base au rôle en procédant comme suit :

   1. Dans le champ de recherche **Politiques d’autorisations**, saisissez **AWSLambdaBasicExecutionRole**.

   1. Choisissez **Suivant**.

1. Finalisez la création du rôle en procédant comme suit :

   1. Sous **Détails du rôle**, saisissez **lambda-sns-role** pour **Nom du rôle**.

   1. Choisissez **Créer un rôle**.

## Créer une fonction Lambda (compte B)
<a name="with-sns-example-create-test-function"></a>

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_3.png)


Créez une fonction Lambda qui traite vos messages Amazon SNS. Le code de fonction enregistre le contenu des messages de chaque enregistrement dans Amazon CloudWatch Logs.

Ce didacticiel utilise le runtime Node.js 24, mais nous avons également fourni des exemples de code dans d'autres langages d'exécution. Vous pouvez sélectionner l’onglet dans la zone suivante pour voir le code de l’exécution qui vous intéresse. Le JavaScript code que vous allez utiliser dans cette étape se trouve dans le premier exemple présenté dans l'**JavaScript**onglet.

------
#### [ .NET ]

**SDK pour .NET**  
 Il y en a plus à ce sujet GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’[exemples sans serveur](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Consommation d’un événement SNS avec Lambda à l’aide de .NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using Amazon.Lambda.Core;
using Amazon.Lambda.SNSEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace SnsIntegration;

public class Function
{
    public async Task FunctionHandler(SNSEvent evnt, ILambdaContext context)
    {
        foreach (var record in evnt.Records)
        {
            await ProcessRecordAsync(record, context);
        }
        context.Logger.LogInformation("done");
    }

    private async Task ProcessRecordAsync(SNSEvent.SNSRecord record, ILambdaContext context)
    {
        try
        {
            context.Logger.LogInformation($"Processed record {record.Sns.Message}");

            // TODO: Do interesting work based on the new message
            await Task.CompletedTask;
        }
        catch (Exception e)
        {
            //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ.
            context.Logger.LogError($"An error occurred");
            throw;
        }
    }
}
```

------
#### [ Go ]

**Kit SDK pour Go V2**  
 Il y en a plus à ce sujet GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’[exemples sans serveur](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Consommation d’un événement SNS avec Lambda à l’aide de Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"fmt"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, snsEvent events.SNSEvent) {
	for _, record := range snsEvent.Records {
		processMessage(record)
	}
	fmt.Println("done")
}

func processMessage(record events.SNSEventRecord) {
	message := record.SNS.Message
	fmt.Printf("Processed message: %s\n", message)
	// TODO: Process your record here
}

func main() {
	lambda.Start(handler)
}
```

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

**SDK pour Java 2.x**  
 Il y en a plus à ce sujet GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’[exemples sans serveur](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Consommation d’un événement SNS avec Lambda à l’aide de Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.SNSEvent;
import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord;


import java.util.Iterator;
import java.util.List;

public class SNSEventHandler implements RequestHandler<SNSEvent, Boolean> {
    LambdaLogger logger;

    @Override
    public Boolean handleRequest(SNSEvent event, Context context) {
        logger = context.getLogger();
        List<SNSRecord> records = event.getRecords();
        if (!records.isEmpty()) {
            Iterator<SNSRecord> recordsIter = records.iterator();
            while (recordsIter.hasNext()) {
                processRecord(recordsIter.next());
            }
        }
        return Boolean.TRUE;
    }

    public void processRecord(SNSRecord record) {
        try {
            String message = record.getSNS().getMessage();
            logger.log("message: " + message);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
```

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

**SDK pour JavaScript (v3)**  
 Il y en a plus à ce sujet GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’[exemples sans serveur](https://github.com/aws-samples/serverless-snippets/blob/main/integration-sns-to-lambda). 
Consommation d'un événement SNS avec JavaScript Lambda en utilisant.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const record of event.Records) {
    await processMessageAsync(record);
  }
  console.info("done");
};

async function processMessageAsync(record) {
  try {
    const message = JSON.stringify(record.Sns.Message);
    console.log(`Processed message ${message}`);
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```
Consommation d'un événement SNS avec TypeScript Lambda en utilisant.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { SNSEvent, Context, SNSHandler, SNSEventRecord } from "aws-lambda";

export const functionHandler: SNSHandler = async (
  event: SNSEvent,
  context: Context
): Promise<void> => {
  for (const record of event.Records) {
    await processMessageAsync(record);
  }
  console.info("done");
};

async function processMessageAsync(record: SNSEventRecord): Promise<any> {
  try {
    const message: string = JSON.stringify(record.Sns.Message);
    console.log(`Processed message ${message}`);
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```

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

**Kit SDK pour PHP**  
 Il y en a plus à ce sujet GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’[exemples sans serveur](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Utilisation d’un événement SNS avec Lambda à l’aide de PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

/* 
Since native PHP support for AWS Lambda is not available, we are utilizing Bref's PHP functions runtime for AWS Lambda.
For more information on Bref's PHP runtime for Lambda, refer to: https://bref.sh/docs/runtimes/function

Another approach would be to create a custom runtime. 
A practical example can be found here: https://aws.amazon.com/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example/
*/

// Additional composer packages may be required when using Bref or any other PHP functions runtime.
// require __DIR__ . '/vendor/autoload.php';

use Bref\Context\Context;
use Bref\Event\Sns\SnsEvent;
use Bref\Event\Sns\SnsHandler;

class Handler extends SnsHandler
{
    public function handleSns(SnsEvent $event, Context $context): void
    {
        foreach ($event->getRecords() as $record) {
            $message = $record->getMessage();

            // TODO: Implement your custom processing logic here
            // Any exception thrown will be logged and the invocation will be marked as failed

            echo "Processed Message: $message" . PHP_EOL;
        }
    }
}

return new Handler();
```

------
#### [ Python ]

**Kit SDK for Python (Boto3)**  
 Il y en a plus à ce sujet GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’[exemples sans serveur](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Utilisation d’un événement SNS avec Lambda à l’aide de Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event, context):
    for record in event['Records']:
        process_message(record)
    print("done")

def process_message(record):
    try:
        message = record['Sns']['Message']
        print(f"Processed message {message}")
        # TODO; Process your record here
        
    except Exception as e:
        print("An error occurred")
        raise e
```

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

**Kit SDK pour Ruby**  
 Il y en a plus à ce sujet GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’[exemples sans serveur](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Consommation d’un événement SNS avec Lambda à l’aide de Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event:, context:)
  event['Records'].map { |record| process_message(record) }
end

def process_message(record)
  message = record['Sns']['Message']
  puts("Processing message: #{message}")
rescue StandardError => e
  puts("Error processing message: #{e}")
  raise
end
```

------
#### [ Rust ]

**SDK pour Rust**  
 Il y en a plus à ce sujet GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’[exemples sans serveur](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Utilisation d’un événement S3 avec Lambda à l’aide de Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::sns::SnsEvent;
use aws_lambda_events::sns::SnsRecord;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};
use tracing::info;

// Built with the following dependencies:
//  aws_lambda_events = { version = "0.10.0", default-features = false, features = ["sns"] }
//  lambda_runtime = "0.8.1"
//  tokio = { version = "1", features = ["macros"] }
//  tracing = { version = "0.1", features = ["log"] }
//  tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] }

async fn function_handler(event: LambdaEvent<SnsEvent>) -> Result<(), Error> {
    for event in event.payload.records {
        process_record(&event)?;
    }
    
    Ok(())
}

fn process_record(record: &SnsRecord) -> Result<(), Error> {
    info!("Processing SNS Message: {}", record.sns.message);

    // Implement your record handling code here.

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        .with_target(false)
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**Pour créer la fonction**

1. Créez un répertoire pour le projet, puis passez à ce répertoire.

   ```
   mkdir sns-tutorial
   cd sns-tutorial
   ```

1. Copiez l'exemple de JavaScript code dans un nouveau fichier nommé`index.js`.

1. Créez un package de déploiement à l’aide de la commande `zip` suivante.

   ```
   zip function.zip index.js
   ```

1. Exécutez la AWS CLI commande suivante pour créer votre fonction Lambda dans le **compte B.**

   ```
   aws lambda create-function --function-name Function-With-SNS \
       --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
       --role arn:aws:iam::<AccountB_ID>:role/lambda-sns-role  \
       --timeout 60 --profile accountB
   ```

   Vous devez visualiser des résultats similaires à ce qui suit.

   ```
   {
       "FunctionName": "Function-With-SNS",
       "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:Function-With-SNS",
       "Runtime": "nodejs24.x",
       "Role": "arn:aws:iam::123456789012:role/lambda_basic_role",
       "Handler": "index.handler",
       ...
       "RuntimeVersionConfig": {
           "RuntimeVersionArn": "arn:aws:lambda:us-west-2::runtime:7d5f06b69c951da8a48b926ce280a9daf2e8bb1a74fc4a2672580c787d608206"
       }
   }
   ```

1. Enregistrez l’Amazon Resource Name (ARN) de votre fonction. Vous en aurez besoin plus tard dans le tutoriel lorsque vous ajouterez les autorisations permettant à Amazon SNS d’invoquer votre fonction.

## Ajouter des autorisations à la fonction (compte B)
<a name="with-sns-create-function-permissions"></a>

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_4.png)


Pour qu’Amazon SNS puisse invoquer votre fonction, vous devez lui accorder une autorisation dans une instruction sur une [stratégie basée sur les ressources](access-control-resource-based.md). Vous ajoutez cette instruction à l'aide de la AWS CLI `add-permission` commande.

**Pour accorder à Amazon SNS l’autorisation d’invoquer votre fonction**
+ Dans le **compte B**, exécutez la AWS CLI commande suivante en utilisant l'ARN de votre rubrique Amazon SNS que vous avez enregistrée précédemment.

  ```
  aws lambda add-permission --function-name Function-With-SNS \
      --source-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
      --statement-id function-with-sns --action "lambda:InvokeFunction" \
      --principal sns.amazonaws.com --profile accountB
  ```

  Vous devez visualiser des résultats similaires à ce qui suit.

  ```
  {
      "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":
        \"arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda\"}},
        \"Action\":[\"lambda:InvokeFunction\"],
        \"Resource\":\"arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS\",
        \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},
        \"Sid\":\"function-with-sns\"}"
  }
  ```

**Note**  
Si le compte associé à la rubrique Amazon SNS est hébergé dans le cadre d'un [opt-in Région AWS](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html), vous devez spécifier la région dans le principal. Si vous travaillez par exemple avec une rubrique Amazon SNS dans la région Asie-Pacifique (Hong Kong), vous devez spécifier `sns.ap-east-1.amazonaws.com` au lieu de `sns.amazonaws.com` pour le principal. 

## Accorder une autorisation multicompte pour l’abonnement Amazon SNS (compte A)
<a name="with-sns-subscription-grant-permission"></a>

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_5.png)


Pour que votre fonction Lambda dans le **compte B** s’abonne à la rubrique Amazon SNS que vous avez créée dans le **compte A**, vous devez accorder l’autorisation au **compte B** de s’abonner à votre rubrique. Vous accordez cette autorisation à l'aide de la AWS CLI `add-permission` commande. 

**Pour accorder l’autorisation permettant au compte B de s’abonner à la rubrique**
+ Dans le **compte A**, exécutez la AWS CLI commande suivante. Utilisez l’ARN pour la rubrique Amazon SNS que vous avez enregistrée précédemment.

  ```
  aws sns add-permission --label lambda-access --aws-account-id <AccountB_ID> \
      --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \  
      --action-name Subscribe ListSubscriptionsByTopic --profile accountA
  ```

## Créer un abonnement (compte B)
<a name="with-sns-create-subscription"></a>

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_6.png)


Dans le **compte B**, vous abonnez à présent votre fonction Lambda à la rubrique Amazon SNS que vous avez créée au début du tutoriel dans le **compte A**. Lorsqu’un message est envoyé à cette rubrique (`sns-topic-for-lambda`), Amazon SNS invoque votre fonction Lambda `Function-With-SNS` dans le **compte B**. 

**Pour créer un abonnement**
+ Dans le **compte B**, exécutez la AWS CLI commande suivante. Utilisez la région par défaut dans laquelle vous avez créé votre sujet, ainsi que la région ARNs correspondant à votre sujet et la fonction Lambda.

  ```
  aws sns subscribe --protocol lambda \
      --region us-east-1 \
      --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
      --notification-endpoint arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS \
      --profile accountB
  ```

  Vous devez visualiser des résultats similaires à ce qui suit.

  ```
  {
      "SubscriptionArn": "arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx"
  }
  ```

## Publier des messages sur la rubrique (compte A et compte B)
<a name="with-sns-publish-message"></a>

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_7.png)


Maintenant que votre fonction Lambda dans le **compte B** est abonnée à votre rubrique Amazon SNS dans le **compte A**, il est temps de tester votre configuration en publiant des messages sur votre rubrique. Pour vérifier qu'Amazon SNS a invoqué votre fonction Lambda, utilisez CloudWatch Logs pour afficher le résultat de votre fonction.

**Pour publier un message sur votre rubrique et consulter le résultat de votre fonction**

1. Saisissez `Hello World` dans un fichier texte et enregistrez-le sous `message.txt`.

1. À partir du répertoire dans lequel vous avez enregistré votre fichier texte, exécutez la AWS CLI commande suivante dans le **compte A.** Utilisez l'ARN pour votre propre sujet.

   ```
   aws sns publish --message file://message.txt --subject Test \
       --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
       --profile accountA
   ```

   Cette commande renverra un ID de message avec un identifiant unique, indiquant qu’Amazon SNS a accepté le message. Amazon SNS tente alors de livrer le message aux abonnés de la rubrique. Pour vérifier qu'Amazon SNS a invoqué votre fonction Lambda, utilisez CloudWatch Logs pour afficher le résultat de votre fonction :

1. Dans le **compte B**, ouvrez la page [Log groups](https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups) de la CloudWatch console Amazon.

1. Choisissez le groupe de journaux de votre fonction (`/aws/lambda/Function-With-SNS`).

1. Choisissez le flux de journaux le plus récent.

1. Si votre fonction a été correctement invoquée, vous verrez une sortie similaire à la suivante montrant le contenu du message que vous avez publié dans votre rubrique.

   ```
   2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO Processed message Hello World
   2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO done
   ```

## Nettoyage de vos ressources
<a name="cleanup"></a>

Vous pouvez maintenant supprimer les ressources que vous avez créées pour ce didacticiel, sauf si vous souhaitez les conserver. En supprimant AWS les ressources que vous n'utilisez plus, vous évitez des frais inutiles pour votre Compte AWS.

Dans le **compte A**, nettoyez votre rubrique Amazon SNS.

**Pour supprimer la rubrique Amazon SNS**

1. Ouvrez la page [Topics (Rubriques)](https://console.aws.amazon.com//sns/home#topics:) de la console Amazon SNS.

1. Sélectionnez la rubrique que vous avez créée.

1. Choisissez **Supprimer**.

1. Saisissez **delete me** dans le champ de saisie de texte.

1. Sélectionnez **Delete (Supprimer)**.

Dans le **compte A**, nettoyez votre rôle d’exécution, votre fonction Lambda et votre abonnement Amazon SNS.

**Pour supprimer le rôle d’exécution**

1. Ouvrez la [page Roles (Rôles)](https://console.aws.amazon.com/iam/home#/roles) de la console IAM.

1. Sélectionnez le rôle d’exécution que vous avez créé.

1. Sélectionnez **Delete (Supprimer)**.

1. Saisissez le nom du rôle dans le champ de saisie de texte et choisissez **Delete** (Supprimer).

**Pour supprimer la fonction Lambda**

1. Ouvrez la [page Functions (Fonctions)](https://console.aws.amazon.com/lambda/home#/functions) de la console Lambda.

1. Sélectionnez la fonction que vous avez créée.

1. Sélectionnez **Actions**, **Supprimer**.

1. Saisissez **confirm** dans la zone de saisie de texte et choisissez **Delete** (Supprimer).

**Pour supprimer l’abonnement Amazon SNS**

1. Ouvrez la [page Subscriptions (Abonnements)](https://console.aws.amazon.com//sns/home#subscriptions:) de la console Amazon SNS.

1. Sélectionnez l’abonnement que vous avez créé.

1. Choisissez **Delete (Supprimer)**, **Delete (Supprimer)**.