

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

# 教學課程：建立具有函數 URL 的回應串流 Lambda 函數
<a name="response-streaming-tutorial"></a>

在本教學課程中，您會建立格式為 .zip 封存檔的 Lambda 函數，其包含的函數 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`)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本，請[安裝適用於 Linux 的 Windows 子系統](https://docs.microsoft.com/en-us/windows/wsl/install-win10)。本指南中的 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) 主控台的 [角色](https://console.aws.amazon.com/iam/home#/roles) 頁面。

1. 選擇建**立角色**。

1. 建立具備下列屬性的角色：
   + **信任的實體類型**：**AWS 服務**
   + **使用案例**：**Lambda**
   + **許可** – **AWSLambdaBasicExecutionRole**
   + **角色名稱** - **response-streaming-role**。

**AWSLambdaBasicExecutionRole** 政策具有函數將日誌寫入 Amazon CloudWatch Logs 所需的許可。建立角色後，請記下其 Amazon Resource Name (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 函數。使用上一個步驟的角色 ARN 取代 `--role` 的值。此命令會將函式逾時設定為 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. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇您建立的函數。

1. 選擇 **Actions** (動作)、**Delete** (刪除)。

1. 在文字輸入欄位中輸入 **confirm**，然後選擇 **刪除** 。