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.
Au cours de ce didacticiel, vous allez créer une application de diffusion sans serveur avec une API WebSocket. Les clients peuvent recevoir des messages sans avoir à rechercher les mises à jour.
Ce didacticiel explique comment diffuser des messages aux clients connectés et inclut un exemple de mécanisme d’autorisation Lambda, une intégration simulée et une intégration sans proxy avec Step Functions.

Après avoir créé vos ressources à l’aide d’un modèle AWS CloudFormation, vous devez utiliser la console API Gateway pour créer une API WebSocket qui s’intègre avec vos ressources AWS. Vous devez attacher un mécanisme d’autorisation Lambda à votre API et créer une intégration de service AWS avec Step Functions pour lancer l’exécution d’une machine d’état. La machine d’état Step Functions invoquera une fonction Lambda qui enverra un message à tous les clients connectés.
Après avoir créé votre API, vous devez tester votre connexion à votre API et vérifier que les messages sont bien envoyés et reçus. Ce didacticiel vous prendra environ 45 minutes.
Prérequis
Vous avez besoin des prérequis suivants :
-
Un compte AWS et un utilisateur AWS Identity and Access Management ayant accès à la console. Pour en savoir plus, consultez Configuration d’API Gateway avant son utilisation.
-
wscat
pour vous connecter à votre API. Pour en savoir plus, consultez wscatÀ utiliser pour se connecter à une WebSocket API et y envoyer des messages.
Nous vous recommandons de suivre le didacticiel sur l’application de chat WebSocket avant de commencer celui-ci. Pour effectuer le didacticiel de l’application de chat WebSocket, consultez Didacticiel : création d’une application de chat WebSocket avec une API WebSocket, Lambda et DynamoDB.
Étape 1 : créer les ressources
Téléchargez et décompressez le modèle de création d’application pour AWS CloudFormation. Vous allez utiliser ce modèle pour créer les éléments suivants :
Fonctions Lambda qui gèrent les demandes d’API et autorisent l’accès à votre API.
Table DynamoDB pour stocker les ID des clients et l’identifiant de l’utilisateur principal renvoyés par le mécanisme d’autorisation Lambda.
Machine d’état Step Functions pour envoyer des messages aux clients connectés.
Pour créer une pile AWS CloudFormation
Ouvrez la console AWS CloudFormation, à l’adresse https://console.aws.amazon.com/cloudformation
. -
Choisissez Créer une pile, puis choisissez Avec de nouvelles ressources (standard).
-
Dans Spécifier le modèle, choisissez Charger un modèle de fichier.
-
Sélectionnez le modèle que vous avez téléchargé.
-
Choisissez Suivant.
-
Pour Nom de la pile, saisissez
websocket-step-functions-tutorial
, puis choisissez Suivant. -
Pour Configurer les options de pile, choisissez Suivant.
-
Pour Capacités, sachez que AWS CloudFormation peut créer des ressources IAM dans votre compte.
-
Sélectionnez Envoyer.
AWS CloudFormation fournit les ressources spécifiées dans le modèle. La fin du provisionnement de vos ressources peut prendre quelques minutes. Choisissez l’onglet Sorties pour voir les ressources que vous avez créées et leurs ARN. Lorsque le statut de votre pile AWS CloudFormation est CREATE_COMPLETE, vous êtes prêt à passer à l’étape suivante.
Étape 2 : créer une API WebSocket
Vous allez créer une API WebSocket pour gérer les connexions des clients et acheminer les requêtes aux fonctions Lambda créées à l’étape 1.
Pour créer une API WebSocket
Connectez-vous à la console API Gateway à l’adresse : https://console.aws.amazon.com/apigateway
. Sélectionnez Create API (Créer une API). Ensuite, sous WebSocket API (API WebSocket), choisissez Build (Créer).
Sous API name (Nom de l’API), saisissez
websocket-step-functions-tutorial
.Pour Route selection expression (Expression de sélection de route), entrez
request.body.action
.Expression de sélection de route pour déterminer la route à appeler lorsqu’un client envoie un message.
Choisissez Suivant.
Pour Routages prédéfinis, choisissez Ajouter $connect, Ajouter $disconnect et Ajouter $default.
Les routes $connect et $disconnect sont des itinéraires spéciaux qu’API Gateway appelle automatiquement lorsqu’un client se connecte à une API ou se déconnecte de celle-ci. API Gateway invoque la route $default lorsqu’aucune autre route ne correspond à une demande. Vous devez créer une route personnalisée pour vous connecter à Step Functions après avoir créé votre API.
Choisissez Suivant.
Pour Intégration de $connect, procédez comme suit :
Pour Type d’intégration, choisissez Lambda.
-
Pour Fonction Lambda, choisissez la fonction Lambda $connect que vous avez créée avec AWS CloudFormation à l’étape 1. Le nom de la fonction Lambda doit commencer par
websocket-step
.
Pour Intégration de $disconnect, procédez comme suit :
Pour Type d’intégration, choisissez Lambda.
-
Pour Fonction Lambda, choisissez la fonction Lambda $disconnect que vous avez créée avec AWS CloudFormation à l’étape 1. Le nom de la fonction Lambda doit commencer par
websocket-step
.
Pour Intégration de $default, choisissez Mock.
Dans une intégration simulée, API Gateway gère la réponse de routage sans backend d’intégration.
Choisissez Suivant.
-
Passez en revue l’étape créée par API Gateway pour vous. Par défaut, API Gateway crée une étape nommée production et déploie automatiquement votre API dans cette étape. Choisissez Suivant.
Choisissez Create and deploy (Créer et déployer).
Étape 3 : créer un mécanisme d’autorisation Lambda
Pour contrôler l’accès à votre API WebSocket, vous devez créer un mécanisme d’autorisation Lambda. Le modèle AWS CloudFormation a créé la fonction du mécanisme d’autorisation Lambda pour vous. Vous pouvez voir la fonction Lambda dans la console Lambda. Son nom doit commencer par websocket-step-functions-tutorial-AuthorizerHandler
. Cette fonction Lambda refuse tous les appels à destination de l’API WebSocket, sauf si l’en-tête Authorization
est Allow
. La fonction Lambda transmet également la variable $context.authorizer.principalId
à votre API, qui est ensuite utilisée dans la table DynamoDB pour identifier les appelants d’API.
Au cours de cette étape, vous allez configurer la route $connect pour utiliser le mécanisme d’autorisation Lambda.
Pour créer un mécanisme d’autorisation Lambda
Connectez-vous à la console API Gateway à l’adresse : https://console.aws.amazon.com/apigateway
. Dans le panneau de navigation principal, choisissez Mécanismes d’autorisation.
Choisissez Créer un mécanisme d’autorisation.
Pour Nom du mécanisme d’autorisation, saisissez
LambdaAuthorizer
.Pour ARN du mécanisme d’autorisation, saisissez le nom du mécanisme d’autorisation créé par le modèle AWS CloudFormation. Son nom doit commencer par
websocket-step-functions-tutorial-AuthorizerHandler
.Note
Nous vous recommandons de ne pas utiliser cet exemple de mécanisme d’autorisation pour vos API de production.
Pour Type de source d’identité, choisissez En-tête. Pour Key (Clé), saisissez
Authorization
.Choisissez Créer un mécanisme d’autorisation.
Après avoir créé votre mécanisme d’autorisation, vous devez l’attacher à la route $connect de votre API.
Pour attacher un mécanisme d’autorisation à la route $connect
Dans le volet de navigation principal, sélectionnez Routes.
Choisissez la route $connect.
Dans la section Paramètres de requête de routage, choisissez Modifier.
Pour Autorisation, sélectionnez le menu déroulant, puis votre mécanisme d’autorisation de requête.
Sélectionnez Enregistrer les modifications.
Étape 4 : créer une intégration bidirectionnelle simulée
Vous allez ensuite créer l’intégration bidirectionnelle simulée pour la route $default. Une intégration simulée vous permet d’envoyer une réponse au client sans utiliser de backend. Lorsque vous créez une intégration pour la route $default, vous pouvez montrer aux clients comment interagir avec votre API.
Vous devez configurer la route $default pour indiquer aux clients d’utiliser la route sendmessage.
Pour créer une intégration simulée
Connectez-vous à la console API Gateway à l’adresse : https://console.aws.amazon.com/apigateway
. Choisissez la route $default, puis l’onglet Requête d’intégration.
Pour Modèles de requête, choisissez Modifier.
Pour Expression de sélection de modèle, saisissez
200
, puis choisissez Modifier.Dans l’onglet Requête d’intégration, pour Modèles de requête, choisissez Créer un modèle.
Pour Clé de modèle, saisissez
200
.Pour Générer un modèle, saisissez le modèle de mappage suivant :
{"statusCode": 200}
Sélectionnez Create template (Créer un modèle).
Le résultat doit avoir l’aspect suivant :
Dans le volet Route $default, choisissez Activer la communication bidirectionnelle.
Choisissez l’onglet Réponse d’intégration, puis sélectionnez Créer une réponse d’intégration.
Pour Clé de réponse, saisissez
$default
.Pour Expression de sélection de modèle, saisissez
200
.Choisissez Créer une réponse.
Sous Modèles de réponse, choisissez Créer un modèle.
Pour Clé de modèle, saisissez
200
.Pour Modèle de réponse, saisissez le modèle de mappage suivant :
{"Use the sendmessage route to send a message. Connection ID: $context.connectionId"}
Sélectionnez Create template (Créer un modèle).
Le résultat doit avoir l’aspect suivant :
Étape 5 : créer une intégration sans proxy avec Step Functions
Vous allez ensuite créer une route sendmessage. Les clients peuvent invoquer la route sendmessage pour diffuser un message à tous les clients connectés. La route sendmessage dispose d’une intégration de service AWS sans proxy avec AWS Step Functions. L’intégration invoque la commande StartExecution pour la machine d’état Step Functions que le modèle AWS CloudFormation a créée pour vous.
Pour créer une intégration sans proxy
Connectez-vous à la console API Gateway à l’adresse : https://console.aws.amazon.com/apigateway
. Choisissez Create Route (Créer un itinéraire).
Pour Route key (Clé de route), entrez
sendmessage
.Pour Type d’intégration, choisissez Service AWS.
Pour Région AWS, saisissez la région dans laquelle vous avez déployé votre modèle AWS CloudFormation.
Pour Service AWS, choisissez Step Functions.
Dans le champ HTTP Method, sélectionnez POST.
Pour Nom de l’action, saisissez
StartExecution
.Pour Rôle d’exécution, saisissez le rôle d’exécution créé par le modèle AWS CloudFormation. Le nom doit être WebsocketTutorialApiRole.
Choisissez Create Route (Créer un itinéraire).
Vous allez ensuite créer un modèle de mappage pour envoyer les paramètres de requête à la machine d’état Step Functions.
Pour créer un modèle de mappage
Choisissez la route sendmessage, puis l’onglet Requête d’intégration.
Dans la section Modèles de requête, choisissez Modifier.
Pour Expression de sélection de modèle, saisissez
\$default
.Choisissez Modifier.
Dans la section Modèles de requête, choisissez Créer un modèle.
Pour Clé de modèle, saisissez
\$default
.Pour Générer un modèle, saisissez le modèle de mappage suivant :
#set($domain = "$context.domainName") #set($stage = "$context.stage") #set($body = $input.json('$')) #set($getMessage = $util.parseJson($body)) #set($mymessage = $getMessage.message) { "input": "{\"domain\": \"$domain\", \"stage\": \"$stage\", \"message\": \"$mymessage\"}", "stateMachineArn": "arn:aws:states:
us-east-2
:123456789012
:stateMachine:WebSocket-Tutorial-StateMachine" }Remplacez
stateMachineArn
par l’ARN de la machine d’état créé par AWS CloudFormation.Le modèle de mappage :
-
Crée la variable
$domain
à l’aide de la variable contextuelledomainName
. -
Crée la variable
$stage
à l’aide de la variable contextuellestage
.Les variables
$domain
et$stage
sont nécessaires pour créer une URL de rappel. Prend le message JSON
sendmessage
entrant et en extrait la propriétémessage
.-
Crée l’entrée pour la machine d’état. L’entrée correspond au domaine et à l’étape de l’API WebSocket et au message de la route
sendmessage
.
-
-
Sélectionnez Create template (Créer un modèle).
Vous pouvez créer une intégration sans proxy sur la route $connect ou $disconnect, pour ajouter ou supprimer directement un ID de connexion de la table DynamoDB, sans invoquer de fonction Lambda.
Étape 6 : tester votre API
Vous allez ensuite déployer et tester votre API pour vérifier son bon fonctionnement. Vous allez utiliser la commande wscat
pour vous connecter à l’API, puis utiliser une commande slash pour envoyer un ping afin de vérifier la connexion à l’API WebSocket.
Pour déployer votre API
Connectez-vous à la console API Gateway à l’adresse : https://console.aws.amazon.com/apigateway
. Dans le volet de navigation principal, sélectionnez Routes.
Sélectionnez Deploy API (Déployer une API).
Pour Étape, sélectionnez production.
(Facultatif) Pour Description du déploiement, saisissez une description.
Choisissez Deploy (Déployer).
Une fois que vous avez déployé votre API, vous pouvez l’invoquer. Utilisez l’URL d’invocation pour appeler votre API.
Pour obtenir l’URL d’invocation de votre API
Choisissez votre API.
Choisissez Stages (Étapes), puis production.
-
Notez l’URL WebSocket de votre API. L’URL doit ressembler à
wss://
.abcdef123
.execute-api.us-east-2
.amazonaws.com/production
Maintenant que vous disposez de votre URL d’invocation, vous pouvez tester la connexion à votre API WebSocket.
Pour tester la connexion à votre API
Utilisez la commande suivante pour vous connecter à votre API. Tout d’abord, vous allez tester la connexion en invoquant le chemin
/ping
.wscat -c wss://
abcdef123
.execute-api.us-east-2
.amazonaws.com/production -H "Authorization: Allow" --slash -PConnected (press CTRL+C to quit)
-
Saisissez la commande suivante pour effectuer un ping du cadre de contrôle. Vous pouvez utiliser un cadre de contrôle pour le keepalive côté client.
/ping
Le résultat doit avoir l’aspect suivant :
< Received pong (data: "")
Maintenant que vous avez testé la connexion, vous pouvez tester le bon fonctionnement de votre API. Lors de cette étape, vous allez ouvrir une nouvelle fenêtre de terminal afin que l’API WebSocket puisse envoyer un message à tous les clients connectés.
Pour tester votre API
-
Ouvrez un nouveau terminal et exécutez à nouveau la commande
wscat
avec les paramètres suivants.wscat -c wss://
abcdef123
.execute-api.us-east-2
.amazonaws.com/production -H "Authorization: Allow"Connected (press CTRL+C to quit)
-
API Gateway détermine la route à invoquer en fonction de l’expression de sélection de requête de routage de votre API. L’expression de sélection de route de votre API est
$request.body.action
. Par conséquent, API Gateway appelle la routesendmessage
lorsque vous envoyez le message suivant :{"action": "sendmessage", "message": "hello, from Step Functions!"}
La machine d’état Step Functions associée à la route invoque une fonction Lambda avec le message et l’URL de rappel. La fonction Lambda appelle l’API API Gateway Management et envoie le message à tous les clients connectés. Tous les clients reçoivent le message suivant :
< hello, from Step Functions!
Maintenant que vous avez testé votre API WebSocket, vous pouvez vous déconnecter de votre API.
Pour vous déconnecter de votre API
Pour vous déconnecter de votre API, appuyez sur
CTRL+C
.Lorsqu’un client se déconnecte de votre API, API Gateway invoque la route $disconnect de votre API. L’intégration Lambda pour la route $disconnect de votre API supprime l’ID de connexion de DynamoDB.
Étape 7 : nettoyer
Pour éviter des coûts inutiles, supprimez les ressources que vous avez créées dans le cadre de ce didacticiel. Les étapes suivantes suppriment votre pile AWS CloudFormation et votre API WebSocket.
Pour supprimer une API WebSocket
Connectez-vous à la console API Gateway à l’adresse : https://console.aws.amazon.com/apigateway
. Sur la page API, sélectionnez votre websocket-api.
Choisissez Actions, choisissez Supprimer, puis confirmez votre choix.
Pour supprimer une pile AWS CloudFormation
Ouvrez la console AWS CloudFormation, à l’adresse https://console.aws.amazon.com/cloudformation
. -
Sélectionnez votre pile AWS CloudFormation.
-
Choisissez Supprimer, puis confirmez votre choix.
Étapes suivantes
Vous pouvez automatiser la création et le nettoyage de toutes les ressources AWS impliquées dans ce didacticiel. Pour obtenir un exemple de modèle AWS CloudFormation qui automatise ces actions pour ce didacticiel, consultez ws-sfn.zip.