

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

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

使用 AWS Serverless Application Model Command Line Interface (AWS SAM CLI) `sam local`命令在本機測試無伺服器應用程式。

如需 的簡介 AWS SAM CLI，請參閱 [什麼是 AWS SAM CLI？](what-is-sam-overview.md#what-is-sam-cli)。

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

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

使用 之前`sam local`，我們建議您對以下內容有基本的了解：
+ [設定 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).

## 使用 sam local命令
<a name="using-sam-cli-local-command"></a>

使用 `sam local`命令搭配其任何子命令，為您的應用程式執行不同類型的本機測試。

```
$ sam local <subcommand>
```

若要進一步了解每個子命令，請參閱以下內容：
+ **[簡介 sam local generate-event](using-sam-cli-local-generate-event.md)** – 產生本機測試 AWS 服務 的事件。
+ **[簡介 sam local invoke](using-sam-cli-local-invoke.md)** – 在本機啟動 函數的 AWS Lambda 一次性調用。
+ **[簡介 sam local start-api](using-sam-cli-local-start-api.md)** – 使用本機 HTTP 伺服器執行 Lambda 函數。
+ **[簡介 sam local start-lambda](using-sam-cli-local-start-lambda.md)** – 使用本機 HTTP 伺服器執行 Lambda 函數，以搭配 AWS CLI 或 SDKs使用。

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

使用 AWS Serverless Application Model 命令列界面 (AWS SAM CLI) `sam local generate-event`子命令來產生受支援的事件承載範例 AWS 服務。然後，您可以修改這些事件並將其傳遞至本機資源進行測試。
+ 如需 的簡介 AWS SAM CLI，請參閱 [什麼是 AWS SAM CLI？](what-is-sam-overview.md#what-is-sam-cli)
+ 如需`sam local generate-event`命令選項的清單，請參閱 [sam local generate-event](sam-cli-command-reference-sam-local-generate-event.md)。

*事件*是在 AWS 服務 執行動作或任務時產生的 JSON 物件。這些事件包含特定資訊，例如已處理的資料或事件的時間戳記。大多數 AWS 服務 產生事件，每個服務的事件都會針對其服務進行唯一的格式化。

由一個服務產生的事件會做為*事件來源*傳遞給其他 服務。例如，放置在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中的項目可以產生事件。然後，此事件可以用作 AWS Lambda 函數的事件來源，以進一步處理資料。

您使用 產生的事件`sam local generate-event`格式與 AWS 服務建立的實際事件相同。您可以修改這些事件的內容，並使用它們來測試應用程式中的資源。

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

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

使用 之前`sam local generate-event`，我們建議您對以下內容有基本的了解：
+ [設定 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).

## 產生範例事件
<a name="using-sam-cli-local-generate-event-generate"></a>

使用 AWS SAM CLI`sam local generate-event`子命令為支援的 產生事件 AWS 服務。

**查看支援的清單 AWS 服務**

1. 執行下列命令：

   ```
   $ sam local generate-event
   ```

1. 支援 的清單 AWS 服務 隨即顯示。以下是範例：

   ```
   $ sam local generate-event
   ...
   Commands:
     alb
     alexa-skills-kit
     alexa-smart-home
     apigateway
     appsync
     batch
     cloudformation
     ...
   ```

**產生本機事件**

1. 執行`sam local generate-event`並提供支援的 服務名稱。這會顯示您可以產生的事件類型清單。以下是範例：

   ```
   $ sam local generate-event s3
   
   Usage: sam local generate-event s3 [OPTIONS] COMMAND [ARGS]...
   
   Options:
     -h, --help  Show this message and exit.
   
   Commands:
     batch-invocation  Generates an Amazon S3 Batch Operations Invocation Event
     delete            Generates an Amazon S3 Delete Event
     put               Generates an Amazon S3 Put Event
   ```

1. 若要產生範例事件，請執行 `sam local generate-event`，並提供 服務和事件類型。

   ```
   $ sam local generate-event <service> <event>
   ```

   以下是範例：

   ```
   $ sam local generate-event s3 put
   {
     "Records": [
       {
         "eventVersion": "2.0",
         "eventSource": "aws:s3",
         "awsRegion": "us-east-1",
         "eventTime": "1970-01-01T00:00:00.000Z",
         "eventName": "ObjectCreated:Put",
         "userIdentity": {
           "principalId": "EXAMPLE"
         },
         "requestParameters": {
           "sourceIPAddress": "127.0.0.1"
         },
         "responseElements": {
           "x-amz-request-id": "EXAMPLE123456789",
           "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
         },
         "s3": {
           "s3SchemaVersion": "1.0",
           "configurationId": "testConfigRule",
           "bucket": {
             "name": "sam-s3-demo-bucket",
             "ownerIdentity": {
               "principalId": "EXAMPLE"
             },
             "arn": "arn:aws:s3:::sam-s3-demo-bucket"
           },
           "object": {
             "key": "test/key",
             "size": 1024,
             "eTag": "0123456789abcdef0123456789abcdef",
             "sequencer": "0A1B2C3D4E5F678901"
           }
         }
       }
     ]
   }
   ```

這些範例事件包含預留位置值。您可以修改這些值，以參考應用程式中的實際資源或值，以協助進行本機測試。

**修改範例事件**

1. 您可以在命令提示字元中修改範例事件。若要查看您的選項，請執行下列動作：

   ```
   $ sam local generate-event <service> <event> --help
   ```

   以下是範例：

   ```
   $ sam local generate-event s3 put --help
   
   Usage: sam local generate-event s3 put [OPTIONS]
   
   Options:
     --region TEXT       Specify the region name you'd like, otherwise the
                         default = us-east-1
     --partition TEXT    Specify the partition name you'd like, otherwise the
                         default = aws
     --bucket TEXT       Specify the bucket name you'd like, otherwise the
                         default = example-bucket
     --key TEXT          Specify the key name you'd like, otherwise the default =
                         test/key
     --debug             Turn on debug logging to print debug message generated
                         by AWS SAM CLI and display timestamps.
     --config-file TEXT  Configuration file containing default parameter values.
                         [default: samconfig.toml]
     --config-env TEXT   Environment name specifying default parameter values in
                         the configuration file.  [default: default]
     -h, --help          Show this message and exit.
   ```

1. 在命令提示字元使用這些選項來修改您的範例事件承載。以下是範例：

   ```
   $ sam local generate-event s3 put--bucket sam-s3-demo-bucket
   
   {
     "Records": [
       {
         "eventVersion": "2.0",
         "eventSource": "aws:s3",
         "awsRegion": "us-east-1",
         "eventTime": "1970-01-01T00:00:00.000Z",
         "eventName": "ObjectCreated:Put",
         "userIdentity": {
           "principalId": "EXAMPLE"
         },
         "requestParameters": {
           "sourceIPAddress": "127.0.0.1"
         },
         "responseElements": {
           "x-amz-request-id": "EXAMPLE123456789",
           "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
         },
         "s3": {
           "s3SchemaVersion": "1.0",
           "configurationId": "testConfigRule",
           "bucket": {
             "name": "sam-s3-demo-bucket",
             "ownerIdentity": {
               "principalId": "EXAMPLE"
             },
             "arn": "arn:aws:s3:::sam-s3-demo-bucket"
           },
           "object": {
             "key": "test/key",
             "size": 1024,
             "eTag": "0123456789abcdef0123456789abcdef",
             "sequencer": "0A1B2C3D4E5F678901"
           }
         }
       }
     ]
   }
   ```

## 使用產生的事件進行本機測試
<a name="using-sam-cli-local-generate-event-use"></a>

在本機儲存您產生的事件，並使用其他`sam local`子命令進行測試。

**在本機儲存您產生的事件**
+ 執行下列命令：

  ```
  $ sam local generate-event <service> <event> <event-option> > <filename.json>
  ```

  以下是將事件儲存為專案 `events` 資料夾中`s3.json`檔案的範例。

  ```
  sam-app$ sam local generate-event s3 put --bucket amzn-s3-demo-bucket > events/s3.json
  ```

**使用產生的事件進行本機測試**
+ 使用 `--event`選項與其他`sam local`子命令一起傳遞事件。

  以下是使用 `s3.json`事件在本機叫用 Lambda 函數的範例：

  ```
  sam-app$ sam local invoke --event events/s3.json S3JsonLoggerFunction
  
  Invoking src/handlers/s3-json-logger.s3JsonLoggerHandler (nodejs18.x)
  Local image is up-to-date
  Using local image: public.ecr.aws/lambda/nodejs:18-rapid-x86_64.
  
  Mounting /Users/.../sam-app/.aws-sam/build/S3JsonLoggerFunction as /var/task:ro,delegated, inside runtime container
  START RequestId: f4f45b6d-2ec6-4235-bc7b-495ec2ae0128 Version: $LATEST
  END RequestId: f4f45b6d-2ec6-4235-bc7b-495ec2ae0128
  REPORT RequestId: f4f45b6d-2ec6-4235-bc7b-495ec2ae0128  Init Duration: 1.23 ms  Duration: 9371.93 ms      Billed Duration: 9372 ms        Memory Size: 128 MB     Max Memory Used: 128 MB
  ```

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

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

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

# 使用 進行測試的簡介 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)。

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

使用 AWS Serverless Application Model 命令列界面 (AWS SAM CLI) `sam local start-api`子命令在本機執行函數 AWS Lambda ，並透過本機 HTTP 伺服器主機進行測試。這種類型的測試對於 Amazon API Gateway 端點調用的 Lambda 函數很有幫助。
+ 如需 的簡介 AWS SAM CLI，請參閱 [什麼是 AWS SAM CLI？](what-is-sam-overview.md#what-is-sam-cli)
+ 如需`sam local start-api`命令選項的清單，請參閱 [sam local start-api](sam-cli-command-reference-sam-local-start-api.md)。
+ 如需在典型開發工作流程`sam local start-api`期間使用 的範例，請參閱 [步驟 7：（選用） 在本機測試您的應用程式](serverless-getting-started-hello-world.md#serverless-getting-started-hello-world-test)。

**注意**  
`sam local start-api` 支援具有自動檢查點和重播功能的耐用函數。耐用的函數可與本機 API Gateway 端點無縫搭配使用。

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

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

在使用 之前`sam local start-api`，我們建議您對以下內容有基本的了解：
+ [設定 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).

## 使用 sam 本機 start-api
<a name="using-sam-cli-local-start-api-use"></a>

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

**啟動本機 HTTP 伺服器**

1. 從專案的根目錄中，執行下列動作：

   ```
   $ sam local start-api <options>
   ```

1. 會在本機Docker容器中建置 Lambda AWS SAM CLI函數。然後，它會輸出 HTTP 伺服器端點的本機地址。以下是範例：

   ```
   $ sam local start-api
   
   Initializing the lambda functions containers.
   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
   Containers Initialization is done.
   Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
   You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. If you used sam build before running local commands, you will need to re-run sam build for the changes to be picked up. You only need to restart SAM CLI if you update your AWS SAM template
   2023-04-12 14:41:05 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
    * Running on http://127.0.0.1:3000
   ```

1. 您可以透過瀏覽器或命令提示叫用 Lambda 函數。以下是範例：

   ```
   sam-app$ curl http://127.0.0.1:3000/hello
   {"message": "Hello world!"}%
   ```

1. 當您變更 Lambda 函數程式碼時，請考慮下列事項以重新整理本機 HTTP 伺服器：
   + 如果您的應用程式沒有`.aws-sam`目錄，且您的 函數使用解譯語言，則 AWS SAM CLI會透過建立新容器並託管它來自動更新您的函數。
   + 如果您的應用程式確實有`.aws-sam`目錄，則需要執行 `sam build`以更新函數。然後`sam local start-api`再次執行 來託管函數。
   + 如果您的函數使用編譯語言，或您的專案需要複雜的封裝支援，請執行您自己的建置解決方案來更新您的函數。然後`sam local start-api`再次執行 以託管函數。

### 使用 Lambda 授權方的 Lambda 函數
<a name="using-sam-cli-local-start-api-authorizers"></a>

**注意**  
此功能是 1.80.0 版的新功能 AWS SAM CLI。若要升級，請參閱[升級 AWS SAM CLI](manage-sam-cli-versions.md#manage-sam-cli-versions-upgrade)。

對於使用 Lambda 授權方的 Lambda 函數， AWS SAM CLI會在叫用 Lambda 函數端點之前自動叫用您的 Lambda 授權方。

以下是為使用 Lambda 授權方的函數啟動本機 HTTP 伺服器的範例：

```
$ sam local start-api
2023-04-17 15:02:13 Attaching import module proxy for analyzing dynamic imports

AWS SAM CLI does not guarantee 100% fidelity between authorizers locally
and authorizers deployed on AWS. Any application critical behavior should
be validated thoroughly before deploying to production.

Testing application behaviour against authorizers deployed on AWS can be done using the sam sync command.

Mounting HelloWorldFunction at http://127.0.0.1:3000/authorized-request [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. If you used sam build before running local commands, you will need to re-run sam build for the changes to be picked up. You only need to restart SAM CLI if you update your AWS SAM template
2023-04-17 15:02:13 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:3000
2023-04-17 15:02:13 Press CTRL+C to quit
```

當您透過本機 HTTP 伺服器叫用 Lambda 函數端點時， AWS SAM CLI第一個叫用您的 Lambda 授權方。如果授權成功， AWS SAM CLI將調用您的 Lambda 函數端點。以下是範例：

```
$ curl http://127.0.0.1:3000/authorized-request --header "header:my_token"
{"message": "from authorizer"}%

Invoking app.authorizer_handler (python3.8)
Local image is up-to-date
Using local image: public.ecr.aws/lambda/python:3.8-rapid-x86_64.

Mounting /Users/.../sam-app/... as /var/task:ro,delegated, inside runtime container
START RequestId: 38d3b472-a2c8-4ea6-9a77-9b386989bef0 Version: $LATEST
END RequestId: 38d3b472-a2c8-4ea6-9a77-9b386989bef0
REPORT RequestId: 38d3b472-a2c8-4ea6-9a77-9b386989bef0    Init Duration: 1.08 ms    Duration: 628.26 msBilled Duration: 629 ms    Memory Size: 128 MB    Max Memory Used: 128 MB
Invoking app.request_handler (python3.8)
Using local image: public.ecr.aws/lambda/python:3.8-rapid-x86_64.

Mounting /Users/.../sam-app/... as /var/task:ro,delegated, inside runtime container
START RequestId: fdc12255-79a3-4365-97e9-9459d06446ff Version: $LATEST
END RequestId: fdc12255-79a3-4365-97e9-9459d06446ff
REPORT RequestId: fdc12255-79a3-4365-97e9-9459d06446ff    Init Duration: 0.95 ms    Duration: 659.13 msBilled Duration: 660 ms    Memory Size: 128 MB    Max Memory Used: 128 MB
No Content-Type given. Defaulting to 'application/json'.
2023-04-17 15:03:03 127.0.0.1 - - [17/Apr/2023 15:03:03] "GET /authorized-request HTTP/1.1" 200 -
```

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

### 持續重複使用容器以加速本機函數叫用
<a name="using-sam-cli-local-start-api-options-warm"></a>

根據預設，每次透過本機 HTTP 伺服器叫用函數時， AWS SAM CLI都會建立新的容器。使用 `--warm-containers`選項自動重複使用您的容器進行函數調用。這可加快 AWS SAM CLI準備 Lambda 函數以進行本機調用所需的時間。您可以提供 `eager`或 `lazy`引數，進一步自訂此選項。
+ `eager` – 所有函數的容器會在啟動時載入，並在叫用之間保留。
+ `lazy` – 只有在第一次叫用每個函數時，才會載入容器。然後，它們會保留為額外的調用。

以下是範例：

```
$ sam local start-api --warm-containers eager
```

使用`--warm-containers`和修改 Lambda 函數程式碼時：
+ 如果您的應用程式有`.aws-sam`目錄，請執行 `sam build` 以更新應用程式建置成品中的函數程式碼。
+ 偵測到程式碼變更時， AWS SAM CLI會自動關閉 Lambda 函數容器。
+ 當您再次叫用 函數時， AWS SAM CLI會自動建立新的容器。

### 指定要用於 Lambda 函數的容器映像
<a name="using-sam-cli-local-start-api-options-specify"></a>

根據預設， AWS SAM CLI會使用來自 Amazon Elastic Container Registry (Amazon ECR) 的 Lambda 基礎映像，在本機叫用您的函數。使用 `--invoke-image`選項來參考自訂容器映像。以下是範例：

```
$ sam local start-api --invoke-image public.ecr.aws/sam/emu-python3.8
```

您可以指定要與自訂容器映像搭配使用的 函數。以下是範例：

```
$ sam local start-api --invoke-image Function1=amazon/aws/sam-cli-emulation-image-python3.8
```

### 指定要在本機測試的範本
<a name="using-sam-cli-local-start-api-options-template"></a>

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

```
$ sam local start-api --template myTemplate.yaml
```

### 指定 Lambda 函數的主機開發環境
<a name="using-sam-cli-local-start-api-options-dev"></a>

根據預設， `sam local start-api`子命令會使用 `localhost` IP 地址為 的 建立 HTTP 伺服器`127.0.0.1`。如果您的本機開發環境與本機電腦隔離，您可以自訂這些值。

使用 `--container-host`選項來指定主機。以下是範例：

```
$ sam local start-api --container-host host.docker.internal
```

使用 `--container-host-interface`選項來指定容器連接埠應繫結的主機網路 IP 地址。以下是範例：

```
$ sam local start-api --container-host-interface 0.0.0.0
```

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

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

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

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

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

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

使用 AWS SAM CLI子命令透過 AWS CLI 和 SDKs `sam local start-lambda` 叫用 Lambda 函數。此命令會啟動模擬 Lambda 的本機端點。
+ 如需 的簡介 AWS SAM CLI，請參閱 [什麼是 AWS SAM CLI？](what-is-sam-overview.md#what-is-sam-cli)
+ 如需`sam local start-lambda`命令選項的清單，請參閱 [sam local start-lambda](sam-cli-command-reference-sam-local-start-lambda.md)。

**注意**  
`sam local start-lambda` 支援具有自動檢查點和重播功能的耐用函數。耐用的函數可與本機 Lambda 端點無縫搭配使用。

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

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

使用 之前`sam local start-lambda`，我們建議您對以下內容有基本的了解：
+ [設定 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).

## 使用 sam 本機 start-lambda
<a name="using-sam-cli-local-start-lambda-use"></a>

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

**使用 sam local start-lambda**

1. 從專案的根目錄中，執行下列動作：

   ```
   $ sam local start-lambda <options>
   ```

1. 會在本機Docker容器中建置 Lambda AWS SAM CLI函數。然後，它會將本機地址輸出到您的 HTTP 伺服器端點。以下是範例：

   ```
   $ sam local start-lambda
   Initializing the lambda functions containers.
   Local image is up-to-date
   Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64.
   
   Mounting /Users/.../sam-app/hello_world as /var/task:ro,delegated, inside runtime container
   Containers Initialization is done.
   Starting the Local Lambda Service. You can now invoke your Lambda Functions defined in your template through the endpoint.
   2023-04-13 07:25:43 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
    * Running on http://127.0.0.1:3001
   2023-04-13 07:25:43 Press CTRL+C to quit
   ```

1. 使用 AWS CLI 或 SDKs 在本機叫用 Lambda 函數。

   以下是使用 的範例 AWS CLI：

   ```
   $ aws lambda invoke --function-name "HelloWorldFunction" --endpoint-url "http://127.0.0.1:3001" --no-verify-ssl out.txt
       
   StatusCode: 200
   (END)
   ```

   以下是使用適用於 的 AWS SDK 的範例Python：

   ```
   import boto3
   from botocore.config import Config
   from botocore import UNSIGNED
   
   lambda_client = boto3.client('lambda',
                                endpoint_url="http://127.0.0.1:3001",
                                use_ssl=False,
                                verify=False,
                                config=Config(signature_version=UNSIGNED,
                                              read_timeout=1,
                                              retries={'max_attempts': 0}
                                              )
                               )
   lambda_client.invoke(FunctionName="HelloWorldFunction")
   ```

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

### 指定範本
<a name="using-sam-cli-local-start-lambda-options-template"></a>

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

```
$ sam local start-lambda --template myTemplate.yaml
```

如需 AWS SAM 範本的詳細資訊，請參閱 [AWS SAM 範本結構](sam-specification-template-anatomy.md)。

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

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

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

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

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