Code States/TIL

[0510] (페어) 마이크로서비스 작성 - 서버리스 애플리케이션

ki1111m2 2023. 5. 11. 09:34

Bare Minimum Requirements

  • 이미지가 업로드되면, 원본과 별도로 썸네일을 생성하고, 이를 별도의 버킷에 저장해야 합니다.
    • 썸네일 이미지는 가로 200px의 크기를 가집니다.
    • 썸네일을 저장할 별도의 버킷은 람다 함수의 환경 설정으로 구성되어야 합니다.
  • 아래 과제 제출 방법을 참고해 GitHub에 제출합니다.

sam init을 통해 템플릿을 생성한다

람다함수 파일을 수정한다

exports.helloFromLambdaHandler = async (event, context) => {
    console.log(event)

    console.log(context)

    return 'Hello from Lambda!';
}

빌드 후 배포를 진행한다

트리거로 사용할 버킷을 생성한다

만든 버킷으로 트리거를 추가한다

버킷에 대상 이미지를 등록한다

람다 함수가 정상적으로 작동하는 것을 볼 수 있다

람다 함수에 작성했던 콘솔 로그를 통해 event와 context의 정보를 볼 수 있다

크기를 줄인 사진(썸네일)을 업로드할 버킷을 생성한다

람다 함수 역할에 S3 버킷에 접근하기 위한 권한을 넣어준다

기존 버킷에 올라간 사진의 크기를 줄여 새 버킷에 올리는 코드를 작성한다

const AWS = require('aws-sdk')
const util = require('util')
const sharp = require('sharp')

const s3 = new AWS.S3();

exports.helloFromLambdaHandler = async (event, context) => {
    const s3Object = await s3.getObject({
        Bucket: 'ks-serverless-photo-src-bucket',
        Key: '1_PC.jpeg'
      }).promise()
      
      // 이미지 리사이즈, sharp 라이브러리가 필요합니다.
      const data = await sharp(s3Object.Body)
          .resize(200)
          .jpeg({ mozjpeg: true })
          .toBuffer()
      
      // 대상 버킷으로 파일 쓰기
      const result = await s3.putObject({
        Bucket: 'ks-serverless-photo-image-bucket', 
        Key: '1_PC.jpeg',
        ContentType: 'image/jpeg',
        Body: data,
        ACL: 'public-read'
      }).promise()
}

트러블슈팅: Error: Cannot find module 'sharp'

사진 크기를 리사이징 하는데 필요한 sharp 모듈을 찾을 수 없다는 오류가 발생했다

package.json 파일에 sharp 모듈을 인스톨하는 구문을 추가한다

트러블슈팅: Invoke Error: AccessControlListNotSupported

버킷의 객체 소유권으로 인해 발생한 오류

새로운 사진을 업로드할 버킷의 객체 소유권을 편집한다

트러블슈팅: Invoke Error: Access Denied

람다 함수 역할에 S3 full access를 넣었는데도 access denied 오류가 떠서 당황했다

새로운 사진을 업로드할 버킷의 퍼블릭 액세스 차단을 해제해야 한다

리사이징된 사진이 대상 버킷에 정상적으로 업로드 된 것을 볼 수 있다

성공 로그

기존 사진과 리사이징 된 사진

성공적으로 리사이징 된 것을 볼 수 있다