

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

# 使用 進行測試的簡介 sam local invoke
<a name="using-sam-cli-local-invoke"></a>

使用 AWS Serverless Application Model 命令列界面 (AWS SAM CLI) `sam local invoke`子命令在本機啟動 AWS Lambda 函數的一次性調用。
+ 如需 的簡介 AWS SAM CLI，請參閱 [什麼是 AWS SAM CLI？](what-is-sam-overview.md#what-is-sam-cli)
+ 如需`sam local invoke`命令選項的清單，請參閱 [sam local invoke](sam-cli-command-reference-sam-local-invoke.md)。
+ 如需在典型開發工作流程`sam local invoke`期間使用 的範例，請參閱 [步驟 7：（選用） 在本機測試您的應用程式](serverless-getting-started-hello-world.md#serverless-getting-started-hello-world-test)。

**注意**  
不建議在不受信任的程式碼中使用 SAM CLI 的本機調用功能。若要與本機環境完全隔離，請直接在 Lambda 服務中執行程式碼。

**注意**  
`sam local invoke` 支援具有自動檢查點和重播功能的耐用函數。在本機叫用耐用函數時，會自動管理執行狀態。

## 先決條件
<a name="using-sam-cli-local-invoke-prerequisites"></a>

若要使用 `sam local invoke`，請完成下列步驟來 AWS SAM CLI安裝 ：
+ [AWS SAM 先決條件](prerequisites.md).
+ [安裝 AWS SAM CLI](install-sam-cli.md).

使用 之前`sam local invoke`，我們建議您對下列項目有基本的了解：
+ [設定 AWS SAM CLI](using-sam-cli-configure.md).
+ [在 中建立您的應用程式 AWS SAM](using-sam-cli-init.md).
+ [使用 建置 簡介 AWS SAM](using-sam-cli-build.md).
+ [使用 部署簡介 AWS SAM](using-sam-cli-deploy.md).

## 在本機叫用 Lambda 函數
<a name="using-sam-cli-local-invoke-use"></a>

當您執行 時`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>
   ```

1. 如果您的應用程式包含多個函數，請提供函數的邏輯 ID。以下是範例：

   ```
   $ sam local invoke HelloWorldFunction
   ```

1. 會使用 在 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\"}"}%
   ```

### 管理 日誌
<a name="using-sam-cli-local-invoke-logs"></a>

使用 時`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
```

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

## 選項
<a name="using-sam-cli-local-invoke-options"></a>

### 傳遞自訂事件以叫用 Lambda 函數
<a name="using-sam-cli-local-invoke-options-events"></a>

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

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

您可以使用 `sam local generate-event`子命令建立事件。如需詳細資訊，請參閱 [使用 進行測試的簡介 sam local generate-event](using-sam-cli-local-generate-event.md)。

### 叫用 Lambda 函數時傳遞環境變數
<a name="using-sam-cli-local-invoke-options-env"></a>

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

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

### 指定範本或函數
<a name="using-sam-cli-local-invoke-options-specify"></a>

若要指定範本供 AWS SAM CLI參考，請使用 `--template`選項。 AWS SAM CLI 只會載入該 AWS SAM 範本及其指向的資源。

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

```
$ sam local invoke StackLogicalId/FunctionLogicalId
```

### 從Terraform專案測試 Lambda 函數
<a name="using-sam-cli-local-invoke-options-terraform"></a>

使用 `--hook-name`選項從Terraform專案本機測試 Lambda 函數。如需詳細資訊，請參閱 [搭配 使用 AWS SAM CLITerraform進行本機偵錯和測試](using-samcli-terraform.md)。

以下是範例：

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

## 最佳實務
<a name="using-sam-cli-local-invoke-best"></a>

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

在部署到雲端之前，本機測試是快速開發和測試的絕佳解決方案。不過，本機測試不會驗證所有項目，例如雲端中資源之間的許可。盡可能在雲端測試您的應用程式。建議使用 [`sam sync`](using-sam-cli-sync.md) 來加速雲端測試工作流程。

## 範例
<a name="using-sam-cli-local-invoke-examples"></a>

### 產生 Amazon API Gateway 範例事件，並使用它在本機叫用 Lambda 函數
<a name="using-sam-cli-local-invoke-examples-api"></a>

首先，我們產生 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 函數時傳遞環境變數
<a name="using-sam-cli-local-invoke-examples-env"></a>

此應用程式具有 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":"{}"}
```

## 進一步了解
<a name="using-sam-cli-local-invoke-learn"></a>

如需所有`sam local invoke`選項的清單，請參閱 [sam local invoke](sam-cli-command-reference-sam-local-invoke.md)。

如需使用 的示範`sam local`，請參閱 [AWS SAM 以取得本機開發。在 上的 *Serverless Land Sessions 中使用 SAM 系列YouTube*測試來自本機開發環境 AWS 雲端 的資源](https://www.youtube.com/watch?v=NzPqMrdgD1s&list=PLJo-rJlep0ED198FJnTzhIB5Aut_1vDAd&index=24)。