雲端測試簡介 sam remote invoke - AWS Serverless Application Model

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

雲端測試簡介 sam remote invoke

使用指 AWS Serverless Application Model 令行介面 (AWS SAM CLI) sam remote invoke 指令與中支援的 AWS 資源互動 AWS 雲端。您可以使用sam remote invoke來調用以下資源:

  • Amazon Kinesis Data Streams — 將資料記錄傳送至 Kinesis Data Streams 應用程式。

  • AWS Lambda-調用事件並將其傳遞給您的 Lambda 函數。

  • Amazon Simple Queue Service (Amazon SQS) — 將消息發送到 Amazon SQS 隊列。

  • AWS Step Functions— 叫用 Step Functions 狀態機器以開始執行。

如需「」的簡介 AWS SAMCLI,請參閱什麼是 AWS SAMCLI?

如需在典型開發工作流程sam remote invoke期間使用的範例,請參閱第 5 步:與您的功能進行交互 AWS 雲端

若要使用sam remote invoke,請完成下列 AWS SAMCLI步驟來安裝:

我們也建議您升級到最新版本的 AWS SAMCLI. 如需進一步了解,請參閱升級 AWS SAMCLI

使用前sam remote invoke,我們建議對以下內容進行基本了解:

使用 sam 遠程調用命令

使用此命令之前,您的資源必須部署到 AWS 雲端.

使用以下命令結構並從項目的根目錄運行:

$ sam remote invoke <arguments> <options>
注意

此頁面將顯示在命令提示符下提供的選項。您還可以在項目的配置文件中配置選項,而不是在命令提示符下傳遞它們。如需進一步了解,請參閱 設定專案設定

如需引sam remote invoke數和選項的描述,請參閱sam remote invoke

搭配 Kinesis Data Streams 使用

您可以將資料記錄傳送至 Kinesis Data Streams 應用程式。 AWS SAM CLI將發送您的數據記錄並返回分片 ID 和序列號。以下是範例:

$ 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" }%
若要傳送資料記錄
  1. 提供資源 ID 值作為 Kinesis Data Streams 應用程式的引數。如需有效資源 ID 的相關資訊,請參閱資源 ID

  2. 將資料記錄當做事件提供給 Kinesis Data Streams 應用程式。您可以使用該--event選項在命令行中提供事件,也可以從文件中使用--event-file。如果您不提供事件,則會 AWS SAM CLI傳送空白事件。

搭配使用 Lambda 函數

您可以在雲端叫用 Lambda 函數,並傳遞空事件,或在命令列或從檔案提供事件。 AWS SAM CLI將調用您的 Lambda 函數並返回其響應。以下是範例:

$ 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\"}"}%
若要呼叫 Lambda 函數
  1. 提供資源 ID 值做為 Lambda 函數的引數。如需有效資源 ID 的相關資訊,請參閱資源 ID

  2. 提供要傳送至 Lambda 函數的事件。您可以使用該--event選項在命令行中提供事件,也可以從文件中使用--event-file。如果您不提供事件,則會 AWS SAM CLI傳送空白事件。

以回應串流設定的 Lambda 函數

此命sam remote invoke令支援設定為串流回應的 Lambda 函數。您可以設定 Lambda 函數,使用 AWS SAM 範本中的FunctionUrlConfig屬性串流回應。使用時sam remote invoke, AWS SAMCLI會自動偵測您的 Lambda 組態,並透過回應串流呼叫。

如需範例,請參閱叫用設定為串流回應的 Lambda 函數

將可共用的測試事件傳遞至雲端中的 Lambda 函數

可共享的測試事件是您可以與其他人共享的測試事件。 AWS 帳戶若要深入了解,請參閱AWS Lambda 開發人員指南中的可共用測試事件

存取和管理可共用的測試事件

您可以使用命 AWS SAM CLIsam remote test-event令來存取和管理可共用的測試事件。例如,您可以使用sam remote test-event來執行下列動作:

  • 從 Amazon EventBridge 架構登錄檔擷取可共用的測試事件。

  • 在本機修改可共用的測試事件,並將其上傳至 EventBridge 結構描述登錄。

  • 從 EventBridge 結構描述登錄中刪除可共用的測試事件。

如需進一步了解,請參閱雲端測試簡介 sam remote test-event

將可共用的測試事件傳遞至雲端中的 Lambda 函數

若要將可共用的測試事件從 EventBridge 結構描述登錄檔傳遞至雲端中的 Lambda 函數,請使用該--test-event-name選項並提供可共用測試事件的名稱。以下是範例:

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

如果您在本機儲存可共用的測試事件,您可以使用--event-file選項並提供本機測試事件的檔案路徑和名稱。以下是範例:

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

搭配使用 與 Amazon SQS

您可以將訊息傳送到 Amazon SQS 佇列。會 AWS SAM CLI傳回下列內容:

  • 訊息 ID

  • 郵件內文的 MD5

  • 響應元數據

以下是範例:

$ sam remote invoke MySqsQueue --stack-name sqs-example -event hello Sending message to SQS queue MySqsQueue { "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017c592", "MessageId": "05c7af65-9ae8-4014-ae28-809d6d8ec652" }%
傳送訊息
  1. 提供資源 ID 值做為 Amazon SQS 佇列的引數。如需有效資源 ID 的相關資訊,請參閱資源 ID

  2. 提供要傳送至 Amazon SQS 佇列的事件。您可以使用該--event選項在命令行中提供事件,也可以從文件中使用--event-file。如果您不提供事件,則會 AWS SAM CLI傳送空白事件。

與 Step Functions 搭配使用

您可以調用 Step Functions 狀態機開始執行。 AWS SAM CLI將等待狀態機器工作流程完成,並傳回執行中最後一個步驟的輸出。以下是範例:

$ sam remote invoke HelloWorldStateMachine --stack-name state-machine-example --event '{"is_developer": true}' Invoking Step Function HelloWorldStateMachine "Hello Developer World"%
呼叫狀態機
  1. 提供資源 ID 值作為「Step Functions 數」狀態機器的引數。如需有效資源 ID 的相關資訊,請參閱資源 ID

  2. 提供要傳送至狀態機的事件。您可以使用該--event選項在命令行中提供事件,也可以從文件中使用--event-file。如果您不提供事件,則會 AWS SAM CLI傳送空白事件。

使用 sam 遠程調用命令選項

本節介紹一些您可以與sam remote invoke指令搭配使用的主要選項。如需選項的完整清單,請參閱sam remote invoke

將事件傳遞至您的資源

使用下列選項將事件傳遞至雲端中的資源:

  • --event— 在命令列傳遞事件。

  • --event-file— 從檔案傳遞事件。

Lambda 範例

--event於在命令行作為字符串值傳遞一個事件:

$ 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於從文件傳遞事件並提供文件的路徑:

$ 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\"}"}%

使用以下方式傳遞事件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\"}"}%

配置響 AWS SAMCLI應輸出

當您使用呼叫支援的資源時sam remote invoke,會 AWS SAMCLI傳回包含下列項目的回應:

  • 要求中繼資料 — 與要求相關聯的中繼資料。這包括請求 ID 和請求開始時間。

  • 資源回應 — 在雲端呼叫後來自資源的回應。

您可以使用該--output選項來配置 AWS SAM CLI輸出響應。可用的選項值如下:

  • json— 在JSON結構中傳回中繼資料和資源回應。響應包含完整的SDK輸出。

  • text— 以文字結構傳回中繼資料。資源回應會以資源的輸出格式傳回。

以下是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\\\"}\"}" }%

當您指定json輸出時,整個回應會傳回至stdout。以下是範例:

$ 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\\\"}\"}" }%

以下是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\"}"}%

當您指定text輸出時,Lambda 函數執行階段輸出 (例如記錄檔) 會傳回至stderr。Lambda 函數有效負載會傳回至stdout。以下是範例:

$ 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\"}"}%

自訂Boto3參數

對於sam remote invoke, AWS SAM CLI利用適用 AWS SDK for Python (Boto3) 與您在雲中的資源進行交互。您可以使用--parameter此選項來自訂Boto3參數。如需可自訂的支援參數清單,請參閱--parameter

範例

叫用 Lambda 函數來驗證參數值並驗證權限:

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

在單一命令中多次使用--parameter此選項可提供多個參數:

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

其他選項

如需選sam remote invoke項的完整清單,請參閱sam remote invoke

配置您的項目配置文件

若要sam remote invoke在組態檔案中進行配置,請remote_invoke在表格中使用。以下是設定指令預設值的samconfig.toml檔案範例。sam remote invoke

...
version =0.1

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

範例

如需使用的基本範例sam remote invoke,請參閱 AWS Compute 部落格的使用 AWS SAM 遠端測試 AWS Lambda 函數

Kinesis Data Streams 範例

基本範例

將資料記錄從檔案傳送至 Kinesis Data Streams 應用程式。Kinesis 資料串流應用程式可透過為資源識別碼提供 ARN 來識別:

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

將命令列中提供的事件傳送至 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" }%

取得 Kinesis Data Streams 應用程式的實體 ID。然後,在命令行中提供一個事件:

$ 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" }%

在命令行中提供 JSON 字符串作為事件:

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

傳送空白事件至 Kinesis Data Streams 應用程式:

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

返回 JSON 格式的 AWS SAM CLI響應:

$ 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 } }%

返回 JSON 輸出到標準輸出:

$ 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 } }%

Lambda 範例

基本範例

藉由提供 ARN 做為資源識別碼來叫用 Lambda 函數:

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

藉由提供邏輯 ID 做為資源識別碼來叫用 Lambda 函數:

您也必須使用--stack-name選項提供 AWS CloudFormation 堆疊名稱。以下是範例:

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

如果您的應用程式包含單一 Lambda 函數,則不需要指定它的邏輯 ID。您只能提供--stack-name選項。以下是範例:

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

透過提供實體 ID 做為資源識別碼來叫用 Lambda 函數:

當您使用部署時,會建立實體 ID AWS CloudFormation。

$ sam remote invoke sam-app-HelloWorldFunction-TZvxQRFNv0k4

調用子堆棧的 Lambda 函數:

在此示例中,我們的應用程序包含以下目錄結構:

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

若要叫用我們的 Lambda 函數childstack,我們執行下列命令:

$ 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\": {}}"}%

叫用設定為串流回應的 Lambda 函數

在此範例中,我們使用初始化新的 AWS SAMCLI無伺服器應用程式,該應用程式包含設定為串流回應的 Lambda 函數。我們將應用程式部署到, AWS 雲端 並使用sam remote invoke與我們在雲端中的功能互動。

我們首先執行sam init命令來建立新的無伺服器應用程式。我們選取 Lambda 回應串流快速入門範本並命名我們的應用程式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

該 AWS SAMCLI創建了我們的項目具有以下結構:

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

以下是我們 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(); } );

以下是我們的template.yaml文件的一個例子。Lambda 函數的回應串流是使用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

通常,您可以使用sam buildsam deploy --guided建置和部署生產應用程式。在這個例子中,我們將假設一個開發環境,並使用命sam sync令來構建和部署我們的應用程序。

注意

建議在開發環境中使用此sam sync命令。如需進一步了解,請參閱使用同步sam sync到簡介 AWS 雲端

在運行之前sam sync,我們驗證我們的項目在我們的samconfig.toml文件中配置正確。最重要的是,我們會驗證stack_name和的值watch。在我們的配置文件中指定了這些值,我們不必在命令行中提供它們。

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"

接下來,我們執行sam sync建置和部署我們的應用程式。由於該--watch選項是在我們的配置文件中配置的, AWS SAMCLI將構建我們的應用程序,部署我們的應用程序,並監視更改。

$ 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.

現在,我們的功能已部署到雲端,我們可以用sam remote invoke來與我們的功能進行交互。 AWS SAMCLI自動檢測我們的功能是否已配置為響應流,並立即開始實時輸出我們函數的流式響應。

$ 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

當我們修改函數代碼時,立 AWS SAMCLI即檢測並立即部署我們的更改。以下是對函數代碼進行更改後 AWS SAMCLI輸出的示例:

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. 

現在,我們可以sam remote invoke再次使用與雲中的功能進行交互並測試我們的更改。

SQS 範例

基本範例

提供 ARN 做為資源識別碼,以叫用 Amazon SQS 佇列:

$ 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 } }%

Step Functions 範例

基本範例

藉由提供其實體 ID 作為資源 ID 來叫用狀態機器:

首先,我們用sam list resources來獲取我們的物理 ID:

$ 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" } ]

接下來,我們使用物理 ID 作為資源 ID 調用我們的狀態機。我們通過在命令行與--event選項的事件:

$ 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"%

通過傳遞一個空事件調用狀態機:

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

如需與sam remote invoke和使用相關的說明文件 AWS SAMCLI,請參閱下列內容: