

# チュートリアル: 関数 URL を使用してレスポンスストリーミング Lambda 関数を作成する
<a name="response-streaming-tutorial"></a>

このチュートリアルでは、レスポンスストリームを返す関数 URL エンドポイントを持つ .zip ファイルアーカイブとして定義された Lambda 関数を作成します。関数 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 では、任意のシェルとパッケージマネージャーを使用します。

**注記**  
Windows では、Lambda でよく使用される一部の Bash CLI コマンド (`zip` など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、[Windows Subsystem for Linux をインストール](https://docs.microsoft.com/en-us/windows/wsl/install-win10)します。このガイドの CLI コマンドの例では、Linux フォーマットを使用しています。Windows CLI を使用している場合、インライン JSON ドキュメントを含むコマンドを再フォーマットする必要があります。

## 実行ロールを作成する
<a name="response-streaming-create-iam-role"></a>

AWS リソースにアクセスするためのアクセス権限を Lambda 関数に付与する[実行ロール](lambda-intro-execution-role.md)を作成します。

**実行ロールを作成するには**

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 リソースネーム (ARN) を書き留めてください。これは次のステップで必要になります。

## レスポンスストリーミング関数を作成する (AWS CLI)
<a name="response-streaming-tutorial-create-function-cli"></a>

AWS Command Line Interface (AWS CLI) を使用して、関数 URL エンドポイントでレスポンスストリーミング Lambda 関数を作成します。

**レスポンスをストリーミングできる関数を作成するには**

1. 以下のコード例を `index.js` という名前のファイルにコピーします。この関数は、1 秒で区切られた 3 つのレスポンスをストリーミングします。

   ```
   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 秒に設定し、関数が 3 つのレスポンスをストリーミングできるようにします。

   ```
   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. **[アクション]** で、**[削除]** を選択します。

1. テキスト入力フィールドに **confirm** と入力し、**[Delete]** (削除) を選択します。