本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
測試簡介 sam local invoke
使用指 AWS Serverless Application Model 令行介面 (AWS SAMCLI) sam local invoke
子指令在本機啟動 AWS Lambda 函數的一次性呼叫。
-
如需「」的簡介 AWS SAMCLI,請參閱什麼是 AWS SAMCLI?。
-
如需指
sam local invoke
令選項的清單,請參閱sam local invoke。 -
如需在典型開發工作流程
sam local invoke
期間使用的範例,請參閱步驟 7:(可選)在本地測試您的應用程序。
若要使用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 函數
-
從項目的根目錄中運行以下命令:
$
sam local invoke
<options>
-
如果您的應用程式包含多個函數,請提供函數的邏輯 ID。以下是範例:
$
sam local invoke
HelloWorldFunction
-
將您的函數 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
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\"}"}%events/apigateway_event.json
在本地調用 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
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":"{}"}getAllItemsFunction
--env-varslocals.json
進一步了解
如需所有sam local invoke
選項的清單,請參閱sam local invoke。
有關使用的演示sam local
,請參AWS SAM 閱本地開發。在 SAM 系列的無伺服器陸地工作階段中,測試來自本機開發環境的 AWS 雲端 YouTube資源