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.
Didacticiel : Utilisation d’AWS Lambda avec Amazon Simple Notification Service
Dans ce tutoriel, vous allez utiliser une fonction Lambda dans une Compte AWS pour vous abonner à une rubrique Amazon Simple Notification Service (Amazon SNS) dans un Compte AWS différent. Lorsque vous publiez des messages dans votre rubrique Amazon SNS, votre fonction Lambda lit le contenu du message et le transmet à Amazon CloudWatch Logs. Pour suivre ce tutoriel, vous utilisez l’AWS Command Line Interface (AWS CLI).
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 dans la rubrique Amazon SNS dans le compte A et confirmez que la fonction Lambda dans le compte B les transmet à CloudWatch Logs.
En suivant ces étapes, vous apprendrez à configurer une rubrique Amazon SNS pour invoquer une fonction Lambda. Vous apprendrez également comment créer une politique AWS Identity and Access Management (IAM) qui autorise l’utilisation d’une ressource dans un autre Compte AWS pour invoquer Lambda.
Dans le tutoriel, vous utilisez deux Comptes AWS différents. Les commandes AWS CLI illustrent cela en utilisant deux profils nommés accountA
et accountB
, chacun configuré pour être utilisé avec un Compte AWS différent. Pour savoir comment configurer l’AWS CLI pour utiliser différents profils, consultez Paramètres du fichier de configuration et d’informations d’identification dans le Guide de l’utilisateur AWS Command Line Interface pour la version 2. Assurez-vous de configurer la même Région AWS par défaut pour les deux profils.
Si les profils AWS CLI 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 commandes AWS CLI dans les étapes suivantes si nécessaire.
Prérequis
Si vous n‘avez pas de compte Compte AWS, procédez comme suit pour en créer un.
Pour s‘inscrire à un Compte AWS
Ouvrez https://portal.aws.amazon.com/billing/signup
. Suivez les instructions en ligne.
Dans le cadre de la procédure d‘inscription, vous recevrez un appel téléphonique et vous saisirez un code de vérification en utilisant le clavier numérique du téléphone.
Lorsque vous souscrivez à un Compte AWS, un Utilisateur racine d'un compte AWS est créé. Par défaut, seul l‘utilisateur racine a accès à l‘ensemble des Services AWS et des ressources de ce compte. La meilleure pratique de sécurité consiste à attribuer un accès administratif à un utilisateur, et à utiliser uniquement l‘utilisateur racine pour effectuer les tâches nécessitant un accès utilisateur racine.
AWS vous envoie un e-mail de confirmation lorsque le processus d‘inscription est terminé. Vous pouvez afficher l‘activité en cours de votre compte et gérer votre compte à tout moment en accédant à https://aws.amazon.com/
Une fois que vous vous êtes inscrit à un Compte AWS, sécurisez l’Utilisateur racine d'un compte AWS, activez AWS IAM Identity Center et créez un utilisateur administratif afin de ne pas utiliser l’utilisateur root pour les tâches quotidiennes.
Sécurisation de votre Utilisateur racine d'un compte AWS
-
Connectez-vous à la AWS Management Console
en tant que propriétaire du compte en sélectionnant Root user (Utilisateur racine) et en saisissant votre adresse e-mail Compte AWS. Sur la page suivante, saisissez votre mot de passe. Pour obtenir de l‘aide pour vous connecter en utilisant l‘utilisateur racine, consultez Connexion en tant qu‘utilisateur racine dans le Guide de l‘utilisateur Connexion à AWS.
-
Activez l‘authentification multifactorielle (MFA) pour votre utilisateur racine.
Pour obtenir des instructions, consultez Activation d‘un dispositif MFA virtuel pour l‘utilisateur racine de votre Compte AWS (console) dans le Guide de l‘utilisateur IAM.
Création d’un utilisateur doté d’un accès administratif
-
Activez IAM Identity Center.
Pour obtenir des instructions, consultez Activation d’AWS IAM Identity Center dans le Guide de l’utilisateur AWS IAM Identity Center.
-
Dans IAM Identity Center, octroyez un accès administratif à un utilisateur.
Pour un didacticiel sur l’utilisation de l’Répertoire IAM Identity Center comme source d’identité, consultez Configuration de l’accès utilisateur avec l’Répertoire IAM Identity Center par défaut dans le Guide de l’utilisateur AWS IAM Identity Center.
Connexion en tant qu‘utilisateur doté d’un accès administratif
-
Pour vous connecter avec votre utilisateur IAM Identity Center, utilisez l‘URL de connexion qui a été envoyée à votre adresse e-mail lorsque vous avez créé l‘utilisateur IAM Identity Center.
Pour obtenir de l‘aide pour vous connecter à l‘aide d‘un utilisateur IAM Identity Center, consultez Connexion au portail d‘accès AWS dans le Guide de l‘utilisateur Connexion à AWS.
Attribution d’un accès à d’autres utilisateurs
-
Dans IAM Identity Center, créez un ensemble d’autorisations qui respecte la bonne pratique consistant à appliquer les autorisations de moindre privilège.
Pour obtenir des instructions, consultez Création d’un ensemble d’autorisations dans le Guide de l’utilisateur AWS IAM Identity Center.
-
Attribuez des utilisateurs à un groupe, puis attribuez un accès par authentification unique au groupe.
Pour obtenir des instructions, consultez Ajout de groupes dans le Guide de l’utilisateur AWS IAM Identity Center.
Si vous n’avez pas encore installé le AWS Command Line Interface, suivez les étapes de la rubrique Installation ou mise à jour de la dernière version de la AWS CLI pour l’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
Créer une rubrique Amazon SNS (compte A)
Pour créer la rubrique
-
Dans le compte A, créez une rubrique standard Amazon SNS à l’aide de la commande AWS CLI suivante.
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)
Le rôle d’exécution est un rôle IAM qui accorde à la fonction Lambda l’autorisation d’accéder aux Services AWS et aux ressources. Avant de créer votre fonction dans le compte B, vous créez 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
-
Dans le compte B, ouvrez la page des rôles
dans la console IAM. -
Sélectionnez Créer un rôle.
-
Pour Type d’entité de confiance, choisissez Service AWS.
-
Pour Cas d’utilisation, choisissez Lambda.
-
Choisissez Suivant.
-
Ajoutez une stratégie d’autorisations de base au rôle en procédant comme suit :
-
Dans le champ de recherche Politiques d’autorisations, saisissez
AWSLambdaBasicExecutionRole
. -
Choisissez Suivant.
-
-
Finalisez la création du rôle en procédant comme suit :
-
Sous Détails du rôle, saisissez
lambda-sns-role
pour Nom du rôle. -
Sélectionnez Créer un rôle.
-
Créer une fonction Lambda (compte B)
Créez une fonction Lambda qui traite vos messages Amazon SNS. Le code de la fonction enregistre le contenu du message de chaque enregistrement dans Amazon CloudWatch Logs.
Ce didacticiel utilise l’exécution Node.js 18.x, 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 code JavaScript que vous allez utiliser dans cette étape se trouve dans le premier exemple affiché dans l’onglet JavaScript.
Pour créer la fonction
-
Créez un répertoire pour le projet, puis passez à ce répertoire.
mkdir sns-tutorial cd sns-tutorial
-
Copiez l’exemple de code JavaScript dans un nouveau fichier nommé
index.js
. -
Créez un package de déploiement à l’aide de la commande
zip
suivante.zip function.zip index.js
-
Exécutez la commande AWS CLI 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 nodejs18.x \ --role arn:aws:iam::
<AccountB_ID>
:role/lambda-sns-role \ --timeout 60 --profile accountBVous 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": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda_basic_role", "Handler": "index.handler", ... "RuntimeVersionConfig": { "RuntimeVersionArn": "arn:aws:lambda:us-west-2::runtime:7d5f06b69c951da8a48b926ce280a9daf2e8bb1a74fc4a2672580c787d608206" } }
-
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)
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. Vous ajoutez cette instruction à l’aide de la commande AWS CLI add-permission
.
Pour accorder à Amazon SNS l’autorisation d’invoquer votre fonction
-
Dans le compte B, exécutez la commande AWS CLI suivante 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 accountBVous 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 avec la rubrique Amazon SNS est hébergé dans une Région AWS d’abonnement, 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)
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 commande AWS CLI add-permission
.
Pour accorder l’autorisation permettant au compte B de s’abonner à la rubrique
-
Dans le compte A, exécutez la commande AWS CLI 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)
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 commande AWS CLI suivante. Utilisez la région par défaut dans laquelle vous avez créé votre rubrique et les ARN de votre rubrique et de votre 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 accountBVous 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)
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 confirmer qu’Amazon SNS a invoqué votre fonction Lambda, vous utilisez CloudWatch Logs pour afficher la sortie de votre fonction.
Pour publier un message sur votre rubrique et consulter le résultat de votre fonction
-
Saisissez
Hello World
dans un fichier texte et enregistrez-le sousmessage.txt
. -
À partir du répertoire dans lequel vous avez enregistré votre fichier texte, exécutez la commande AWS CLI suivante dans le compte A. Utilisez l’ARN pour votre propre rubrique.
aws sns publish --message file://message.txt --subject Test \ --topic-arn arn:aws:sns:
us-east-1:<AccountA_ID>
:sns-topic-for-lambda \ --profile accountACette 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 confirmer qu’Amazon SNS a invoqué votre fonction Lambda, utilisez CloudWatch Logs pour afficher la sortie de votre fonction :
-
Dans le compte B, ouvrez la page Groupes de journaux
de la console Amazon CloudWatch. -
Choisissez le groupe de journaux de votre fonction (
/aws/lambda/Function-With-SNS
). -
Choisissez le flux de journaux le plus récent.
-
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
Vous pouvez maintenant supprimer les ressources que vous avez créées pour ce didacticiel, sauf si vous souhaitez les conserver. En supprimant des ressources AWS que vous n’utilisez plus, vous évitez les frais superflus pour votre Compte AWS.
Dans le compte A, nettoyez votre rubrique Amazon SNS.
Pour supprimer la rubrique Amazon SNS
-
Ouvrez la page Topics (Rubriques)
de la console Amazon SNS. -
Sélectionnez la rubrique que vous avez créée.
-
Sélectionnez Delete (Supprimer).
-
Saisissez
delete me
dans le champ de saisie de texte. -
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
-
Ouvrez la page Roles (Rôles)
de la console IAM. -
Sélectionnez le rôle d’exécution que vous avez créé.
-
Sélectionnez Delete (Supprimer).
-
Saisissez le nom du rôle dans le champ de saisie de texte et choisissez Delete (Supprimer).
Pour supprimer la fonction Lambda
-
Ouvrez la page Functions (Fonctions)
de la console Lambda. -
Sélectionnez la fonction que vous avez créée.
-
Sélectionnez Actions, Supprimer.
-
Saisissez
delete
dans la zone de saisie de texte et choisissez Delete (Supprimer).
Pour supprimer l’abonnement Amazon SNS
-
Ouvrez la page Subscriptions (Abonnements)
de la console Amazon SNS. -
Sélectionnez l’abonnement que vous avez créé.
-
Choisissez Delete (Supprimer), Delete (Supprimer).