使用 進行測試的簡介 sam local invoke - AWS Serverless Application Model

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

使用 進行測試的簡介 sam local invoke

使用 AWS Serverless Application Model 命令列介面 (AWS SAM CLI) sam local invoke子命令,以啟動本機的一次性 AWS Lambda 函數調用。

若要使用 sam local invoke,請安裝 AWS SAM CLI 完成下列操作:

在使用 之前sam local invoke,我們建議對以下內容有基本的了解:

在本機叫用 Lambda 函數

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

在本機叫用 Lambda 函數
  1. 從專案的根目錄執行下列動作:

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

    $ sam local invoke HelloWorldFunction
  3. 的 AWS SAM CLI 使用 在本機容器中建置函數 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 SAM CLI 若要參考,請使用 --template選項。的 AWS SAM CLI 只會載入該 AWS SAM 範本及其指向的資源。

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

$ sam local invoke StackLogicalId/FunctionLogicalId

從 測試 Lambda 函數 Terraform project

使用 --hook-name選項,從您的 本機測試 Lambda 函數 Terraform 專案。如需進一步了解,請參閱 使用 AWS SAM CLI 取代為 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閘道HTTPAPI事件承載,並將其儲存至我們的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 函數時傳遞環境變數

此應用程式具有 Lambda 函數,該函數使用 Amazon DynamoDB 資料表名稱的環境變數。以下是 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" } }

接下來,我們會使用 --env-vars選項執行sam local invoke並傳遞環境變數。

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