영상 생성 진행상황을 클라이언트에게 알리기 위해 응답 스트리밍을 사용하기로 결정했다.
응답 값은 영상이 생성될 때까지 10%, 20%... 와 같은 퍼센트값만 보내주기로 했다.
AWS Lambda 응답 스트리밍
다행히 현재 사용하는 AWS Lambda에서 Node.js 관리형 런타임인 경우 응답 스트리밍을 지원하고 있었다.
응답을 스트리밍하도록 Lambda 함수 구성
응답 페이로드를 클라이언트로 다시 스트리밍하도록 Lambda 함수 URL을 구성할 수 있습니다. 응답 스트리밍은 첫 번째 바이트까지 시간(TTFB) 성능을 개선하여 지연 시간에 민감한 애플리케이션에 도움이 될 수 있습니다. 이는 부분 응답을 사용할 수 있게 되면 클라이언트에 다시 전송할 수 있기 때문입니다. 또한 응답 스트리밍을 사용하여 더 큰 페이로드를 반환하는 함수를 빌드할 수 있습니다.
응답 스트리밍 지원 함수 작성
응답 스트리밍 함수의 핸들러 작성은 일반적인 핸들러 패턴과 다르다. 스트리밍 함수를 작성할 때 다음을 수행해야 한다.
- 네이티브 Node.js 런타임에서 제공하는 awslambda.streamifyResponse() 데코레이터로 함수를 래핑한다.
- 모든 데이터 처리가 완료되도록 스트림을 정상적으로 종료한다.
exports.handler = awslambda.streamifyResponse(
async (event, responseStream, context) => {
responseStream.setContentType(“text/plain”);
responseStream.write("Hello ");
responseStream.write("world ");
responseStream.write("from ");
responseStream.write("Lambda!");
responseStream.end();
}
);
streamifyResponse() 데코레이터는 다음 파라미터를 가질 수 있다.
- event - HTTP 메서드, 쿼리 파라미터 및 요청 본문과 같은 함수 URL의 호출 이벤트에 대한 정보를 제공한다.
- responseStream - 쓰기 가능한 스트림을 제공한다.
- context – 호출, 함수 및 실행 환경에 대한 정보를 메서드 및 속성에 제공한다.
새 responseStream객체는 함수가 데이터를 쓸 수 있는 스트림 객체를 제공한다. 이 스트림에 쓰여진 데이터는 즉시 클라이언트로 전송된다. 선택적으로 Content-Type 응답 헤더를 설정하여 스트림의 내용에 대한 추가 메타데이터를 클라이언트에 전달할 수 있다.
responseStream은 스트림에 쓰기를 위한 write() 메서드를 제공하지만 가능하면 pipeline()을 사용하는 것이 좋다. pipeline()을 사용하면 쓰기 가능한 스트림이 더 빠른 읽기 가능한 스트림에 의해 압도되지 않도록 한다. (하지만 나는 pipline을 사용해보진 않았다...)
Lambda 함수 URL을 사용하여 응답 스트리밍 지원 함수 호출
응답을 스트리밍하려면 함수 URL을 사용하여 함수를 호출해야 한다.
현재 Lambda + api gateway를 사용해 API를 만들었는데 api gateway의 경우 응답 제한 시간이 걸려 있기 때문에 apigateway 대신 함수 URL을 사용해야 하지 않나 추측된다.
함수 URL의 호출 모드를 변경하여 응답 스트리밍 지원 함수를 호출할 수 있다.
호출 모드는 Lambda가 함수를 호출하는 데 사용하는 API 작업을 결정한다.
사용 가능한 호출 모드는 다음과 같다.
- BUFFERED: 기본 옵션이다. Lambda는 InvokeAPI 작업을 사용하여 함수를 호출한다. 페이로드가 완료되면 호출 결과를 사용할 수 있다.
- RESPONSE_STREAM: 함수가 페이로드 결과를 사용할 수 있게 되면 스트리밍할 수 있도록 한다. Lambda는 InvokeWithResponseStream API 작업을 사용하여 함수를 호출한다.
함수 URL의 호출 모드 설정(콘솔)
- Lambda 콘솔의 함수 페이지를 엽니다.
- 호출 모드를 설정할 함수의 이름을 선택합니다.
- 구성(Configuration) 탭을 선택한 다음, 함수 URL(Function URL)을 선택합니다.
- 편집을 선택하고 추가 설정을 선택합니다.
- 호출 모드에서 원하는 호출 모드를 선택합니다.
- 저장을 선택합니다.
실제로 람다 스트리밍 기능을 테스트 해보았을때 setTimeout을 중간마다 넣었음에도 불구하고 여러 청크가 한번에 받아지는 문제가 있었다.
이는 아래 블로그를 통해 궁금증을 확인할 수 있었다.
https://betterdev.blog/lambda-response-streaming-flush-content/
테스트 결과를 포스트맨을 통해 확인했을 때는 응답값이 한번에 받아지는 문제가 있었다. 또 프론트에서 응답값을 받는데 문제가 있다고 하여 따라서 AWS Lambda 응답 스트리밍을 활용하는 방식은 보류하기로 결정했다..
참고한 글
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-response-streaming.html
https://aws.amazon.com/ko/blogs/compute/introducing-aws-lambda-response-streaming/
'Graduation Project' 카테고리의 다른 글
응답 스트리밍(2) - SSE (1) | 2024.07.23 |
---|---|
프롬프트 엔지니어링 (0) | 2024.07.08 |
S3 + CloudFront 비디오 스트리밍 (0) | 2024.07.03 |
[Error 😥] Serverless Framework 사용 도전기 (0) | 2024.07.02 |
AWS APIgateway+ 응답 HTTP status 변경하기 (0) | 2024.06.28 |