Présentation des tests dans le cloud avec sam remote invoke - AWS Serverless Application Model

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.

Présentation des tests dans le cloud avec sam remote invoke

Utilisez la AWS Serverless Application Model commande Command Line Interface (AWS SAM CLI) sam remote invoke pour interagir avec les AWS ressources prises en charge dans le AWS Cloud. Vous pouvez utiliser sam remote invoke pour appeler les ressources suivantes :

  • Amazon Kinesis Data Streams : envoyez des enregistrements de données aux applications Kinesis Data Streams.

  • AWS Lambda— Invoquez et transmettez des événements à vos fonctions Lambda.

  • Amazon Simple Queue Service (Amazon SQS) — Envoyez des messages aux files d'attente Amazon SQS.

  • AWS Step Functions— Invoquez les machines d'état Step Functions pour démarrer l'exécution.

Pour une introduction à la AWS SAMCLI, voirQu'est-ce que c'est AWS SAMCLI ?.

Pour un exemple d'utilisation de sam remote invoke dans le cadre d'un flux de travail de développement classique, consultez Étape 5 : Interagissez avec votre fonction dans AWS Cloud.

Pour utiliser sam remote invoke, installez la CLI AWS SAM en procédant comme suit :

Nous vous recommandons également de passer à la dernière version du AWS SAMCLI. Pour en savoir plus, veuillez consulter la section Mise à niveau de la CLI  AWS SAM en cours.

Avant d'utiliser sam remote invoke, nous vous recommandons d'avoir des connaissances de base sur les points suivants :

Utilisation de la même commande d'invocation à distance

Avant d'utiliser cette commande, votre ressource doit être déployée sur  AWS Cloud.

Utilisez la structure de commande suivante et exécutez-la à partir du répertoire racine de votre projet :

$ sam remote invoke <arguments> <options>
Note

Cette page affiche les options proposées à l'invite de commande. Vous pouvez également configurer les options dans le fichier de configuration de votre projet au lieu de les transmettre à l'invite de commandes. Pour en savoir plus, consultez Configuration des paramètres de projet.

Pour une description des sam remote invoke arguments et des options, consultezsam remote invoke.

Utilisation avec Kinesis Data Streams

Vous pouvez envoyer des enregistrements de données à une application Kinesis Data Streams. Il AWS SAM CLI enverra votre enregistrement de données et renverra un identifiant de partition et un numéro de séquence. Voici un exemple :

$ sam remote invoke KinesisStream --stack-name kinesis-example --event hello-world Putting record to Kinesis data stream KinesisStream Auto converting value 'hello-world' into JSON '"hello-world"'. If you don't want auto-conversion, please provide a JSON string as event { "ShardId": "shardId-000000000000", "SequenceNumber": "49646251411914806775980850790050483811301135051202232322" }%
Pour envoyer un enregistrement de données
  1. Entrez une valeur d'ID de ressource comme argument pour votre application Kinesis Data Streams. Pour plus d'informations sur les ID de ressource valides, consultez la section Identifiant de ressource.

  2. Fournissez l'enregistrement de données sous forme d'événement à envoyer à votre application Kinesis Data Streams. Vous pouvez fournir l'événement sur la ligne de commande à l'aide de l'--eventoption, ou à partir d'un fichier à l'aide de--event-file. Si vous ne fournissez aucun événement, AWS SAM CLI envoie un événement vide.

Utilisation avec les fonctions Lambda

Vous pouvez appeler une fonction Lambda dans le cloud et transmettre un événement vide ou fournir un événement sur la ligne de commande ou à partir d'un fichier. Il AWS SAM CLI invoquera votre fonction Lambda et renverra sa réponse. Voici un exemple :

$ sam remote invoke HelloWorldFunction --stack-name sam-app Invoking Lambda Function HelloWorldFunction START RequestId: d5ef494b-5f45-4086-86fd-d7322fa1a1f9 Version: $LATEST END RequestId: d5ef494b-5f45-4086-86fd-d7322fa1a1f9 REPORT RequestId: d5ef494b-5f45-4086-86fd-d7322fa1a1f9 Duration: 6.62 ms Billed Duration: 7 ms Memory Size: 128 MB Max Memory Used: 67 MB Init Duration: 164.06 ms {"statusCode":200,"body":"{\"message\":\"hello world\"}"}%
Pour appeler une fonction Lambda
  1. Fournissez une valeur d'ID de ressource comme argument pour votre fonction Lambda. Pour plus d'informations sur les ID de ressource valides, consultez la section Identifiant de ressource.

  2. Fournissez un événement à envoyer à votre fonction Lambda. Vous pouvez fournir l'événement sur la ligne de commande à l'aide de l'--eventoption, ou à partir d'un fichier à l'aide de--event-file. Si vous ne fournissez aucun événement, AWS SAM CLI envoie un événement vide.

Fonctions Lambda configurées avec le streaming de réponses

La commande sam remote invoke prend en charge les fonctions Lambda configurées pour diffuser les réponses. Vous pouvez configurer une fonction Lambda pour diffuser les réponses à l'aide de la FunctionUrlConfig propriété de vos AWS SAM modèles. Lorsque vous utilisez sam remote invoke, la CLI  AWS SAM détecte automatiquement votre configuration Lambda et l'invoque avec le streaming des réponses.

Pour obtenir un exemple, consultez Configuration d'une fonction Lambda pour le streaming des réponses.

Transmettre des événements de test partageables à une fonction Lambda dans le cloud

Les événements de test partageables sont des événements de test que vous pouvez partager avec d'autres personnes dans le même Compte AWS. Pour en savoir plus, consultez la rubrique relative aux événements de test partageables dans le Guide du développeur AWS Lambda .

Accès et gestion des événements de test partageables

Vous pouvez utiliser la AWS SAM CLI sam remote test-event commande pour accéder aux événements de test partageables et les gérer. Par exemple, vous pouvez utiliser sam remote test-event pour effectuer les opérations suivantes :

  • Récupérez les événements de test partageables depuis le registre des EventBridge schémas Amazon.

  • Modifiez les événements de test partageables localement et téléchargez-les dans le registre des EventBridge schémas.

  • Supprimez les événements de test partageables du registre des EventBridge schémas.

Pour en savoir plus, veuillez consulter la section Présentation des tests dans le cloud avec sam remote test-event.

Transmettre un événement de test partageable à une fonction Lambda dans le cloud

Pour transmettre un événement de test partageable du registre de EventBridge schémas à votre fonction Lambda dans le cloud, utilisez l'option et --test-event-name indiquez le nom de l'événement de test partageable. Voici un exemple :

$ sam remote invoke HelloWorldFunction --stack-name sam-app --test-event-name demo-event

Si vous enregistrez l'événement de test partageable localement, vous pouvez utiliser l'option --event-file et fournir le chemin et le nom du fichier de l'événement de test local. Voici un exemple :

$ sam remote invoke HelloWorldFunction --stack-name sam-app --event-file demo-event.json

Utilisation d’ avec Amazon SQS

Vous pouvez envoyer des messages aux files d'attente Amazon SQS. Le résultat AWS SAM CLI renvoie ce qui suit :

  • ID de message

  • MD5 du corps du message

  • Métadonnées de réponse

Voici un exemple :

$ sam remote invoke MySqsQueue --stack-name sqs-example -event hello Sending message to SQS queue MySqsQueue { "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017c592", "MessageId": "05c7af65-9ae8-4014-ae28-809d6d8ec652" }%
Pour envoyer un message
  1. Fournissez une valeur d'ID de ressource comme argument pour la file d'attente Amazon SQS. Pour plus d'informations sur les ID de ressource valides, consultez la section Identifiant de ressource.

  2. Indiquez un événement à envoyer à votre file d'attente Amazon SQS. Vous pouvez fournir l'événement sur la ligne de commande à l'aide de l'--eventoption, ou à partir d'un fichier à l'aide de--event-file. Si vous ne fournissez aucun événement, AWS SAM CLI envoie un événement vide.

Utilisation avec Step Functions

Vous pouvez appeler une machine d'état Step Functions pour démarrer l'exécution. AWS SAM CLIAttendra que le flux de travail de la machine à états soit terminé et renverra un résultat de la dernière étape de l'exécution. Voici un exemple :

$ sam remote invoke HelloWorldStateMachine --stack-name state-machine-example --event '{"is_developer": true}' Invoking Step Function HelloWorldStateMachine "Hello Developer World"%
Pour invoquer une machine à états
  1. Fournissez une valeur d'ID de ressource comme argument pour la machine d'état Step Functions. Pour plus d'informations sur les ID de ressource valides, consultez la section Identifiant de ressource.

  2. Fournissez un événement à envoyer à votre machine d'état. Vous pouvez fournir l'événement sur la ligne de commande à l'aide de l'--eventoption, ou à partir d'un fichier à l'aide de--event-file. Si vous ne fournissez aucun événement, AWS SAM CLI envoie un événement vide.

Utilisation des options de commande Sam Remote Invoke

Cette section décrit certaines des principales options que vous pouvez utiliser avec la sam remote invoke commande. Pour une liste complète des options, voirsam remote invoke.

Transférez un événement à votre ressource

Utilisez les options suivantes pour transmettre des événements à vos ressources dans le cloud :

  • --event— Passez un événement sur la ligne de commande.

  • --event-file— Transmet un événement depuis un fichier.

Exemples Lambda

--eventÀ utiliser pour transmettre un événement sur la ligne de commande sous forme de valeur de chaîne :

$ sam remote invoke HelloWorldFunction --stack-name sam-app --event '{"message": "hello!"}' Invoking Lambda Function HelloWorldFunction START RequestId: b992292d-1fac-4aa2-922a-c9dc5c6fceab Version: $LATEST END RequestId: b992292d-1fac-4aa2-922a-c9dc5c6fceab REPORT RequestId: b992292d-1fac-4aa2-922a-c9dc5c6fceab Duration: 16.41 ms Billed Duration: 17 ms Memory Size: 128 MB Max Memory Used: 67 MB Init Duration: 185.96 ms {"statusCode":200,"body":"{\"message\":\"hello!\"}"}%

--event-fileÀ utiliser pour transmettre un événement depuis un fichier et fournir le chemin d'accès au fichier :

$ cat event.json {"message": "hello from file"}% $ sam remote invoke HelloWorldFunction --stack-name sam-app --event-file event.json Invoking Lambda Function HelloWorldFunction START RequestId: 3bc71f7d-153a-4b1e-8c9a-901d91b1bec9 Version: $LATEST END RequestId: 3bc71f7d-153a-4b1e-8c9a-901d91b1bec9 REPORT RequestId: 3bc71f7d-153a-4b1e-8c9a-901d91b1bec9 Duration: 21.15 ms Billed Duration: 22 ms Memory Size: 128 MB Max Memory Used: 67 MB {"statusCode":200,"body":"{\"message\":\"hello from file\"}"}%

Réussissez un événement en utilisant stdin :

$ cat event.json {"message": "hello from file"}% $ cat event.json | sam remote invoke HelloWorldFunction --stack-name sam-app --event-file - Reading event from stdin (you can also pass it from file with --event-file) Invoking Lambda Function HelloWorldFunction START RequestId: 85ecc902-8ad0-4a2b-a8c8-9bb4f65f5a7a Version: $LATEST END RequestId: 85ecc902-8ad0-4a2b-a8c8-9bb4f65f5a7a REPORT RequestId: 85ecc902-8ad0-4a2b-a8c8-9bb4f65f5a7a Duration: 1.36 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 67 MB {"statusCode":200,"body":"{\"message\":\"hello from file\"}"}%

Configuration de la sortie de AWS SAMCLI réponse

Lorsque vous invoquez une ressource prise en charge avecsam remote invoke, le AWS SAMCLI renvoie une réponse contenant les éléments suivants :

  • Métadonnées de la demande : métadonnées associées à la demande. Cela inclut un ID de demande et l'heure de début de la demande.

  • Réponse de la ressource : réponse de votre ressource après avoir été invoquée dans le cloud.

Vous pouvez utiliser --output cette option pour configurer la réponse AWS SAM CLI de sortie. Les valeurs suivantes sont disponibles avec :

  • json— Les métadonnées et la réponse aux ressources sont renvoyées dans une JSON structure. La réponse contient le résultat complet SDK.

  • text— Les métadonnées sont renvoyées sous forme de structure de texte. La réponse de la ressource est renvoyée dans le format de sortie de la ressource.

Voici un exemple de résultat json :

$ sam remote invoke --stack-name sam-app --output json Invoking Lambda Function HelloWorldFunction { "ResponseMetadata": { "RequestId": "3bdf9a30-776d-4a90-94a6-4cccc0fc7b41", "HTTPStatusCode": 200, "HTTPHeaders": { "date": "Mon, 19 Jun 2023 17:15:46 GMT", "content-type": "application/json", "content-length": "57", "connection": "keep-alive", "x-amzn-requestid": "3bdf9a30-776d-4a90-94a6-4cccc0fc7b41", "x-amzn-remapped-content-length": "0", "x-amz-executed-version": "$LATEST", "x-amz-log-result": "U1RBUlQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEKUkVQT1JUIFJlcXVlc3RJZDogM2JkZjlhMzAtNzc2ZC00YTkwLTk0YTYtNGNjY2MwZmM3YjQxCUR1cmF0aW9uOiA4LjIzIG1zCUJpbGxlZCBEdXJhdGlvbjogOSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjggTUIJCg==", "x-amzn-trace-id": "root=1-64908d42-17dab270273fcc6b527dd6b8;sampled=0;lineage=2301f8dc:0" }, "RetryAttempts": 0 }, "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEKUkVQT1JUIFJlcXVlc3RJZDogM2JkZjlhMzAtNzc2ZC00YTkwLTk0YTYtNGNjY2MwZmM3YjQxCUR1cmF0aW9uOiA4LjIzIG1zCUJpbGxlZCBEdXJhdGlvbjogOSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjggTUIJCg==", "ExecutedVersion": "$LATEST", "Payload": "{\"statusCode\":200,\"body\":\"{\\\"message\\\":\\\"hello world\\\"}\"}" }%

Lorsque vous spécifiez un résultat json, la réponse complète est renvoyée à stdout. Voici un exemple :

$ sam remote invoke --stack-name sam-app --output json 1> stdout.log Invoking Lambda Function HelloWorldFunction $ cat stdout.log { "ResponseMetadata": { "RequestId": "d30d280f-8188-4372-bc94-ce0f1603b6bb", "HTTPStatusCode": 200, "HTTPHeaders": { "date": "Mon, 19 Jun 2023 17:35:56 GMT", "content-type": "application/json", "content-length": "57", "connection": "keep-alive", "x-amzn-requestid": "d30d280f-8188-4372-bc94-ce0f1603b6bb", "x-amzn-remapped-content-length": "0", "x-amz-executed-version": "$LATEST", "x-amz-log-result": "U1RBUlQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIKUkVQT1JUIFJlcXVlc3RJZDogZDMwZDI4MGYtODE4OC00MzcyLWJjOTQtY2UwZjE2MDNiNmJiCUR1cmF0aW9uOiA0LjE2IG1zCUJpbGxlZCBEdXJhdGlvbjogNSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjcgTUIJSW5pdCBEdXJhdGlvbjogMTU4LjM5IG1zCQo=", "x-amzn-trace-id": "root=1-649091fc-771473c7778689627a6122b7;sampled=0;lineage=2301f8dc:0" }, "RetryAttempts": 0 }, "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIKUkVQT1JUIFJlcXVlc3RJZDogZDMwZDI4MGYtODE4OC00MzcyLWJjOTQtY2UwZjE2MDNiNmJiCUR1cmF0aW9uOiA0LjE2IG1zCUJpbGxlZCBEdXJhdGlvbjogNSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjcgTUIJSW5pdCBEdXJhdGlvbjogMTU4LjM5IG1zCQo=", "ExecutedVersion": "$LATEST", "Payload": "{\"statusCode\":200,\"body\":\"{\\\"message\\\":\\\"hello world\\\"}\"}" }%

Voici un exemple de résultat text :

$ sam remote invoke --stack-name sam-app --output text Invoking Lambda Function HelloWorldFunction START RequestId: 4dbacc43-1ec6-47c2-982b-9dc4620144d6 Version: $LATEST END RequestId: 4dbacc43-1ec6-47c2-982b-9dc4620144d6 REPORT RequestId: 4dbacc43-1ec6-47c2-982b-9dc4620144d6 Duration: 9.13 ms Billed Duration: 10 ms Memory Size: 128 MB Max Memory Used: 67 MB Init Duration: 165.50 ms {"statusCode":200,"body":"{\"message\":\"hello world\"}"}%

Lorsque vous spécifiez un résultat text, la sortie d'exécution de la fonction Lambda (par exemple, les journaux) est renvoyée vers stderr. La charge utile de la fonction Lambda est renvoyée à stdout. Voici un exemple :

$ sam remote invoke --stack-name sam-app --output text 2> stderr.log {"statusCode":200,"body":"{\"message\":\"hello world\"}"}% $ cat stderr.log Invoking Lambda Function HelloWorldFunction START RequestId: 82273c3b-aa3a-4d16-8f1c-1d2ad3ace891 Version: $LATEST END RequestId: 82273c3b-aa3a-4d16-8f1c-1d2ad3ace891 REPORT RequestId: 82273c3b-aa3a-4d16-8f1c-1d2ad3ace891 Duration: 40.62 ms Billed Duration: 41 ms Memory Size: 128 MB Max Memory Used: 68 MB $ sam remote invoke --stack-name sam-app --output text 1> stdout.log Invoking Lambda Function HelloWorldFunction START RequestId: 74acaa9f-5b80-4a5c-b3b8-ffaccb84cbbd Version: $LATEST END RequestId: 74acaa9f-5b80-4a5c-b3b8-ffaccb84cbbd REPORT RequestId: 74acaa9f-5b80-4a5c-b3b8-ffaccb84cbbd Duration: 2.31 ms Billed Duration: 3 ms Memory Size: 128 MB Max Memory Used: 67 MB $ cat stdout.log {"statusCode":200,"body":"{\"message\":\"hello world\"}"}%

Personnaliser les paramètres Boto3

En sam remote invoke effet, il AWS SAM CLI utilise le AWS SDK pour Python (Boto3) afin d'interagir avec vos ressources dans le cloud. Vous pouvez utiliser l’option --parameter pour personnaliser les paramètres Boto3. Pour obtenir la liste des paramètres pris en charge que vous pouvez personnaliser, reportez-vous à la section --parameter.

Exemples

Appelez une fonction Lambda pour valider les valeurs des paramètres et vérifier les autorisations :

$ sam remote invoke HelloWorldFunction --stack-name sam-app --parameter InvocationType="DryRun"

Utilisez l'--parameteroption plusieurs fois dans une seule commande pour fournir plusieurs paramètres :

$ sam remote invoke HelloWorldFunction --stack-name sam-app --parameter InvocationType="Event" --parameter LogType="None"

Autres options

Pour obtenir la liste complète des options sam remote invoke, consultez la section sam remote invoke.

Configurez le fichier de configuration de votre projet

Pour configurer sam remote invoke dans votre fichier de configuration, utilisez remote_invoke dans votre tableau. Voici un exemple de fichier samconfig.toml qui configure les valeurs par défaut de la commande sam remote invoke.

...
version =0.1

[default]
...
[default.remote_invoke.parameters]
stack_name = "cloud-app"
event = '{"message": "Hello!"}'

Exemples

Pour un exemple d'utilisation de basesam remote invoke, consultez la section Tester des AWS Lambda fonctions AWS SAM à distance dans le AWS Compute Blog.

Exemples de Kinesis Data Streams

Exemples de base

Envoyez un enregistrement de données à une application Kinesis Data Streams à partir d'un fichier. L'application Kinesis Data Streams est identifiée en fournissant un ARN pour l'ID de ressource :

$ sam remote invoke arn:aws:kinesis:us-west-2:01234567890:stream/kinesis-example-KinesisStream-BgnLcAey4xUQ --event-file event.json

Envoyez un événement fourni sur la ligne de commande à une application Kinesis Data Streams :

$ sam remote invoke KinesisStream --stack-name kinesis-example --event hello-world Putting record to Kinesis data stream KinesisStream Auto converting value 'hello-world' into JSON '"hello-world"'. If you don't want auto-conversion, please provide a JSON string as event { "ShardId": "shardId-000000000000", "SequenceNumber": "49646251411914806775980903986194508740483329854174920706" }%

Obtenez l'identifiant physique de l'application Kinesis Data Streams. Indiquez ensuite un événement sur la ligne de commande :

$ sam list resources --stack-name kinesis-example --output json [ { "LogicalResourceId": "KinesisStream", "PhysicalResourceId": "kinesis-example-KinesisStream-ZgnLcQey4xUQ" } ] $ sam remote invoke kinesis-example-KinesisStream-ZgnLcQey4xUQ --event hello Putting record to Kinesis data stream KinesisStream Auto converting value 'hello' into JSON '"hello"'. If you don't want auto-conversion, please provide a JSON string as event { "ShardId": "shardId-000000000000", "SequenceNumber": "49646251411914806775980904340716841045751814812900261890" }%

Fournissez une chaîne JSON sur la ligne de commande en tant qu'événement :

$ sam remote invoke KinesisStream --stack-name kinesis-example --event '{"method": "GET", "body": ""}' Putting record to Kinesis data stream KinesisStream { "ShardId": "shardId-000000000000", "SequenceNumber": "49646251411914806775980904492868617924990209230536441858" }%

Envoyez un événement vide à l'application Kinesis Data Streams :

$ sam remote invoke KinesisStream --stack-name kinesis-example Putting record to Kinesis data stream KinesisStream { "ShardId": "shardId-000000000000", "SequenceNumber": "49646251411914806775980904866469008589597168190416224258" }%

Renvoie la AWS SAM CLI réponse au format JSON :

$ sam remote invoke KinesisStream --stack-name kinesis-example --event '{"hello": "world"}' --output json Putting record to Kinesis data stream KinesisStream { "ShardId": "shardId-000000000000", "SequenceNumber": "49646251411914806775980905078409420803696667195489648642", "ResponseMetadata": { "RequestId": "ebbbd307-3e9f-4431-b67c-f0715e9e353e", "HTTPStatusCode": 200, "HTTPHeaders": { "x-amzn-requestid": "ebbbd307-3e9f-4431-b67c-f0715e9e353e", "x-amz-id-2": "Q3yBcgTwtPaQTV26IKclbECmZikUYOzKY+CzcxA84ZHgCkc5T2N/ITWg6RPOQcWw8Gn0tNPcEJBEHyVVqboJAPgCritqsvCu", "date": "Thu, 09 Nov 2023 18:13:10 GMT", "content-type": "application/x-amz-json-1.1", "content-length": "110" }, "RetryAttempts": 0 } }%

Renvoyez la sortie JSON à stdout :

$ sam remote invoke KinesisStream --stack-name kinesis-example --event '{"hello": "world"}' --output json 1> stdout.log Putting record to Kinesis data stream KinesisStream $ cat stdout.log { "ShardId": "shardId-000000000000", "SequenceNumber": "49646251411914806775980906397777867595039988349006774274", "ResponseMetadata": { "RequestId": "f4290006-d84b-b1cd-a9ee-28306eeb2939", "HTTPStatusCode": 200, "HTTPHeaders": { "x-amzn-requestid": "f4290006-d84b-b1cd-a9ee-28306eeb2939", "x-amz-id-2": "npCqz+IBKpoL4sQ1ClbUmxuJlbeA24Fx1UgpIrS6mm2NoIeV2qdZSN5AhNurdssykXajBrXaC9anMhj2eG/h7Hnbf+bPuotU", "date": "Thu, 09 Nov 2023 18:33:26 GMT", "content-type": "application/x-amz-json-1.1", "content-length": "110" }, "RetryAttempts": 0 } }%

Exemples Lambda

Exemples de base

Invoquez une fonction Lambda en fournissant l'ARN comme ID de ressource :

$ sam remote invoke arn:aws:lambda:us-west-2:012345678910:function:sam-app-HelloWorldFunction-ohRFEn2RuAvp

Invoquez une fonction Lambda en fournissant l'identifiant logique en tant qu'ID de ressource :

Vous devez également fournir le nom de la AWS CloudFormation pile à l'aide de l'--stack-nameoption. Voici un exemple :

$ sam remote invoke HelloWorldFunction --stack-name sam-app

Si votre application contient une seule fonction Lambda, vous n'avez pas à spécifier son ID logique. Vous pouvez uniquement fournir l’option --stack-name. Voici un exemple :

$ sam remote invoke --stack-name sam-app

Invoquez une fonction Lambda en fournissant l'identifiant physique en tant qu'identifiant de ressource :

L'identifiant physique est créé lorsque vous déployez à l'aide de AWS CloudFormation.

$ sam remote invoke sam-app-HelloWorldFunction-TZvxQRFNv0k4

Invoquez une fonction Lambda d'une pile enfant :

Pour cet exemple, notre application contient la structure de répertoires suivante :

lambda-example
├── childstack
│   ├── function
│   │   ├── __init__.py
│   │   ├── app.py
│   │   └── requirements.txt
│   └── template.yaml
├── events
│   └── event.json
├── samconfig.toml
└── template.yaml

Pour appeler la fonction Lambda de notrechildstack, nous exécutons ce qui suit :

$ sam remote invoke ChildStack/HelloWorldFunction --stack-name lambda-example Invoking Lambda Function HelloWorldFunction START RequestId: 207a864b-e67c-4307-8478-365b004d4bcd Version: $LATEST END RequestId: 207a864b-e67c-4307-8478-365b004d4bcd REPORT RequestId: 207a864b-e67c-4307-8478-365b004d4bcd Duration: 1.27 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 36 MB Init Duration: 111.07 ms {"statusCode": 200, "body": "{\"message\": \"Hello\", \"received_event\": {}}"}%

Configuration d'une fonction Lambda pour le streaming des réponses

Dans cet exemple, nous utilisons la CLI  AWS SAM pour initialiser une nouvelle application sans serveur qui contient une fonction Lambda configurée pour diffuser sa réponse. Nous déployons notre application sur le AWS Cloud et l'utilisons sam remote invoke pour interagir avec notre fonction dans le cloud.

Nous commençons par exécuter la commande sam init pour créer une nouvelle application sans serveur. Nous sélectionnons le modèle de démarrage rapide Lambda Response Streaming et nommons notre application. lambda-streaming-nodejs-app

$ sam init You can preselect a particular runtime or package type when using the `sam init` experience. Call `sam init --help` to learn more. Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Choose an AWS Quick Start application template 1 - Hello World Example ... 9 - Lambda Response Streaming ... 15 - Machine Learning Template: 9 Which runtime would you like to use? 1 - go (provided.al2) 2 - nodejs18.x 3 - nodejs16.x Runtime: 2 Based on your selections, the only Package type available is Zip. We will proceed to selecting the Package type as Zip. Based on your selections, the only dependency manager available is npm. We will proceed copying the template using npm. Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: ENTER Would you like to enable monitoring using CloudWatch Application Insights? For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: ENTER Project name [sam-app]: lambda-streaming-nodejs-app ----------------------- Generating application: ----------------------- Name: lambda-streaming-nodejs-app Runtime: nodejs18.x Architectures: x86_64 Dependency Manager: npm Application Template: response-streaming Output Directory: . Configuration file: lambda-streaming-nodejs-app/samconfig.toml Next steps can be found in the README file at lambda-streaming-nodejs-app/README.md Commands you can use next ========================= [*] Create pipeline: cd lambda-streaming-nodejs-app && sam pipeline init --bootstrap [*] Validate SAM template: cd lambda-streaming-nodejs-app && sam validate [*] Test Function in the Cloud: cd lambda-streaming-nodejs-app && sam sync --stack-name {stack-name} --watch

Ensuite, nous AWS SAMCLI créons notre projet avec la structure suivante :

lambda-streaming-nodejs-app
	├── README.md
	├── __tests__
	│   └── unit
	│       └── index.test.js
	├── package.json
	├── samconfig.toml
	├── src
	│   └── index.js
	└── template.yaml

Voici un exemple de code de fonction Lambda :

exports.handler = awslambda.streamifyResponse( async (event, responseStream, context) => { const httpResponseMetadata = { statusCode: 200, headers: { "Content-Type": "text/html", "X-Custom-Header": "Example-Custom-Header" } }; responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata); // It's recommended to use a `pipeline` over the `write` method for more complex use cases. // Learn more: https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html responseStream.write("<html>"); responseStream.write("<p>First write!</p>"); responseStream.write("<h1>Streaming h1</h1>"); await new Promise(r => setTimeout(r, 1000)); responseStream.write("<h2>Streaming h2</h2>"); await new Promise(r => setTimeout(r, 1000)); responseStream.write("<h3>Streaming h3</h3>"); await new Promise(r => setTimeout(r, 1000)); // Long strings will be streamed const loremIpsum1 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vitae mi tincidunt tellus ultricies dignissim id et diam. Morbi pharetra eu nisi et finibus. Vivamus diam nulla, vulputate et nisl cursus, pellentesque vehicula libero. Cras imperdiet lorem ante, non posuere dolor sollicitudin a. Vestibulum ipsum lacus, blandit nec augue id, lobortis dictum urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Morbi auctor orci eget tellus aliquam, non maximus massa porta. In diam ante, pulvinar aliquam nisl non, elementum hendrerit sapien. Vestibulum massa nunc, mattis non congue vitae, placerat in quam. Nam vulputate lectus metus, et dignissim erat varius a."; responseStream.write(`<p>${loremIpsum1}</p>`); await new Promise(r => setTimeout(r, 1000)); responseStream.write("<p>DONE!</p>"); responseStream.write("</html>"); responseStream.end(); } );

Voici un exemple de fichier template.yaml. Le streaming des réponses pour notre fonction Lambda est configuré à l'aide de la propriété FunctionUrlConfig.

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > Sample SAM Template for lambda-streaming-nodejs-app Resources: StreamingFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/ Handler: index.handler Runtime: nodejs18.x Architectures: - x86_64 Timeout: 10 FunctionUrlConfig: AuthType: AWS_IAM InvokeMode: RESPONSE_STREAM Outputs: StreamingFunction: Description: "Streaming Lambda Function ARN" Value: !GetAtt StreamingFunction.Arn StreamingFunctionURL: Description: "Streaming Lambda Function URL" Value: !GetAtt StreamingFunctionUrl.FunctionUrl

Généralement, vous pouvez utiliser sam build et sam deploy --guided pour créer et déployer une application de production. Dans cet exemple, nous allons utiliser un environnement de développement et utiliser la sam sync commande pour créer et déployer notre application.

Note

La commande sam sync est recommandée pour les environnements de développement. Pour en savoir plus, veuillez consulter la section Présentation de l'utilisation sam sync de la synchronisation avec AWS Cloud.

Avant de lancer sam sync, nous vérifions que notre projet est correctement configuré dans notre fichier samconfig.toml. Plus important encore, nous vérifions les valeurs de stack_name et watch. Ces valeurs étant spécifiées dans notre fichier de configuration, nous n'avons pas à les fournir sur la ligne de commande.

version = 0.1
	
	[default]
	[default.global.parameters]
	stack_name = "lambda-streaming-nodejs-app"
	
	[default.build.parameters]
	cached = true
	parallel = true
	
	[default.validate.parameters]
	lint = true
	
	[default.deploy.parameters]
	capabilities = "CAPABILITY_IAM"
	confirm_changeset = true
	resolve_s3 = true
	s3_prefix = "lambda-streaming-nodejs-app"
	region = "us-west-2"
	image_repositories = []
	
	[default.package.parameters]
	resolve_s3 = true
	
	[default.sync.parameters]
	watch = true
	
	[default.local_start_api.parameters]
	warm_containers = "EAGER"
	
	[default.local_start_lambda.parameters]
	warm_containers = "EAGER"

Ensuite, nous exécutons sam sync pour déployer notre application. Comme l'option --watch est configurée dans notre fichier de configuration, la CLI  AWS SAM créera notre application, la déploiera et surveillera les modifications.

$ sam sync The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code without performing a CloudFormation deployment. This will cause drift in your CloudFormation stack. **The sync command should only be used against a development stack**. Queued infra sync. Waiting for in progress code syncs to complete... Starting infra sync. Building codeuri: /Users/.../lambda-streaming-nodejs-app/src runtime: nodejs18.x metadata: {} architecture: x86_64 functions: StreamingFunction package.json file not found. Continuing the build without dependencies. Running NodejsNpmBuilder:CopySource Build Succeeded Successfully packaged artifacts and wrote output template to file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpavrzdhgp. Execute the following command to deploy the packaged template sam deploy --template-file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpavrzdhgp --stack-name <YOUR STACK NAME> Deploying with following values =============================== Stack name : lambda-streaming-nodejs-app Region : us-west-2 Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-1a4x26zbcdkqr Capabilities : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"] Parameter overrides : {} Signing Profiles : null Initiating deployment ===================== 2023-06-20 12:11:16 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 0.5 seconds) ----------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason ----------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::CloudFormation::St lambda-streaming- Transformation ack nodejs-app succeeded CREATE_IN_PROGRESS AWS::IAM::Role StreamingFunctionRole - CREATE_IN_PROGRESS AWS::CloudFormation::St AwsSamAutoDependencyLay - ack erNestedStack CREATE_IN_PROGRESS AWS::IAM::Role StreamingFunctionRole Resource creation Initiated CREATE_IN_PROGRESS AWS::CloudFormation::St AwsSamAutoDependencyLay Resource creation ack erNestedStack Initiated CREATE_COMPLETE AWS::IAM::Role StreamingFunctionRole - CREATE_COMPLETE AWS::CloudFormation::St AwsSamAutoDependencyLay - ack erNestedStack CREATE_IN_PROGRESS AWS::Lambda::Function StreamingFunction - CREATE_IN_PROGRESS AWS::Lambda::Function StreamingFunction Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Function StreamingFunction - CREATE_IN_PROGRESS AWS::Lambda::Url StreamingFunctionUrl - CREATE_IN_PROGRESS AWS::Lambda::Url StreamingFunctionUrl Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Url StreamingFunctionUrl - CREATE_COMPLETE AWS::CloudFormation::St lambda-streaming- - ack nodejs-app ----------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack ------------------------------------------------------------------------------------------------------- Outputs ------------------------------------------------------------------------------------------------------- Key StreamingFunction Description Streaming Lambda Function ARN Value arn:aws:lambda:us-west-2:012345678910:function:lambda-streaming-nodejs-app- StreamingFunction-gUmhO833A0vZ Key StreamingFunctionURL Description Streaming Lambda Function URL Value https://wxgkcc2dyntgtrwhf2dgdcvylu0rnnof.lambda-url.us-west-2.on.aws/ ------------------------------------------------------------------------------------------------------- Stack creation succeeded. Sync infra completed. Infra sync completed.

Maintenant que notre fonction est déployée dans le cloud, nous pouvons utiliser sam remote invoke pour interagir avec notre fonction. La CLI  AWS SAM détecte automatiquement que notre fonction est configurée pour le streaming des réponses et commence immédiatement à générer une réponse diffusée de notre fonction en temps réel.

$ sam remote invoke StreamingFunction Invoking Lambda Function StreamingFunction {"statusCode":200,"headers":{"Content-Type":"text/html","X-Custom-Header":"Example-Custom-Header"}}<html><p>First write!</p><h1>Streaming h1</h1><h2>Streaming h2</h2><h3>Streaming h3</h3><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vitae mi tincidunt tellus ultricies dignissim id et diam. Morbi pharetra eu nisi et finibus. Vivamus diam nulla, vulputate et nisl cursus, pellentesque vehicula libero. Cras imperdiet lorem ante, non posuere dolor sollicitudin a. Vestibulum ipsum lacus, blandit nec augue id, lobortis dictum urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Morbi auctor orci eget tellus aliquam, non maximus massa porta. In diam ante, pulvinar aliquam nisl non, elementum hendrerit sapien. Vestibulum massa nunc, mattis non congue vitae, placerat in quam. Nam vulputate lectus metus, et dignissim erat varius a.</p><p>DONE!</p></html>START RequestId: 1e4cdf04-60de-4769-b3a2-c1481982deb4 Version: $LATEST END RequestId: 1e4cdf04-60de-4769-b3a2-c1481982deb4 REPORT RequestId: 1e4cdf04-60de-4769-b3a2-c1481982deb4 Duration: 4088.66 ms Billed Duration: 4089 ms Memory Size: 128 MB Max Memory Used: 68 MB Init Duration: 168.45 ms

Lorsque nous modifions notre code de fonction, la CLI  AWS SAM détecte et déploie instantanément nos modifications. Voici un exemple de réponse générée par la CLI  AWS SAM après que des modifications ont été apportées à notre code de fonction :

Syncing Lambda Function StreamingFunction...                                             
	Building codeuri:                                                                        
	/Users/.../lambda-streaming-nodejs-app/src runtime: nodejs18.x metadata: {} architecture:    
	x86_64 functions: StreamingFunction                                                      
	package.json file not found. Continuing the build without dependencies.                  
	Running NodejsNpmBuilder:CopySource                                                      
	Finished syncing Lambda Function StreamingFunction.                                      
	Syncing Layer StreamingFunctione9cfe924DepLayer...                                       
	SyncFlow [Layer StreamingFunctione9cfe924DepLayer]: Skipping resource update as the      
	content didn't change                                                                    
	Finished syncing Layer StreamingFunctione9cfe924DepLayer. 

Nous pouvons à présent utiliser sam remote invoke à nouveau pour interagir avec notre fonction dans le cloud et tester nos modifications.

Exemples SQS

Exemples de base

Appelez une file d'attente Amazon SQS en fournissant l'ARN comme ID de ressource :

$ sam remote invoke arn:aws:sqs:us-west-2:01234567890:sqs-example-4DonhBsjsW1b --event '{"hello": "world"}' --output json Sending message to SQS queue MySqsQueue { "MD5OfMessageBody": "49dfdd54b01cbcd2d2ab5e9e5ee6b9b9", "MessageId": "4f464cdd-15ef-4b57-bd72-3ad225d80adc", "ResponseMetadata": { "RequestId": "95d39377-8323-5ef0-9223-ceb198bd09bd", "HTTPStatusCode": 200, "HTTPHeaders": { "x-amzn-requestid": "95d39377-8323-5ef0-9223-ceb198bd09bd", "date": "Wed, 08 Nov 2023 23:27:26 GMT", "content-type": "application/x-amz-json-1.0", "content-length": "106", "connection": "keep-alive" }, "RetryAttempts": 0 } }%

Exemples de Step Functions

Exemples de base

Invoquez une machine à états en fournissant son identifiant physique en tant qu'identifiant de ressource :

Tout d'abord, nous utilisons sam list resources pour obtenir notre identifiant physique :

$ sam list resources --stack-name state-machine-example --output json [ { "LogicalResourceId": "HelloWorldStateMachine", "PhysicalResourceId": "arn:aws:states:us-west-2:513423067560:stateMachine:HelloWorldStateMachine-z69tFEUx0F66" }, { "LogicalResourceId": "HelloWorldStateMachineRole", "PhysicalResourceId": "simple-state-machine-HelloWorldStateMachineRole-PduA0BDGuFXw" } ]

Ensuite, nous invoquons notre machine à états en utilisant l'identifiant physique comme identifiant de ressource. Nous transmettons un événement en ligne de commande avec l'--eventoption :

$ sam remote invoke arn:aws:states:us-west-2:01234567890:stateMachine:HelloWorldStateMachine-z69tFEUx0F66 --event '{"is_developer": true}' Invoking Step Function arn:aws:states:us-west-2:01234567890:stateMachine:HelloWorldStateMachine-z69tFEUx0F66 "Hello Developer World"%

Invoquez une machine à états en transmettant un événement vide :

$ sam remote invoke HelloWorldStateMachine --stack-name state-machine-example Invoking Step Function HelloWorldStateMachine "Hello World"%

Pour la documentation relative à sam remote invoke et à l'utilisation du AWS SAMCLI, consultez les rubriques suivantes :