const pipeline = require("util").promisify(require("stream").pipeline);
const { Readable } = require('stream');
exports.echo = awslambda.streamifyResponse(async (event, responseStream, _context) => {
// As an example, convert event to a readable stream.
const requestStream = Readable.from(Buffer.from(JSON.stringify(event)));
await pipeline(requestStream, responseStream);
尽管 responseStream
提供了写入流的 write()
方法,但建议您尽可能使用 pipeline()
。使用 pipeline()
能够确保可写流不会被速度更快的可读流所淹没。
确保在处理程序返回之前正确结束流。pipeline()
方法会自动处理此问题。
对于其他使用案例,请调用 responseStream.end()
方法以正确结束流。此方法表示不应向流写入更多数据。如果您使用 pipeline()
或 pipe()
写入流,则不需要使用此方法。
例 使用 pipeline() 结束流的示例
const pipeline = require("util").promisify(require("stream").pipeline);
exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
await pipeline(requestStream, responseStream);
例 不使用 pipeline() 结束流的示例
exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
responseStream.write("Hello ");
responseStream.write("world ");
responseStream.write("from ");
responseStream.write("Lambda!");
responseStream.end();
使用 Lambda 函数 URL 调用支持响应流式处理的函数
您必须使用函数 URL 调用函数才能流式处理响应。
您可以通过更改函数 URL 的调用模式来调用支持响应流式处理的函数。调用模式决定 Lambda 使用哪个 API 操作来调用函数。可用的调用模式有:
BUFFERED
– 这是默认选项。Lambda 通过 Invoke
API 操作调用函数。负载完成后,调用结果可用。最大负载大小为 6MB。
RESPONSE_STREAM
– 使函数能够在负载结果可用时对其进行流式处理。Lambda 通过 InvokeWithResponseStream
API 操作调用函数。最大响应负载大小为 20MB。但是,您可以请求提高限额。
通过直接调用 Invoke
API 操作,您仍然可以在不进行响应流式处理的情况下调用函数。但是,Lambda 会流式处理通过函数 URL 发出的调用的所有响应负载,直到您将调用模式更改为 BUFFERED
。
设置函数 URL 的调用模式(控制台)
-
打开 Lamba 控制台的函数页面。
选择您要为其设置调用模式的函数的名称。
选择 Configuration(配置)选项卡,然后选择 Function URL(函数 URL)。
选择编辑,然后选择其他设置。
在调用模式下,选择所需的调用模式。
选择 Save(保存)。
设置函数 URL 的调用模式(AWS CLI)
aws lambda update-function-url-config --function-name my-function
--invoke-mode RESPONSE_STREAM
设置函数 URL 的调用模式(AWS CloudFormation)
MyFunctionUrl:
Type: AWS::Lambda::Url
Properties:
AuthType: AWS_IAM
InvokeMode: RESPONSE_STREAM
有关配置函数 URL 的更多信息,请参阅 Lambda 函数 URL。