測試簡介 sam local invoke - AWS Serverless Application Model

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

測試簡介 sam local invoke

使用指 AWS Serverless Application Model 令行介面 (AWS SAMCLI) sam local invoke 子指令在本機啟動 AWS Lambda 函數的一次性呼叫。

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

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

在本機叫用 Lambda 函數

當您執行時sam local invoke,會 AWS SAMCLI假設您目前的工作目錄是專案的根目錄。 AWS SAMCLI將首先查找子template.[yaml|yml]文件.aws-sam夾中的文件。如果找不到, AWS SAMCLI會在您目前的工作目錄中尋找template.[yaml|yml]檔案。

若要在本機叫用 Lambda 函數
  1. 從項目的根目錄中運行以下命令:

    $ sam local invoke <options>
  2. 如果您的應用程式包含多個函數,請提供函數的邏輯 ID。以下是範例:

    $ sam local invoke HelloWorldFunction
  3. 將您的函數 AWS SAMCLI構建在本地容器中使用Docker. 然後它調用你的函數並輸出你的函數的響應。

    以下是範例:

    $ sam local invoke Invoking app.lambda_handler (python3.9) Local image is out of date and will be updated to the latest runtime. To skip this, pass in the parameter --skip-pull-image Building image.................................................................................................................... Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df Version: $LATEST END RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df REPORT RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df Init Duration: 1.09 ms Duration: 608.42 ms Billed Duration: 609 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 200, "body": "{\"message\": \"hello world\"}"}%

管理 日誌

使用時sam local invoke,Lambda 函數執行階段輸出 (例如記錄檔) 會輸出至stderr,並將 Lambda 函數結果輸出至stdout

以下是基本 Lambda 函數的範例:

def handler(event, context): print("some log") # this goes to stderr return "hello world" # this goes to stdout

您可以儲存這些標準輸出。以下是範例:

$ sam local invoke 1> stdout.log ... $ cat stdout.log "hello world" $ sam local invoke 2> stderr.log ... $ cat stderr.log Invoking app.lambda_handler (python3.9) Local image is up-to-date Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 Version: $LATEST some log END RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 REPORT RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 Init Duration: 0.91 ms Duration: 589.19 ms Billed Duration: 590 ms Memory Size: 128 MB Max Memory Used: 128 MB

您可以使用這些標準輸出來進一步自動化您的本機開發程序。

選項

傳遞自訂事件以叫用 Lambda 函數

若要將事件傳遞至 Lambda 函數,請使用--event選項。以下是範例:

$ sam local invoke --event events/s3.json S3JsonLoggerFunction

您可以使用sam local generate-event子命令建立事件。如需進一步了解,請參閱測試簡介 sam local generate-event

調用 Lambda 函數時傳遞環境變量

如果您的 Lambda 函數使用環境變數,您可以在本機測試期間使用--env-vars此選項來傳遞它們。這是使用應用程式中已部署雲端的服務在本機測試 Lambda 函數的好方法。以下是範例:

$ sam local invoke --env-vars locals.json

指定範本或函數

若要指定要參考 AWS SAMCLI的範本,請使用--template選項。 AWS SAMCLI將加載該 AWS SAM 模板及其指向的資源。

若要叫用巢狀應用程式或堆疊的函數,請提供應用程式或堆疊邏輯 ID 以及函數邏輯 ID。以下是範例:

$ sam local invoke StackLogicalId/FunctionLogicalId

從您的Terraform專案測試 Lambda 函數

使用--hook-name此選項在本機測試Terraform專案中的 Lambda 函數。如需進一步了解,請參閱使用 AWS SAMCLI與進Terraform行本機除錯和測試

以下是範例:

$ sam local invoke --hook-name terraform --beta-features

最佳實務

如果您的應用程式有執行中的.aws-sam目錄sam build,請務必在sam build每次更新函數程式碼時執行。然後,運行sam local invoke以在本地測試更新的函數代碼。

本地測試是部署到雲之前快速開發和測試的絕佳解決方案。但是,本地測試不會驗證所有內容,例如雲中資源之間的權限。請盡可能在雲端中測試您的應用程式。我們建議您使sam sync用以加速雲端測試工作流程。

範例

產生 Amazon API Gateway 範例事件,並使用它在本機叫用 Lambda 函數

首先,我們產生 API Gateway HTTP API 事件承載,並將其儲存到我們的events資料夾。

$ sam local generate-event apigateway http-api-proxy > events/apigateway_event.json

接下來,我們修改 Lambda 函數,以便從事件傳回參數值。

def lambda_handler(event, context): print("HelloWorldFunction invoked") return { "statusCode": 200, "body": json.dumps({ "message": event['queryStringParameters']['parameter2'], }), }

接下來,我們在本機叫用 Lambda 函數並提供自訂事件。

$ sam local invoke --event events/apigateway_event.json Invoking app.lambda_handler (python3.9) Local image is up-to-date Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST some log END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Init Duration: 1.63 ms Duration: 564.07 ms Billed Duration: 565 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 200, "body": "{\"message\": \"value\"}"}%

在本地調用 Lambda 函數時傳遞環境變量

此應用程式具有使用環境變數做為 Amazon DynamoDB 表格名稱的 Lambda 函數。以下是在 AWS SAM 模板中定義的函數的示例:

AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 ... Resources: getAllItemsFunction: Type: AWS::Serverless::Function Properties: Handler: src/get-all-items.getAllItemsHandler Description: get all items Policies: - DynamoDBReadPolicy: TableName: !Ref SampleTable Environment: Variables: SAMPLE_TABLE: !Ref SampleTable ...

我們希望在本機測試 Lambda 函數,同時讓它與雲端中的 DynamoDB 表互動。要做到這一點,我們創建我們的環境變量文件,並將其保存在我們的項目的根目錄locals.json。此處提供的值供SAMPLE_TABLE參考雲端中的 DynamoDB 表格。

{ "getAllItemsFunction": { "SAMPLE_TABLE": "dev-demo-SampleTable-1U991234LD5UM98" } }

接下來,我們運行sam local invoke並通過我們的環境變量與選--env-vars項。

$ sam local invoke getAllItemsFunction --env-vars locals.json Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST some log END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Init Duration: 1.63 ms Duration: 564.07 ms Billed Duration: 565 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode":200,"body":"{}"}

進一步了解

如需所有sam local invoke選項的清單,請參閱sam local invoke

有關使用的演示sam local,請參AWS SAM 閱本地開發。在 SAM 系列的無伺服器陸地工作階段中,測試來自本機開發環境的 AWS 雲端 YouTube資源