本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 進行測試的簡介 sam local invoke
使用 AWS Serverless Application Model 命令列介面 (AWS SAM CLI) sam local invoke
子命令,以啟動本機的一次性 AWS Lambda 函數調用。
-
如需 的簡介 AWS SAM CLI,請參閱 什麼是 AWS SAM CLI?
-
如需
sam local invoke
命令選項的清單,請參閱 sam local invoke。 -
如需在典型開發工作流程
sam local invoke
期間使用 的範例,請參閱 步驟 7:(選用) 在本機測試您的應用程式。
若要使用 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 函數
-
從專案的根目錄執行下列動作:
$
sam local invoke
<options>
-
如果您的應用程式包含多個函數,請提供函數的邏輯 ID。以下是範例:
$
sam local invoke
HelloWorldFunction
-
的 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
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 函數時傳遞環境變數
此應用程式具有 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
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序列中測試來自無