응답 스트리밍 지원 Lambda 함수 작성
응답 스트리밍 함수의 핸들러 작성은 일반적인 핸들러 패턴과 다릅니다. 스트리밍 함수를 작성할 때 다음을 수행해야 합니다.
네이티브 Node.js 런타임에서 제공하는
awslambda.streamifyResponse()
데코레이터로 함수를 래핑합니다.모든 데이터 처리가 완료되도록 스트림을 정상적으로 종료합니다.
응답을 스트리밍하도록 핸들러 함수 구성
Lambda가 함수의 응답을 스트리밍해야 함을 런타임에 나타내려면 함수를 streamifyResponse()
데코레이터로 래핑해야 합니다. 그러면 런타임이 응답 스트리밍에 적합한 로직 경로를 사용하고 함수가 응답을 스트리밍할 수 있습니다.
streamifyResponse()
데코레이터는 다음 파라미터를 수락하는 함수를 수락합니다.
event
- HTTP 메서드, 쿼리 파라미터 및 요청 본문과 같은 함수 URL의 호출 이벤트에 대한 정보를 제공합니다.responseStream
- 쓰기 가능한 스트림을 제공합니다.context
– 호출, 함수 및 실행 환경에 대한 정보를 메서드 및 속성에 제공합니다.
responseStream
객체는 Node.js writableStream
pipeline()
메서드를 사용해야 합니다.
예 응답 스트리밍 지원 핸들러
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(); });