

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 sam remote invoke 在云中测试简介
<a name="using-sam-cli-remote-invoke"></a>

使用 AWS Serverless Application Model 命令行界面 (AWS SAM CLI) `sam remote invoke` 命令与中支持的 AWS 资源进行交互 AWS 云。您可使用 `sam remote invoke` 调用以下资源：
+ **Amazon Kinesis Data Streams** – 向 Kinesis Data Streams 应用程序发送数据记录。
+ **AWS Lambda** – 调用事件并将其传递给 Lambda 函数。
+ **Amazon Simple Queue Service (Amazon SQS)** – 将消息发送到 Amazon SQS 队列。
+ **AWS Step Functions** – 调用 Step Functions 状态机以开始执行。

有关简介 AWS SAMCLI，请参阅 [那是什么 AWS SAMCLI？](what-is-sam-overview.md#what-is-sam-cli)

有关在典型开发工作流程中使用 `sam remote invoke` 的示例，请参阅[第 5 步：在中与你的函数进行交互 AWS 云](serverless-getting-started-hello-world.md#serverless-getting-started-hello-world-remote-invoke)。

**Topics**
+ [使用 sam remote invoke 命令](#using-sam-cli-remote-invoke-use)
+ [使用 sam remote invoke 命令选项](#using-sam-cli-remote-invoke-options)
+ [配置您的项目配置文件](#using-sam-cli-remote-invoke-configure)
+ [示例](#using-sam-cli-remote-invoke-examples)
+ [相关链接](#using-sam-cli-remote-invoke-links)

## 先决条件
<a name="using-sam-cli-remote-invoke-prerequisites"></a>

要使用 `sam remote invoke`，请完成以下操作安装 AWS SAM CLI：
+ [AWS SAM 先决条件](prerequisites.md).
+ [安装 AWS SAM CLI](install-sam-cli.md).

我们还建议升级到最新版本的 AWS SAMCLI。要了解更多信息，请参阅[升级 AWS SAM CLI](manage-sam-cli-versions.md#manage-sam-cli-versions-upgrade)。

我们建议您在使用 `sam remote 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).
+ [使用同步sam sync到的简介 AWS 云](using-sam-cli-sync.md).

## 使用 sam remote invoke 命令
<a name="using-sam-cli-remote-invoke-use"></a>

在使用此命令之前，必须将您的资源部署到 AWS 云。

使用以下命令结构并从项目根目录运行：

```
$ sam remote invoke <arguments> <options>
```

**注意**  
此页将显示在命令提示符处提供的选项。您也可以在项目的配置文件中配置选项，而不必在命令提示符下传递这些选项。要了解更多信息，[配置项目设置](using-sam-cli-configure.md#using-sam-cli-configure-project)。

有关 `sam remote invoke` 参数和选项的说明，请参阅 [sam remote invoke](sam-cli-command-reference-remote-invoke.md)。

### 使用 Kinesis Data Streams
<a name="using-sam-cli-remote-invoke-use-kinesis"></a>

您可以将数据记录发送到 Kinesis Data Streams 应用程序。 AWS SAM CLI将发送您的数据记录并返回分片 ID 和序列号。以下是示例：

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event hello-world
	
	Putting record to Kinesis data stream KinesisStream                                                             
	Auto converting value 'hello-world' into JSON '"hello-world"'. If you don't want auto-conversion, please provide
	a JSON string as event                                                                                          
	{
	  "ShardId": "shardId-000000000000",
	  "SequenceNumber": "49646251411914806775980850790050483811301135051202232322"
	}%
```

**发送数据记录**

1. 提供资源 ID 值作为 Kinesis Data Streams 应用程序的参数。有关有效资源的信息 IDs，请参阅[资源 ID](sam-cli-command-reference-remote-invoke.md#sam-cli-command-reference-remote-invoke-args-resource-id)。

1. 提供数据记录作为事件发送到 Kinesis Data Streams 应用程序。您可以使用 `--event` 选项在命令行中提供事件，也可以使用 `--event-file` 从文件中提供事件。如果您不提供事件，则会 AWS SAM CLI发送一个空事件。

### 与 Lambda 函数一起使用
<a name="using-sam-cli-remote-invoke-use-lambda"></a>

您可以在云中调用 Lambda 函数并传递空事件，或者在命令行或文件中提供事件。 AWS SAM CLI将调用您的 Lambda 函数并返回其响应。以下是示例：

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app

Invoking Lambda Function HelloWorldFunction                                       
START RequestId: d5ef494b-5f45-4086-86fd-d7322fa1a1f9 Version: $LATEST
END RequestId: d5ef494b-5f45-4086-86fd-d7322fa1a1f9
REPORT RequestId: d5ef494b-5f45-4086-86fd-d7322fa1a1f9  Duration: 6.62 ms       Billed Duration: 7 ms     Memory Size: 128 MB     Max Memory Used: 67 MB  Init Duration: 164.06 ms
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}%
```

**要调用 Lambda 函数**

1. 提供资源 ID 值作为 Lambda 函数的参数。有关有效资源的信息 IDs，请参阅[资源 ID](sam-cli-command-reference-remote-invoke.md#sam-cli-command-reference-remote-invoke-args-resource-id)。

1. 提供向 Lambda 函数发送的事件。您可以使用 `--event` 选项在命令行中提供事件，也可以使用 `--event-file` 从文件中提供事件。如果您不提供事件，则会 AWS SAM CLI发送一个空事件。

#### 配置了响应流式处理的 Lambda 函数
<a name="using-sam-cli-remote-invoke-invoke-stream"></a>

`sam remote invoke` 命令支持配置为流式传输响应的 Lambda 函数。您可以使用模板中的`FunctionUrlConfig`属性配置 Lambda 函数以流式传输响应。 AWS SAM 使用时 `sam remote invoke`， AWS SAM CLI 将自动检测您的 Lambda 配置并通过响应流式处理进行调用。

有关示例，请参阅[调用配置为流式传输响应的 Lambda 函数](#using-sam-cli-remote-invoke-examples-lambda-stream)。

#### 将可共享的测试事件传递给云端的 Lambda 函数
<a name="using-sam-cli-remote-invoke-shareable"></a>

可共享测试事件是您可与同一 AWS 账户中的其他人共享的测试事件。要了解更多信息，请参阅*《AWS Lambda 开发人员指南》*中的[可共享测试事件](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html#creating-shareable-events)。

##### 访问和管理可共享测试事件
<a name="using-sam-cli-remote-invoke-shareable-access"></a>

您可以使用 AWS SAM CLI`sam remote test-event`命令来访问和管理可共享的测试事件。例如，您可以使用 `sam remote test-event` 来执行以下操作：
+ 从 Amazon EventBridge 架构注册表中检索可共享的测试事件。
+ 在本地修改可共享的测试事件并将其上传到 EventBridge 架构注册表。
+ 从 EventBridge 架构注册表中删除可共享的测试事件。

要了解更多信息，请参阅[使用 sam remote test-event 进行云测试简介](using-sam-cli-remote-test-event.md)。

##### 将可共享的测试事件传递给云中的 Lambda 函数
<a name="using-sam-cli-remote-invoke-shareable-pass"></a>

要将可共享的测试事件从 EventBridge 架构注册表传递到云中的 Lambda 函数，请使用`--test-event-name`选项并提供可共享测试事件的名称。以下是示例：

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --test-event-name demo-event
```

如果将可共享的测试事件保存在本地，则可以使用 `--event-file` 选项并提供本地测试事件的文件路径和名称。以下是示例：

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --event-file demo-event.json
```

### 将 与 Amazon SQS 结合使用
<a name="using-sam-cli-remote-invoke-use-sqs"></a>

您可以向 Amazon SQS 队列发送消息。 AWS SAM CLI返回以下内容：
+ 消息 ID
+ MD5 的邮件正文
+ 响应元数据

 以下是示例：

```
$ sam remote invoke MySqsQueue --stack-name sqs-example -event hello

Sending message to SQS queue MySqsQueue                                                                         
{
  "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017c592",
  "MessageId": "05c7af65-9ae8-4014-ae28-809d6d8ec652"
}%
```

**发送邮件**

1. 提供资源 ID 值作为 Amazon SQS 队列的参数。有关有效资源的信息 IDs，请参阅[资源 ID](sam-cli-command-reference-remote-invoke.md#sam-cli-command-reference-remote-invoke-args-resource-id)。

1. 提供要发送给 Amazon SQS 队列的事件。您可以使用 `--event` 选项在命令行中提供事件，也可以使用 `--event-file` 从文件中提供事件。如果您不提供事件，则会 AWS SAM CLI发送一个空事件。

### 使用 Step Functions
<a name="using-sam-cli-remote-invoke-use-sf"></a>

您可调用 Step Functions 状态机以开始执行。 AWS SAM CLI将等待状态机工作流程完成并返回执行最后一步的输出。以下是示例：

```
$ sam remote invoke HelloWorldStateMachine --stack-name state-machine-example --event '{"is_developer": true}'

Invoking Step Function HelloWorldStateMachine                                                                   
"Hello Developer World"%
```

**要调用状态机**

1. 为 Step Functions 状态机提供一个资源 ID 值作为参数。有关有效资源的信息 IDs，请参阅[资源 ID](sam-cli-command-reference-remote-invoke.md#sam-cli-command-reference-remote-invoke-args-resource-id)。

1. 提供要发送到状态机的事件。您可以使用 `--event` 选项在命令行中提供事件，也可以使用 `--event-file` 从文件中提供事件。如果您不提供事件，则会 AWS SAM CLI发送一个空事件。

## 使用 sam remote invoke 命令选项
<a name="using-sam-cli-remote-invoke-options"></a>

本节介绍一些可用于 `sam remote invoke` 命令的主要选项。有关选项的完整列表，请参阅 [sam remote invoke](sam-cli-command-reference-remote-invoke.md)。

### 将活动传递给您的资源
<a name="using-sam-cli-remote-invoke-options-event"></a>

使用以下选项将事件传递给云中的资源：
+ `--event` – 在命令行传递事件。
+ `--event-file` – 从文件传递事件。

#### Lambda 示例
<a name="using-sam-cli-remote-invoke-options-event-lambda-examples"></a>

**使用 `--event` 在命令行中将事件作为字符串值传递：**

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --event '{"message": "hello!"}'

Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
START RequestId: b992292d-1fac-4aa2-922a-c9dc5c6fceab Version: $LATEST
END RequestId: b992292d-1fac-4aa2-922a-c9dc5c6fceab
REPORT RequestId: b992292d-1fac-4aa2-922a-c9dc5c6fceab  Duration: 16.41 ms      Billed Duration: 17 ms  Memory Size: 128 MB     Max Memory Used: 67 MB  Init Duration: 185.96 ms
{"statusCode":200,"body":"{\"message\":\"hello!\"}"}%
```

**使用 `--event-file` 从文件传递事件并提供文件路径：**

```
$ cat event.json
			
{"message": "hello from file"}%    
			
$ sam remote invoke HelloWorldFunction --stack-name sam-app --event-file event.json       

Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
START RequestId: 3bc71f7d-153a-4b1e-8c9a-901d91b1bec9 Version: $LATEST
END RequestId: 3bc71f7d-153a-4b1e-8c9a-901d91b1bec9
REPORT RequestId: 3bc71f7d-153a-4b1e-8c9a-901d91b1bec9  Duration: 21.15 ms      Billed Duration: 22 ms  Memory Size: 128 MB     Max Memory Used: 67 MB
{"statusCode":200,"body":"{\"message\":\"hello from file\"}"}%
```

**使用 `stdin` 传递事件：**

```
$ cat event.json
			
{"message": "hello from file"}%    
                                                                       
$ cat event.json | sam remote invoke HelloWorldFunction --stack-name sam-app --event-file -

Reading event from stdin (you can also pass it from file with --event-file)                               
Invoking Lambda Function HelloWorldFunction                                                               
START RequestId: 85ecc902-8ad0-4a2b-a8c8-9bb4f65f5a7a Version: $LATEST
END RequestId: 85ecc902-8ad0-4a2b-a8c8-9bb4f65f5a7a
REPORT RequestId: 85ecc902-8ad0-4a2b-a8c8-9bb4f65f5a7a  Duration: 1.36 ms       Billed Duration: 2 ms   Memory Size: 128 MB       Max Memory Used: 67 MB
{"statusCode":200,"body":"{\"message\":\"hello from file\"}"}%
```

### 配置 AWS SAM CLI 响应输出
<a name="using-sam-cli-remote-invoke-options-output"></a>

当您使用 `sam remote invoke` 调用支持的资源时， AWS SAM CLI 会返回包含以下内容的响应：
+ **请求元数据** – 与请求关联的元数据。这包括请求 ID 和请求开始时间。
+ **资源响应** – 在云中被调用后来自资源的响应。

您可以使用该`--output`选项来配置 AWS SAM CLI输出响应。以下选项值可用：
+ `json` – 元数据和资源响应以 JSON 结构返回。响应包含完整 SDK 输出。
+ `text` – 元数据以文本结构返回。资源响应以资源的输出格式返回。

下面是 `json` 输出的一个示例。

```
$ sam remote invoke --stack-name sam-app --output json

Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
{
  "ResponseMetadata": {
    "RequestId": "3bdf9a30-776d-4a90-94a6-4cccc0fc7b41",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Mon, 19 Jun 2023 17:15:46 GMT",
      "content-type": "application/json",
      "content-length": "57",
      "connection": "keep-alive",
      "x-amzn-requestid": "3bdf9a30-776d-4a90-94a6-4cccc0fc7b41",
      "x-amzn-remapped-content-length": "0",
      "x-amz-executed-version": "$LATEST",
      "x-amz-log-result": "U1RBUlQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEKUkVQT1JUIFJlcXVlc3RJZDogM2JkZjlhMzAtNzc2ZC00YTkwLTk0YTYtNGNjY2MwZmM3YjQxCUR1cmF0aW9uOiA4LjIzIG1zCUJpbGxlZCBEdXJhdGlvbjogOSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjggTUIJCg==",
      "x-amzn-trace-id": "root=1-64908d42-17dab270273fcc6b527dd6b8;sampled=0;lineage=2301f8dc:0"
    },
    "RetryAttempts": 0
  },
  "StatusCode": 200,
  "LogResult": "U1RBUlQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEKUkVQT1JUIFJlcXVlc3RJZDogM2JkZjlhMzAtNzc2ZC00YTkwLTk0YTYtNGNjY2MwZmM3YjQxCUR1cmF0aW9uOiA4LjIzIG1zCUJpbGxlZCBEdXJhdGlvbjogOSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjggTUIJCg==",
  "ExecutedVersion": "$LATEST",
  "Payload": "{\"statusCode\":200,\"body\":\"{\\\"message\\\":\\\"hello world\\\"}\"}"
}%
```

当您指定 `json` 输出时，整个响应将返回到 `stdout`。以下是示例：

```
$ sam remote invoke --stack-name sam-app --output json 1> stdout.log

Invoking Lambda Function HelloWorldFunction           
                                                                                                                                                                                                          
$ cat stdout.log
			
{
  "ResponseMetadata": {
    "RequestId": "d30d280f-8188-4372-bc94-ce0f1603b6bb",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Mon, 19 Jun 2023 17:35:56 GMT",
      "content-type": "application/json",
      "content-length": "57",
      "connection": "keep-alive",
      "x-amzn-requestid": "d30d280f-8188-4372-bc94-ce0f1603b6bb",
      "x-amzn-remapped-content-length": "0",
      "x-amz-executed-version": "$LATEST",
      "x-amz-log-result": "U1RBUlQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIKUkVQT1JUIFJlcXVlc3RJZDogZDMwZDI4MGYtODE4OC00MzcyLWJjOTQtY2UwZjE2MDNiNmJiCUR1cmF0aW9uOiA0LjE2IG1zCUJpbGxlZCBEdXJhdGlvbjogNSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjcgTUIJSW5pdCBEdXJhdGlvbjogMTU4LjM5IG1zCQo=",
      "x-amzn-trace-id": "root=1-649091fc-771473c7778689627a6122b7;sampled=0;lineage=2301f8dc:0"
    },
    "RetryAttempts": 0
  },
  "StatusCode": 200,
  "LogResult": "U1RBUlQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIKUkVQT1JUIFJlcXVlc3RJZDogZDMwZDI4MGYtODE4OC00MzcyLWJjOTQtY2UwZjE2MDNiNmJiCUR1cmF0aW9uOiA0LjE2IG1zCUJpbGxlZCBEdXJhdGlvbjogNSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjcgTUIJSW5pdCBEdXJhdGlvbjogMTU4LjM5IG1zCQo=",
  "ExecutedVersion": "$LATEST",
  "Payload": "{\"statusCode\":200,\"body\":\"{\\\"message\\\":\\\"hello world\\\"}\"}"
}%
```

下面是 `text` 输出的一个示例。

```
$ sam remote invoke --stack-name sam-app --output text

Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
START RequestId: 4dbacc43-1ec6-47c2-982b-9dc4620144d6 Version: $LATEST
END RequestId: 4dbacc43-1ec6-47c2-982b-9dc4620144d6
REPORT RequestId: 4dbacc43-1ec6-47c2-982b-9dc4620144d6  Duration: 9.13 ms       Billed Duration: 10 ms  Memory Size: 128 MB     Max Memory Used: 67 MB  Init Duration: 165.50 ms
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}%
```

当您指定 `text` 输出时，Lambda 函数运行时系统输出（例如日志）将返回到 `stderr`。Lambda 函数的有效负载将返回到 `stdout`。以下是示例：

```
$ sam remote invoke --stack-name sam-app --output text 2> stderr.log

{"statusCode":200,"body":"{\"message\":\"hello world\"}"}% 
                                                                                                                                                                                                     
$ cat stderr.log

Invoking Lambda Function HelloWorldFunction
START RequestId: 82273c3b-aa3a-4d16-8f1c-1d2ad3ace891 Version: $LATEST
END RequestId: 82273c3b-aa3a-4d16-8f1c-1d2ad3ace891
REPORT RequestId: 82273c3b-aa3a-4d16-8f1c-1d2ad3ace891  Duration: 40.62 ms      Billed Duration: 41 ms  Memory Size: 128 MB     Max Memory Used: 68 MB

$ sam remote invoke --stack-name sam-app --output text 1> stdout.log
 
Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
START RequestId: 74acaa9f-5b80-4a5c-b3b8-ffaccb84cbbd Version: $LATEST
END RequestId: 74acaa9f-5b80-4a5c-b3b8-ffaccb84cbbd
REPORT RequestId: 74acaa9f-5b80-4a5c-b3b8-ffaccb84cbbd  Duration: 2.31 ms       Billed Duration: 3 ms   Memory Size: 128 MB     Max Memory Used: 67 MB

$ cat stdout.log

{"statusCode":200,"body":"{\"message\":\"hello world\"}"}%
```

### 自定义 Boto3 参数
<a name="using-sam-cli-remote-invoke-options-boto3"></a>

对于`sam remote invoke`， AWS SAM CLI利用适用于 Python 的 AWS SDK (Boto3) 与你的云端资源进行交互。您可以使用 `--parameter` 选项自定义 Boto3 参数。有关可自定义受支持的参数的列表，请参阅 `--parameter`。

#### 示例
<a name="using-sam-cli-remote-invoke-options-boto3-examples"></a>

**调用 Lambda 函数来验证参数值并验证权限：**

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --parameter InvocationType="DryRun"
```

**在单个命令中多次使用 `--parameter` 选项以提供多个参数：**

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --parameter InvocationType="Event" --parameter LogType="None"
```

### 其他选项
<a name="using-sam-cli-remote-invoke-options-other"></a>

有关 `sam remote invoke` 选项的完整列表，请参阅 [sam remote invoke](sam-cli-command-reference-remote-invoke.md)。

## 配置您的项目配置文件
<a name="using-sam-cli-remote-invoke-configure"></a>

要在配置文件中配置 `sam remote invoke`，请在表中使用 `remote_invoke`。以下是配置 `sam remote invoke` 命令默认值的 `samconfig.toml` 文件示例。

```
...
version =0.1

[default]
...
[default.remote_invoke.parameters]
stack_name = "cloud-app"
event = '{"message": "Hello!"}'
```

## 示例
<a name="using-sam-cli-remote-invoke-examples"></a>

有关使用的基本示例`sam remote invoke`，请参阅 C *AWS ompute 博客*中的[使用 AWS SAM 远程测试 AWS Lambda 函数](https://aws.amazon.com/blogs/compute/testing-aws-lambda-functions-with-aws-sam-remote-invoke/)。

### Kinesis Data Streams 示例
<a name="using-sam-cli-remote-invoke-examples-kinesis"></a>

#### 基本示例
<a name="using-sam-cli-remote-invoke-examples-kinesis-basic"></a>

**将数据记录从文件发送到 Kinesis Data Streams 应用程序。Kinesis Data Streams 应用程序是通过提供资源 ID 的 ARN 来识别的：**

```
$ sam remote invoke arn:aws:kinesis:us-west-2:01234567890:stream/kinesis-example-KinesisStream-BgnLcAey4xUQ --event-file event.json
```

**将命令行中提供的事件发送到 Kinesis Data Streams 应用程序：**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event hello-world

Putting record to Kinesis data stream KinesisStream                                                             
Auto converting value 'hello-world' into JSON '"hello-world"'. If you don't want auto-conversion, please provide
a JSON string as event                                                                                          
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980903986194508740483329854174920706"
}%
```

**获取 Kinesis Data Streams 应用程序的物理 ID。然后，在命令行中提供一个事件：**

```
$ sam list resources --stack-name kinesis-example --output json

[
  {
    "LogicalResourceId": "KinesisStream",
    "PhysicalResourceId": "kinesis-example-KinesisStream-ZgnLcQey4xUQ"
  }
]

$ sam remote invoke kinesis-example-KinesisStream-ZgnLcQey4xUQ --event hello

Putting record to Kinesis data stream KinesisStream                                                             
Auto converting value 'hello' into JSON '"hello"'. If you don't want auto-conversion, please provide a JSON     
string as event                                                                                                 
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980904340716841045751814812900261890"
}%
```

**在命令行中提供一个 JSON 字符串作为事件：**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event '{"method": "GET", "body": ""}'                      

Putting record to Kinesis data stream KinesisStream                                                             
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980904492868617924990209230536441858"
}%
```

**向 Kinesis Data Streams 应用程序发送一个空事件：**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example

Putting record to Kinesis data stream KinesisStream                                                             
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980904866469008589597168190416224258"
}%
```

**以 JSON 格式返回 AWS SAM CLI响应：**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event '{"hello": "world"}' --output json

Putting record to Kinesis data stream KinesisStream                                                             
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980905078409420803696667195489648642",
  "ResponseMetadata": {
    "RequestId": "ebbbd307-3e9f-4431-b67c-f0715e9e353e",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "x-amzn-requestid": "ebbbd307-3e9f-4431-b67c-f0715e9e353e",
      "x-amz-id-2": "Q3yBcgTwtPaQTV26IKclbECmZikUYOzKY+CzcxA84ZHgCkc5T2N/ITWg6RPOQcWw8Gn0tNPcEJBEHyVVqboJAPgCritqsvCu",
      "date": "Thu, 09 Nov 2023 18:13:10 GMT",
      "content-type": "application/x-amz-json-1.1",
      "content-length": "110"
    },
    "RetryAttempts": 0
  }
}%
```

**将 JSON 输出返回到标准输出：**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event '{"hello": "world"}' --output json 1> stdout.log

Putting record to Kinesis data stream KinesisStream                                                             

$ cat stdout.log
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980906397777867595039988349006774274",
  "ResponseMetadata": {
    "RequestId": "f4290006-d84b-b1cd-a9ee-28306eeb2939",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "x-amzn-requestid": "f4290006-d84b-b1cd-a9ee-28306eeb2939",
      "x-amz-id-2": "npCqz+IBKpoL4sQ1ClbUmxuJlbeA24Fx1UgpIrS6mm2NoIeV2qdZSN5AhNurdssykXajBrXaC9anMhj2eG/h7Hnbf+bPuotU",
      "date": "Thu, 09 Nov 2023 18:33:26 GMT",
      "content-type": "application/x-amz-json-1.1",
      "content-length": "110"
    },
    "RetryAttempts": 0
  }
}%
```

### Lambda 示例
<a name="using-sam-cli-remote-invoke-examples-lambda"></a>

#### 基本示例
<a name="using-sam-cli-remote-invoke-examples-lambda-basic"></a>

**通过提供 ARN 作为资源 ID 来调用 Lambda 函数：**

```
$ sam remote invoke arn:aws:lambda:us-west-2:012345678910:function:sam-app-HelloWorldFunction-ohRFEn2RuAvp
```

**通过提供逻辑 ID 作为资源 ID 来调用 Lambda 函数：**

您还必须使用`--stack-name`选项提供 CloudFormation 堆栈名称。以下是示例：

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app
```

如果应用程序包含单个 Lambda 函数，则无需指定其逻辑 ID。您只能提供 `--stack-name` 选项。以下是示例：

```
$ sam remote invoke --stack-name sam-app
```

**通过提供物理 ID 作为资源 ID 来调用 Lambda 函数：**

物理 ID 是在使用进行部署时创建 CloudFormation的。

```
$ sam remote invoke sam-app-HelloWorldFunction-TZvxQRFNv0k4
```

**调用子堆栈的 Lambda 函数：**

在本示例中，应用程序包含以下目录结构：

```
lambda-example
├── childstack
│   ├── function
│   │   ├── __init__.py
│   │   ├── app.py
│   │   └── requirements.txt
│   └── template.yaml
├── events
│   └── event.json
├── samconfig.toml
└── template.yaml
```

要调用 `childstack` 的 Lambda 函数，我们运行以下命令：

```
$ sam remote invoke ChildStack/HelloWorldFunction --stack-name lambda-example

Invoking Lambda Function HelloWorldFunction                                                                     
START RequestId: 207a864b-e67c-4307-8478-365b004d4bcd Version: $LATEST
END RequestId: 207a864b-e67c-4307-8478-365b004d4bcd
REPORT RequestId: 207a864b-e67c-4307-8478-365b004d4bcd  Duration: 1.27 ms       Billed Duration: 2 ms   Memory Size: 128 MB     Max Memory Used: 36 MB  Init Duration: 111.07 ms
{"statusCode": 200, "body": "{\"message\": \"Hello\", \"received_event\": {}}"}%
```

#### 调用配置为流式传输响应的 Lambda 函数
<a name="using-sam-cli-remote-invoke-examples-lambda-stream"></a>

在此示例中，我们使用 AWS SAM CLI 来初始化一个新的无服务器应用程序，其包含配置为流式传输其响应的 Lambda 函数。我们将应用程序部署到 AWS 云 并使用与我们在云中的功能进行交互。`sam remote invoke`

我们首先运行 `sam init` 命令来创建新的无服务器应用程序。我们选择 **Lambda 响应流**快速入门模板并命名我们的应用程序。**lambda-streaming-nodejs-app**

```
$ sam init
	
	You can preselect a particular runtime or package type when using the `sam init` experience.
	Call `sam init --help` to learn more.
	
	Which template source would you like to use?
	        1 - AWS Quick Start Templates
	        2 - Custom Template Location
	Choice: 1
	
	Choose an AWS Quick Start application template
	        1 - Hello World Example
	        ...
	        9 - Lambda Response Streaming
	        ...
	        15 - Machine Learning
	Template: 9
	
	Which runtime would you like to use?
	        1 - go (provided.al2)
	        2 - nodejs18.x
	        3 - nodejs16.x
	Runtime: 2
	
	Based on your selections, the only Package type available is Zip.
	We will proceed to selecting the Package type as Zip.
	
	Based on your selections, the only dependency manager available is npm.
	We will proceed copying the template using npm.
	
	Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: ENTER
	
	Would you like to enable monitoring using CloudWatch Application Insights?
	For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: ENTER
	
	Project name [sam-app]: lambda-streaming-nodejs-app
	
	    -----------------------
	    Generating application:
	    -----------------------
	    Name: lambda-streaming-nodejs-app
	    Runtime: nodejs18.x
	    Architectures: x86_64
	    Dependency Manager: npm
	    Application Template: response-streaming
	    Output Directory: .
	    Configuration file: lambda-streaming-nodejs-app/samconfig.toml
	    
	    Next steps can be found in the README file at lambda-streaming-nodejs-app/README.md
	        
	
	Commands you can use next
	=========================
	[*] Create pipeline: cd lambda-streaming-nodejs-app && sam pipeline init --bootstrap
	[*] Validate SAM template: cd lambda-streaming-nodejs-app && sam validate
	[*] Test Function in the Cloud: cd lambda-streaming-nodejs-app && sam sync --stack-name {stack-name} --watch
```

使用以下结构 AWS SAMCLI创建我们的项目：

```
lambda-streaming-nodejs-app
	├── README.md
	├── __tests__
	│   └── unit
	│       └── index.test.js
	├── package.json
	├── samconfig.toml
	├── src
	│   └── index.js
	└── template.yaml
```

以下是 Lambda 函数代码的示例：

```
exports.handler = awslambda.streamifyResponse(
	  async (event, responseStream, context) => {
	    const httpResponseMetadata = {
	      statusCode: 200,
	      headers: {
	        "Content-Type": "text/html",
	        "X-Custom-Header": "Example-Custom-Header"
	      }
	    };
	
	    responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata);
	    // It's recommended to use a `pipeline` over the `write` method for more complex use cases.
	    // Learn more: https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html
	    responseStream.write("<html>");
	    responseStream.write("<p>First write!</p>");
	
	    responseStream.write("<h1>Streaming h1</h1>");
	    await new Promise(r => setTimeout(r, 1000));
	    responseStream.write("<h2>Streaming h2</h2>");
	    await new Promise(r => setTimeout(r, 1000));
	    responseStream.write("<h3>Streaming h3</h3>");
	    await new Promise(r => setTimeout(r, 1000));
	
	    // Long strings will be streamed
	    const loremIpsum1 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vitae mi tincidunt tellus ultricies dignissim id et diam. Morbi pharetra eu nisi et finibus. Vivamus diam nulla, vulputate et nisl cursus, pellentesque vehicula libero. Cras imperdiet lorem ante, non posuere dolor sollicitudin a. Vestibulum ipsum lacus, blandit nec augue id, lobortis dictum urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Morbi auctor orci eget tellus aliquam, non maximus massa porta. In diam ante, pulvinar aliquam nisl non, elementum hendrerit sapien. Vestibulum massa nunc, mattis non congue vitae, placerat in quam. Nam vulputate lectus metus, et dignissim erat varius a.";
	    responseStream.write(`<p>${loremIpsum1}</p>`);
	    await new Promise(r => setTimeout(r, 1000));
	
	    responseStream.write("<p>DONE!</p>");
	    responseStream.write("</html>");
	    responseStream.end();
	  }
	);
```

以下是 `template.yaml` 文件的示例。Lambda 函数的响应流式传输是使用 `FunctionUrlConfig` 属性配置的。

```
AWSTemplateFormatVersion: '2010-09-09'
	Transform: AWS::Serverless-2016-10-31
	
	Description: >
	  Sample SAM Template for lambda-streaming-nodejs-app
	  
	Resources:
	  StreamingFunction:
	    Type: AWS::Serverless::Function
	    Properties:
	      CodeUri: src/
	      Handler: index.handler
	      Runtime: nodejs18.x
	      Architectures:
	        - x86_64
	      Timeout: 10
	      FunctionUrlConfig:
	        AuthType: AWS_IAM
	        InvokeMode: RESPONSE_STREAM
	
	Outputs:
	  StreamingFunction:
	    Description: "Streaming Lambda Function ARN"
	    Value: !GetAtt StreamingFunction.Arn
	  StreamingFunctionURL:
	    Description: "Streaming Lambda Function URL"
	    Value: !GetAtt StreamingFunctionUrl.FunctionUrl
```

通常，您可以使用 `sam build` 和 `sam deploy --guided` 来构建和部署生产应用程序。在此示例中，我们将假设开发环境并使用 `sam sync` 命令来构建和部署应用程序。

**注意**  
建议在开发环境中使用 `sam sync` 命令。要了解更多信息，请参阅[使用同步sam sync到的简介 AWS 云](using-sam-cli-sync.md)。

在运行 `sam sync` 之前，我们会验证 `samconfig.toml` 文件中的项目是否配置正确。最重要的是，我们会验证 `stack_name` 和 `watch` 的值。在配置文件中指定了这些值后，我们就不必在命令行中提供它们了。

```
version = 0.1
	
	[default]
	[default.global.parameters]
	stack_name = "lambda-streaming-nodejs-app"
	
	[default.build.parameters]
	cached = true
	parallel = true
	
	[default.validate.parameters]
	lint = true
	
	[default.deploy.parameters]
	capabilities = "CAPABILITY_IAM"
	confirm_changeset = true
	resolve_s3 = true
	s3_prefix = "lambda-streaming-nodejs-app"
	region = "us-west-2"
	image_repositories = []
	
	[default.package.parameters]
	resolve_s3 = true
	
	[default.sync.parameters]
	watch = true
	
	[default.local_start_api.parameters]
	warm_containers = "EAGER"
	
	[default.local_start_lambda.parameters]
	warm_containers = "EAGER"
```

接下来，我们运行 `sam sync` 来构建和部署应用程序。由于 `--watch` 选项是在我们的配置文件中配置的，因此 AWS SAM CLI 将构建应用程序、部署应用程序并注意更改。

```
$ sam sync
	
	The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code   
	without                                                                                                   
	performing a CloudFormation deployment. This will cause drift in your CloudFormation stack.               
	**The sync command should only be used against a development stack**.                                     
	                                                                                                          
	Queued infra sync. Waiting for in progress code syncs to complete...                                      
	Starting infra sync.                                                                                      
	Building codeuri:                                                                                         
	/Users/.../lambda-streaming-nodejs-app/src runtime: nodejs18.x metadata: {} architecture: x86_64 functions: StreamingFunction  
	package.json file not found. Continuing the build without dependencies.                                   
	Running NodejsNpmBuilder:CopySource                                                                       
	
	Build Succeeded
	
	Successfully packaged artifacts and wrote output template to file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpavrzdhgp.
	Execute the following command to deploy the packaged template
	sam deploy --template-file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpavrzdhgp --stack-name <YOUR STACK NAME>
	
	
	        Deploying with following values
	        ===============================
	        Stack name                   : lambda-streaming-nodejs-app
	        Region                       : us-west-2
	        Disable rollback             : False
	        Deployment s3 bucket         : aws-sam-cli-managed-default-samclisam-s3-demo-bucket-1a4x26zbcdkqr
	        Capabilities                 : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"]
	        Parameter overrides          : {}
	        Signing Profiles             : null
	
	Initiating deployment
	=====================
	
	
	2023-06-20 12:11:16 - Waiting for stack create/update to complete
	
	CloudFormation events from stack operations (refresh every 0.5 seconds)
	-----------------------------------------------------------------------------------------------------
	ResourceStatus            ResourceType              LogicalResourceId         ResourceStatusReason    
	-----------------------------------------------------------------------------------------------------
	CREATE_IN_PROGRESS        AWS::CloudFormation::St   lambda-streaming-         Transformation          
	                          ack                       nodejs-app                succeeded               
	CREATE_IN_PROGRESS        AWS::IAM::Role            StreamingFunctionRole     -                       
	CREATE_IN_PROGRESS        AWS::CloudFormation::St   AwsSamAutoDependencyLay   -                       
	                          ack                       erNestedStack                                     
	CREATE_IN_PROGRESS        AWS::IAM::Role            StreamingFunctionRole     Resource creation       
	                                                                              Initiated               
	CREATE_IN_PROGRESS        AWS::CloudFormation::St   AwsSamAutoDependencyLay   Resource creation       
	                          ack                       erNestedStack             Initiated               
	CREATE_COMPLETE           AWS::IAM::Role            StreamingFunctionRole     -                       
	CREATE_COMPLETE           AWS::CloudFormation::St   AwsSamAutoDependencyLay   -                       
	                          ack                       erNestedStack                                     
	CREATE_IN_PROGRESS        AWS::Lambda::Function     StreamingFunction         -                       
	CREATE_IN_PROGRESS        AWS::Lambda::Function     StreamingFunction         Resource creation       
	                                                                              Initiated               
	CREATE_COMPLETE           AWS::Lambda::Function     StreamingFunction         -                       
	CREATE_IN_PROGRESS        AWS::Lambda::Url          StreamingFunctionUrl      -                       
	CREATE_IN_PROGRESS        AWS::Lambda::Url          StreamingFunctionUrl      Resource creation       
	                                                                              Initiated               
	CREATE_COMPLETE           AWS::Lambda::Url          StreamingFunctionUrl      -                       
	CREATE_COMPLETE           AWS::CloudFormation::St   lambda-streaming-         -                       
	                          ack                       nodejs-app                                        
	-----------------------------------------------------------------------------------------------------
	
	CloudFormation outputs from deployed stack
	-------------------------------------------------------------------------------------------------------
	Outputs                                                                                               
	-------------------------------------------------------------------------------------------------------
	Key                 StreamingFunction                                                                 
	Description         Streaming Lambda Function ARN                                                     
	Value               arn:aws:lambda:us-west-2:012345678910:function:lambda-streaming-nodejs-app-       
	StreamingFunction-gUmhO833A0vZ                                                                        
	
	Key                 StreamingFunctionURL                                                              
	Description         Streaming Lambda Function URL                                                     
	Value               https://wxgkcc2dyntgtrwhf2dgdcvylu0rnnof.lambda-url.us-west-2.on.aws/             
	-------------------------------------------------------------------------------------------------------
	
	                                                                                                          
	Stack creation succeeded. Sync infra completed.                                                           
	                                                                                                          
	Infra sync completed.
```

现在函数已经部署到云端，我们可以使用 `sam remote invoke` 与函数进行交互。 AWS SAM CLI 自动检测到函数已配置为响应流式传输，并立即开始实时输出函数的流式响应。

```
$ sam remote invoke StreamingFunction
	
	Invoking Lambda Function StreamingFunction                                              
	{"statusCode":200,"headers":{"Content-Type":"text/html","X-Custom-Header":"Example-Custom-Header"}}<html><p>First write!</p><h1>Streaming h1</h1><h2>Streaming h2</h2><h3>Streaming h3</h3><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vitae mi tincidunt tellus ultricies dignissim id et diam. Morbi pharetra eu nisi et finibus. Vivamus diam nulla, vulputate et nisl cursus, pellentesque vehicula libero. Cras imperdiet lorem ante, non posuere dolor sollicitudin a. Vestibulum ipsum lacus, blandit nec augue id, lobortis dictum urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Morbi auctor orci eget tellus aliquam, non maximus massa porta. In diam ante, pulvinar aliquam nisl non, elementum hendrerit sapien. Vestibulum massa nunc, mattis non congue vitae, placerat in quam. Nam vulputate lectus metus, et dignissim erat varius a.</p><p>DONE!</p></html>START RequestId: 1e4cdf04-60de-4769-b3a2-c1481982deb4 Version: $LATEST
	END RequestId: 1e4cdf04-60de-4769-b3a2-c1481982deb4
	REPORT RequestId: 1e4cdf04-60de-4769-b3a2-c1481982deb4  Duration: 4088.66 ms    Billed Duration: 4089 ms        Memory Size: 128 MB     Max Memory Used: 68 MB  Init Duration: 168.45 ms
```

当我们修改函数代码时， AWS SAM CLI 会立即检测并立即部署我们的更改。以下是对函数代码进行更改后的 AWS SAM CLI 输出示例：

```
Syncing Lambda Function StreamingFunction...                                             
	Building codeuri:                                                                        
	/Users/.../lambda-streaming-nodejs-app/src runtime: nodejs18.x metadata: {} architecture:    
	x86_64 functions: StreamingFunction                                                      
	package.json file not found. Continuing the build without dependencies.                  
	Running NodejsNpmBuilder:CopySource                                                      
	Finished syncing Lambda Function StreamingFunction.                                      
	Syncing Layer StreamingFunctione9cfe924DepLayer...                                       
	SyncFlow [Layer StreamingFunctione9cfe924DepLayer]: Skipping resource update as the      
	content didn't change                                                                    
	Finished syncing Layer StreamingFunctione9cfe924DepLayer.
```

现在，我们可以再次使用 `sam remote invoke` 与云端函数进行交互并测试我们的更改。

### SQS 示例
<a name="using-sam-cli-remote-invoke-examples-sqs"></a>

#### 基本示例
<a name="using-sam-cli-remote-invoke-examples-sqs-basic"></a>

**通过提供 ARN 作为资源 ID 来调用 Amazon SQS 队列：**

```
$ sam remote invoke arn:aws:sqs:us-west-2:01234567890:sqs-example-4DonhBsjsW1b --event '{"hello": "world"}' --output json

Sending message to SQS queue MySqsQueue                                                                         
{
  "MD5OfMessageBody": "49dfdd54b01cbcd2d2ab5e9e5ee6b9b9",
  "MessageId": "4f464cdd-15ef-4b57-bd72-3ad225d80adc",
  "ResponseMetadata": {
    "RequestId": "95d39377-8323-5ef0-9223-ceb198bd09bd",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "x-amzn-requestid": "95d39377-8323-5ef0-9223-ceb198bd09bd",
      "date": "Wed, 08 Nov 2023 23:27:26 GMT",
      "content-type": "application/x-amz-json-1.0",
      "content-length": "106",
      "connection": "keep-alive"
    },
    "RetryAttempts": 0
  }
}%
```

### Step Functions 示例
<a name="using-sam-cli-remote-invoke-examples-sf"></a>

#### 基本示例
<a name="using-sam-cli-remote-invoke-examples-sf-basic"></a>

**通过提供物理 ID 作为资源 ID 来调用状态机：**

首先，我们使用 `sam list resources` 来获取物理 ID：

```
$ sam list resources --stack-name state-machine-example --output json

[
  {
    "LogicalResourceId": "HelloWorldStateMachine",
    "PhysicalResourceId": "arn:aws:states:us-west-2:513423067560:stateMachine:HelloWorldStateMachine-z69tFEUx0F66"
  },
  {
    "LogicalResourceId": "HelloWorldStateMachineRole",
    "PhysicalResourceId": "simple-state-machine-HelloWorldStateMachineRole-PduA0BDGuFXw"
  }
]
```

接下来，我们使用物理 ID 作为资源 ID 来调用状态机。我们通过 `--event` 选项在命令行传递事件：

```
$ sam remote invoke arn:aws:states:us-west-2:01234567890:stateMachine:HelloWorldStateMachine-z69tFEUx0F66 --event '{"is_developer": true}'

Invoking Step Function arn:aws:states:us-west-2:01234567890:stateMachine:HelloWorldStateMachine-z69tFEUx0F66   
"Hello Developer World"%
```

**通过传递一个空事件来调用状态机：**

```
$ sam remote invoke HelloWorldStateMachine --stack-name state-machine-example

Invoking Step Function HelloWorldStateMachine                                                                   
"Hello World"%
```

## 相关链接
<a name="using-sam-cli-remote-invoke-links"></a>

有关`sam remote invoke`和使用的文档 AWS SAMCLI，请参阅以下内容：
+ [sam remote invoke](sam-cli-command-reference-remote-invoke.md)
+ [AWS SAM CLI 故障排除](sam-cli-troubleshooting.md)