AWS

[Lambda] Lambda와 S3를 사용한 이미지 리사이징 (2)- AWS Lambda 구축

J_Dev 2024. 11. 4. 17:39

AWS Lambda 이미지 리사이징 구축

1) 기본설정

  • 런타임은 Node.js 기반으로 구축, 버전은 20 버전을 사용하였다.

2) 권한설정

  • S3 버킷을 트리거로 사용, 버킷에 리사이징된 이미지를 저장해야 하므로 권한에 S3를 등록해 줘야 한다.
  • Lambda의 구성 -> 권한을 클릭한다.
  • 역할 이름의 바로가기를 클릭하여 IAM 역할 페이지로 이동한다.

  • 권한 정책에서 AmazonS3FullAccess를 추가한다.

  • 다시 Lambda의 구성 -> 권한으로 돌아와 S3 권한이 추가되었는지 확인한다.

3) 트리거 설정

  • 해당 버킷에 업로드된 모든 객체 생성 이벤트에 대해 작동하도록 설정한다.
  • 이 버킷은 오로지 이미지 업로드 용도로만 사용한다.

4) 코드 업로드

  • Node.js 기반으로 구축되었으므로, JavaScript로 코드를 작성하였다.
  • sharp 라이브러리 인스톨시, 플랫폼을 리눅스에 맞춰야 정상작동한다.
npm install --platform=linux --arch=x64 sharp
  • 트리거가 작동하면 원본 버킷에서 이미지를 가져와 리사이징 후, 리사이징된 이미지 버킷에 저장한다.
  • 원본 이미지는 600x800 사이즈로 업로드되므로 150x200으로 리사이징하도록 지정하였다.
  • 소스코드는 index.js로 작성하고 zip 파일로 업로드한다. (람다 기본값이 index.js)
const sharp = require("sharp");
const AWS = require("aws-sdk");

//s3 클라이언트 연결
const s3 = new AWS.S3();


//이미지가 업로드될 버킷과, 리사이징 이미지를 업로드할 버킷명 지정
//순환참조 문제가 발생할 수 있으므로, 하드코딩으로 지정할것
const BUCKET_NAME = "net-novel-img-storage";//이미지가 업로드될 버킷
const DESTINATION_BUCKET_NAME = "mini-img-storage";//리사이징 이미지가 업로드될 버킷

exports.handler = async (event) => {
  try {
    // S3 이벤트로부터 파일의 Key(경로)를 가져옵니다.
    const Key = event.Records[0].s3.object.key;


    // Key에서 파일 이름만 추출합니다. 여러 폴더가 있을 수 있으므로 마지막 부분을 가져옵니다.
    const keyOnly = Key.split("/").pop();


    console.log(`Image Resizing: ${keyOnly}`);

    // S3에서 원본 이미지를 가져옵니다.
    const image = await s3
      .getObject({ Bucket: BUCKET_NAME, Key })//원본 이미지가 업로드된 버킷
      .promise();


    // 이미지 크기를 150x200으로 변환합니다.
    const resizedImage = await sharp(image.Body)
      .resize(150, 200) // 150x200 크기로 리사이즈
      .toBuffer();    // 변환된 이미지를 버퍼로 변환


    // 변환된 이미지를 S3에 저장합니다. 파일명에 "mini"를 붙입니다.
    // const miniKey = keyOnly.replace(/(\.\w+)$/, "-mini$1"); // 확장자 앞에 "mini"를 추가
    const miniKey = `mini-${keyOnly}`; // 파일명 앞에 "mini-"를 추가

    await s3
      .putObject({
        Bucket: DESTINATION_BUCKET_NAME,   // 리사이징 이미지 저장할 버킷, 원본 파일 버킷과 다르게할것!
        Body: resizedImage,    // 변환된 이미지 데이터
        Key: `thumbnail/${miniKey}`, // 새로운 경로로 변환된 이미지 저장
      })
      .promise();


    // 모든 작업이 성공적으로 완료되었음을 반환합니다.
    return {
      statusCode: 200,
      body: event,
    };
  } catch (err) {
    console.error(err);
    return {
      statusCode: 500,
      body: JSON.stringify(err),
    };
  }
};

5) 런타임 설정

  • 함수 런타임 설정에서 핸들러 정보를 변경하였다.
  • 람다 기본값인 index.js로 작성하였으므로 index.handler 를 입력해준다.

6) 기본 리소스 설정

  • 이미지 리사이징이므로, 메모리와 임시 스토리지, 제한 시간을 늘려 설정하였다.