チュートリアル: 関数 URL を使用してレスポンスストリーミング Lambda 関数を作成する
このチュートリアルでは、レスポンスストリームを返す関数 URL エンドポイントを持つ .zip ファイルアーカイブとして定義された Lambda 関数を作成します。関数 URL の設定の詳細については、「関数 URL」を参照してください。
前提条件
このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。初めての方は、コンソールで Lambda の関数の作成 の手順に従って最初の Lambda 関数を作成してください。
以下の手順を完了するには、AWS CLI バージョン 2 が必要です。コマンドと予想される出力は、別々のブロックにリストされます。
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 をインストール
実行ロールを作成する
AWS リソースにアクセスするためのアクセス権限を Lambda 関数に付与する実行ロールを作成します。
実行ロールを作成するには
-
AWS Identity and Access Management (IAM) コンソールの ロールページ
を開きます。 -
[ロールの作成] を選択してください。
-
次のプロパティでロールを作成します。
-
[信頼できるエンティティタイプ] – [AWS のサービス]
-
[ユースケース] – [Lambda]
-
アクセス許可 - AWSLambdaBasicExecutionRole。
-
[ロール名]
response-streaming-role–
-
AWSLambdaBasicExecutionRole ポリシーには、ログを Amazon CloudWatch Logs に書き込むために関数が必要とするアクセス許可が含まれています。ロールを作成した後、Amazon リソースネーム (ARN) を書き留めてください。これは次のステップで必要になります。
レスポンスストリーミング関数を作成する (AWS CLI)
AWS Command Line Interface (AWS CLI) を使用して、関数 URL エンドポイントでレスポンスストリーミング Lambda 関数を作成します。
レスポンスをストリーミングできる関数を作成するには
-
以下のコード例を
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(); } ); -
デプロイパッケージを作成します。
zip function.zip index.js -
create-functionコマンドを使用して Lambda 関数を作成します。--roleの値を、前のステップで書き留めたロールの ARN に置き換えます。このコマンドは、関数のタイムアウトを 10 秒に設定し、関数が 3 つのレスポンスをストリーミングできるようにします。aws lambda create-function \ --function-namemy-streaming-function\ --runtime nodejs22.x \ --zip-file fileb://function.zip \ --handler index.handler \ --timeout 10 \ --rolearn:aws:iam::123456789012:role/response-streaming-role
関数 URL を作成するには
-
lambda:InvokeFunctionUrlおよびlambda:InvokeFunctionのアクセス許可を付与するリソースベースのポリシーを関数に追加します。各ステートメントは、個別のコマンドで追加する必要があります。--principalの値を AWS アカウント ID に置き換えます。aws lambda add-permission \ --function-name my-streaming-function \ --action lambda:InvokeFunctionUrl \ --statement-id UrlPolicyInvokeURL \ --principal123456789012\ --function-url-auth-type AWS_IAMaws lambda add-permission \ --function-name my-streaming-function \ --action lambda:InvokeFunction \ --statement-id UrlPolicyInvokeFunction \ --principal123456789012 -
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 の新しいバージョンにアップグレードする必要がある場合があります。
関数 URL エンドポイントをテストする
関数を呼び出して統合をテストします。関数 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 アクセスキーとシークレットキーの両方でリクエストに署名する必要があります。前のコマンドで、AKIAIOSFODNN7EXAMPLE を AWS アクセスキー ID に置き換えます。プロンプトが表示されたら、AWS シークレットキーを入力します。AWS シークレットキーがない場合は、代わりに一時的な AWS 認証情報を使用できます。
次のような結果が表示されます。
Streaming with Helper Hello 0 Hello 1 Hello 2
リソースのクリーンアップ
このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。
実行ロールを削除する
-
IAM コンソールの [ロール]
ページを開きます。 -
作成した実行ロールを選択します。
-
[削除] を選択します。
-
テキスト入力フィールドにロールの名前を入力し、[削除] を選択します。
Lambda 関数を削除するには
-
Lambda コンソールの [関数]
ページを開きます。 -
作成した関数を選択します。
-
[アクション] で、[削除] を選択します。
-
テキスト入力フィールドに
confirmと入力し、[Delete] (削除) を選択します。