

# 教程：使用函数 URL 创建响应流式处理 Lambda 函数
<a name="response-streaming-tutorial"></a>

在本教程中，您将创建一个 Lambda 函数，该函数定义为 .zip 文件存档，其函数 URL 端点会返回响应流。有关配置函数 URL 的更多信息，请参阅 [函数 URL](urls-configuration.md)。

## 先决条件
<a name="response-streaming-prepare"></a>

本教程假设您对 Lambda 基本操作和 Lambda 控制台有一定了解。如果您还没有了解，请按照 [使用控制台创建 Lambda 函数](getting-started.md#getting-started-create-function) 中的说明创建您的第一个 Lambda 函数。

要完成以下步骤，您需要 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。在单独的数据块中列出了命令和预期输出：

```
aws --version
```

您应看到以下输出：

```
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
```

对于长命令，使用转义字符 (`\`) 将命令拆分为多行。

在 Linux 和 macOS 中，可使用您首选的 shell 和程序包管理器。

**注意**  
在 Windows 中，操作系统的内置终端不支持您经常与 Lambda 一起使用的某些 Bash CLI 命令（例如 `zip`）。[安装 Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，获取 Ubuntu 和 Bash 与 Windows 集成的版本。本指南中的示例 CLI 命令使用 Linux 格式。如果您使用的是 Windows CLI，则必须重新格式化包含内联 JSON 文档的命令。

## 创建执行角色
<a name="response-streaming-create-iam-role"></a>

创建[执行角色](lambda-intro-execution-role.md)，向您的 Lambda 函数授予访问AWS资源的权限。

**创建执行角色**

1. 打开 AWS Identity and Access Management（IAM）控制台的 [Roles](https://console.aws.amazon.com/iam/home#/roles)（角色）页面。

1. 选择**创建角色**。

1. 创建具有以下属性的角色：
   + **可信实体类型** – **AWS 服务**
   + **使用场景** – **Lambda**
   + **权限** – **AWSLambdaBasicExecutionRole**
   + **Role name**（角色名称）– **response-streaming-role**

**AWSLambdaBasicExecutionRole** 策略具有函数将日志写入 Amazon CloudWatch Logs 所需的权限。创建角色后，记下其 Amazon 资源名称（ARN）。下一步中需要使用该值。

## 创建响应流式处理函数（AWS CLI）
<a name="response-streaming-tutorial-create-function-cli"></a>

使用 AWS Command Line Interface（AWS CLI）创建具有函数 URL 端点的响应流式处理 Lambda 函数。

**创建能够流式处理响应的函数**

1. 将以下代码示例复制到名为 `index.js` 的文件中。此函数流式传输三个间隔为 1 秒的响应。

   ```
   exports.handler = awslambda.streamifyResponse(
   	async (event, responseStream, _context) => {
   		// Metadata is a JSON serializable JS object. Its shape is not defined here.
   		const metadata = {
   		statusCode: 200,
   		headers: {
   			"Content-Type": "application/json",
   			"CustomHeader": "outerspace"
   		}
   		};
   	
   		// Assign to the responseStream parameter to prevent accidental reuse of the non-wrapped stream.
   		responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);
   	
   		responseStream.write("Streaming with Helper \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 0 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 1 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 2 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.end();
   		await responseStream.finished();
   	}
     );
   ```

1. 创建部署程序包。

   ```
   zip function.zip index.js
   ```

1. 使用 `create-function` 命令创建 Lambda 函数。将 `--role` 的值替换为上一步中的角色 ARN。此命令将函数超时设置为 10 秒，这样函数就可以流式传输三个响应。

   ```
   aws lambda create-function \
     --function-name my-streaming-function \
     --runtime nodejs24.x \
     --zip-file fileb://function.zip \
     --handler index.handler \
     --timeout 10 \
     --role arn:aws:iam::123456789012:role/response-streaming-role
   ```

**创建函数 URL**

1. 向函数添加基于资源的策略，授予 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction` 权限。每条语句都必须添加到单独的命令中。将 `--principal` 的值替换为您的 AWS 账户 ID。

   ```
   aws lambda add-permission \
     --function-name my-streaming-function \
     --action lambda:InvokeFunctionUrl \
     --statement-id UrlPolicyInvokeURL \
     --principal 123456789012 \
     --function-url-auth-type AWS_IAM
   ```

   ```
   aws lambda add-permission \
       --function-name my-streaming-function \
       --action lambda:InvokeFunction \
       --statement-id UrlPolicyInvokeFunction \
       --principal 123456789012
   ```

1. 使用 `create-function-url-config` 命令为函数创建 URL 端点。

   ```
   aws lambda create-function-url-config \
     --function-name my-streaming-function \
     --auth-type AWS_IAM \
     --invoke-mode RESPONSE_STREAM
   ```
**注意**  
如果收到 `--invoke-mode` 错误，可能需要升级到[新版 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

## 测试函数 URL 端点
<a name="response-streaming-tutorial-test"></a>

通过调用函数来测试集成。您可以在浏览器中打开函数的 URL，也可以使用 curl。

```
curl --request GET "https://abcdefghijklm7nop7qrs740abcd.lambda-url.us-east-1.on.aws/" --user "AKIAIOSFODNN7EXAMPLE" --aws-sigv4 "aws:amz:us-east-1:lambda" --no-buffer
```

我们的函数 URL 使用 `IAM_AUTH` 身份验证类型。这意味着您必须使用 [AWS 访问密钥和私有密钥才能签署请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)。在上一条命令中，将 `AKIAIOSFODNN7EXAMPLE` 替换为 AWS 访问密钥 ID。请在出现提示时输入 AWS 私有密钥。如果没有 AWS 私有密钥，可以改为[使用临时 AWS 凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)。

应出现如下响应：

```
Streaming with Helper 
Hello 0 
Hello 1
Hello 2
```

## 清除资源
<a name="cleanup"></a>

除非您想要保留为本教程创建的资源，否则可立即将其删除。通过删除您不再使用的 AWS 资源，可防止您的 AWS 账户 产生不必要的费用。

**删除执行角色**

1. 打开 IAM 控制台的[角色页面](https://console.aws.amazon.com/iam/home#/roles)。

1. 选择您创建的执行角色。

1. 选择**删除**。

1. 在文本输入字段中输入角色名称，然后选择**删除**。

**删除 Lambda 函数**

1. 打开 Lamba 控制台的 [Functions（函数）页面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 选择您创建的函数。

1. 依次选择**操作**和**删除**。

1. 在文本输入字段中键入 **confirm**，然后选择 **Delete**（删除）。