S3에서 객체를 가져올 때 스트림 사용

7298 단어 nodes3serverlessaws
Node.js AWS 애플리케이션에서 getObject 요청을 처리하는 방법을 변경해야 합니다. 읽기 가능한 스트림 기술은 S3 응답을 처리할 때 유용합니다.

1. 고전적인 문제



고전적인 문제에 직면해 있다고 가정해 보겠습니다. 프로그래밍 방식으로 LambdaS3과 함께 AWS SDK에서 개체를 받는 Node.js 함수가 있습니다.

애플리케이션은 getObject 메서드를 사용하여 버킷에서 객체를 수신합니다.

2. 변경사항



그러나 SDK 버전 3으로 업그레이드하거나 해당 버전으로 새 애플리케이션을 작성하면 메서드 서명이 일부 변경됩니다.

버전 3은 모듈식이므로 애플리케이션에 필요한 것만 설치하면 됩니다. 패키지 크기가 줄어들어 배포 시간이 단축되므로 모든 것이 좋아 보입니다.

전체 @aws-sdk/client-s3 패키지 대신 aws-sdk 모듈만 설치해야 합니다. 모듈에는 버킷에서 객체를 수신하는 데 도움이 되는 getObject 메서드가 포함되어 있습니다.
S3 생성자는 여전히 모듈에서 사용할 수 있으므로 지금까지는 새로운 것이 아닙니다.

2.1. 약속() 메서드 없음



첫 번째 변경 사항은 getObject 메서드가 Promise 을 반환한다는 것입니다.

버전 2에서 getObject 메서드는 객체를 반환하고 S3 응답으로 확인되는 promise() 메서드를 호출해야 했습니다. 우리는 항상 콜백 대신 async/await 구문을 사용하기를 원하기 때문에 promise() 메서드는 개발 수명의 일부였습니다.

좋은 소식은 AWS가 버전 3에서 서명을 단순화했으며 getObject 메서드가 이미 Promise 를 반환한다는 것입니다. 따라서 해결된 값을 얻기 위해 promise() 원하는 경우 await 메서드를 호출할 필요가 없습니다.

2.2 버퍼 대신 읽을 수 있는 스트림



약속 S3getObject 메서드는 GetObjectOutput 유형을 확장하는 개체로 확인됩니다. 이 객체는 SDK v2와 동일한 속성을 갖지만 주요 변경 사항을 포함합니다.

버전 3에서 해결된 S3 응답 객체의 Body 속성은 Buffer 대신 readable stream입니다. 수정은 응용 프로그램이 개체를 처리하는 방법을 변경해야 함을 의미합니다.

3. 일부 TypeScript 코드



읽을 수 있는 스트림은 Symbol.asyncIterator 메서드를 구현하므로 스트림도 비동기 반복 가능 항목입니다.

따라서 for...of 구성을 사용하여 읽을 수 있는 스트림을 반복하고 스트림이 제공하는 청크를 가져올 수 있습니다.

다음 예에서는 S3에서 다운로드한 객체를 반환합니다. getObject 요청을 처리하는 코드 예제는 다음과 같습니다.

async function getObject(params) {
  const s3ResponseStream = (await s3.getObject(params)).Body
  const chunks = []

  for await (const chunk of s3ResponseStream) {
    chunks.push(chunk)
  }

  const responseBuffer = Buffer.concat(chunks)
  return JSON.parse(responseBuffer.toString())
}


chunkBuffer입니다. S3 객체의 마지막 청크를 수신한 후 연결하고 문자열로 변환한 다음 마지막으로 JavaScript 객체로 변환할 수 있습니다.

Lambda 핸들러는 다음과 같습니다.

import { S3 } from '@aws-sdk/client-s3'

const s3 = new S3({ region: 'us-east-1' })

export async function handler(event) {
  try {
    const s3Object = await getObject({
      Bucket: 'ARN OF THE BUCKET',
      Key: 'NAME OF THE OBJECT TO FETCH',
    })

    return s3Object
  } catch (error) {
    console.error('Error while downloading object from S3', error.message)
    throw error
  }
}


스트림 처리 논리를 getObject라는 함수로 래핑하고 일반적으로 Lambda 핸들러에서 하는 것처럼 try/catch 블록에서 사용할 수 있습니다.

위의 예에서는 여전히 S3 개체를 메모리에 저장합니다. 스트림의 진정한 이점은 청크가 도착하는 대로 처리한다는 것입니다. 데이터 변환, 데이터베이스에 저장 또는 응답을 스트림으로 반환하는 것과 같은 사용 사례는 이 게시물의 일부가 아니며 나중에 다룰 수도 있습니다.

4. 요약


getObject 메서드의 서명이 SDK 버전 3에서 변경되었습니다. 응답의 Body 속성은 이제 Buffer 대신 읽을 수 있는 스트림입니다.

핵심 Node.js 스트림 로직을 사용하여 Lambda 함수의 반환 값을 처리할 수 있습니다.

5. 참고문헌



AWS SDK for JavaScript v3

좋은 웹페이지 즐겨찾기