Dev/AWS

람다레이어로 sharp 패키지 활용하여 이미지 리사이징 하기

싯벨트 2024. 4. 13. 15:17
728x90

목표

람다 사용 시, 샤프 패키지를 활용하여 이미지를 리사이징한다.

환경

  • esbuild
  • AWS SAM
  • node.js
  • typescript
  • npm

구성

썸네일 추출함수를 만들고, S3 트리거로 구현한 AWS 공식문서 예시와 다르게 샤프 람다레이어가 적용된 함수를 필요할 때 호출해서 썸네일을 추출할 수 있도록 구현했다.
sharp-layer | media-converter 두 가지 레포로 구성했다.
 
1) sharp-layer 는 샤프 모듈을 사용할 수 있도록 한 레이어이다.

  • 람다함수의 레이어 설정을 통해 해당 함수를 사용할 수 있다.

2) media-converter는 생성한 함수에 sharp-layer를 람다레이어로 구성하여 sharp 모듈을 사용 가능하도록 했다.

  • 리사이징 수행 후 리사이징된 주소를 리턴하는 람다 함수만 레이어를 사용하게 하여 결합도를 최소화하고, 레이어 수정 시 변경된 버전에 대한 대응을 용이하게 한다.
  • 이미지 파일뿐만 아니라 영상 컨버팅을 염두하여 “media-converter”라는 이름으로 레포를 구성했다.

내용

Sharp-layer

sharp-layer 폴더 구조

폴더구조

핵심은 다음과 같다.

  • package.json과 같은 레벨에 nodejs 폴더가 있어야 하며
  • node_modules 폴더는 nodejs 폴더 하위에 위치해야

람다레이어로 적용했을 때 정상동작한다는 것이다.

레이어 zip 파일 폴더 구조

sam template 코드

sam template 코드

예시들을 보면 “CotentUri”의 값을 s3에 업로드한 zip 파일을 사용하지만 사진처럼 폴더 경로로 참조도 가능하다.
이때 경로(./)는 template.yaml이 있는 layer 폴더를 가르킨다.

  • 해당 경로에는 nodejs 폴더가 바로 위치해야 한다.

RetentionPolicy는 Retain 을 권장한다. 설정을 바꾸면 같은 이름의 람다 레이어가 업로드 될 때 이전 버전을 삭제하며, 이것은 이전 버전의 레이어를 참조한 함수들이 있을 경우 에러의 원인이 될 수 있기 때문이다. 웬만하면 이전 버전은 유지하는 게 좋을 것이다.

sharp npm 설치

npm install --platform=linux --arch=x64 sharp@0.32.6

모듈을 찾을 수 없다는 오류가 발생한다면 위와 같이 플랫폼, 아키텍처 버전을 설정해서 다시 설치해보자

Media-Converter

샤프 패키지

  • 샤프를 통해 리사이징을 할 때, 마지막에 withMetadata()를 설정해주어야 사진이 뒤집히는 현상을 방지할 수 있다.

타입패키지

  • 사프 버전에 맞게 @types/sharp를 설치해야 샤프 패키지가 없는 상태에서도 코드상에서 불러와서 사용할 수 있다.

sam템플릿

  • 빌드를 할 때 external에 sharp를 추가해주어야 빌드 시 에러가 발생하지 않는다.
    • 샤프를 레이어를 통해 활용할 것이므로 빌드에서 제외한다.
  • 이전에 생성했던 샤프 레이어의 ARN을 레이어로 구성해준다.

에러

sharp 모듈을 읽지 못하는 에러가 지속적으로 발생했는데 결과적으로 버전이슈였다.

  • Npm 버전업 8.x → 10.5.0
  • sharp버전 0.33.3 → 0.32.6
  • Node 버전 18.x → 21.7.2

참고자료