Lambda로 이미지 리사이징

개발공부·2023년 2월 10일
0

[이미지 리사이징]

* AWS > Lambda 이용

▶ 이미지 크기를 줄이기 위함
▶ 새로운 서버를 만드는 것이 아닌 이미지가 등록 시 한 번씩 실행하는 함수

  1. front, back 폴더와 같은 위치에 lambda 폴더 추가

npm init

  • aws-sdksharp 추가

npm i aws-sdk sharp

  1. [lambda/index.js]
const AWS = require("aws-sdk");
const sharp = require("sharp");

const s3 = new AWS.S3();

exports.handler = async (event, context, callback) => {
  const Bucket = event.Records[0].s3.bucket.name; //engword-s3
  const Key = decodeURIComponent(event.Records[0].s3.object.key); //original/1676005829013_korea1.jpg
  console.log("Bucket", Bucket);
  console.log("Key", Key);
  const filename = Key.split("/")[Key.split("/").length - 1];
  const ext = Key.split(".")[Key.split(".").length - 1].toLowerCase();
  const requiredFormat = ext === "jpg" ? "jpeg" : ext;
  console.log("filename", filename);
  console.log("ext", ext);

  try {
    const s3Object = await s3.getObject({ Bucket, Key }).promise();
    console.log("original", s3Object.Body.length);
    const resizedImage = await sharp(s3Object.Body)
      .resize(400, 400, { fit: "inside" })
      .toFormat(requiredFormat)
      .toBuffer();
    await s3
      .putObject({
        Bucket,
        Key: `thumb/${filename}`,
        Body: resizedImage,
      })
      .promise();
    console.log("put", resizedImage.length);
    return callback(null, `thumb/${filename}`);
  } catch (error) {
    console.error(error);
    return callback(error);
  }
};
  1. AWS > ssh 연결 > prepare/back

git pull 후 lambda 폴더로 이동 후 sudo npm i 진행

  1. zip 명령어 설치(중간에 y 누르기)

sudo apt install zip

sudo zip -r aws-upload.zip ./*

  1. zip 파일 설치 확인

lambda 폴더에서 ls 입력 시 aws-upload.zip 가 있으면 됨

  1. awscliv2.zip 설치

sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

  1. awscliv2.zip 해제

sudo unzip awscliv2.zip

  1. aws 명령어 칠 수 있게 함

sudo ./aws/install

  1. prepare/back/.env에 있는 S3_ACCESS_KEY_IDS3_SECRET_ACCESS_KEY 입력

aws configure

AWS Access Key ID [None]: 본인의 S3_ACCESS_KEY_ID
AWS Secret Access Key [None]: 본인의 S3_SECRET_ACCESS_KEY
Default region name [None]: ap-northeast-2
Default output format [None]: json
  1. bucket에 aws-upload.zip 보내기

aws s3 cp "aws-upload.zip" s3://버킷 이름

  • S3에서 zip파일 들어가 있는지 확인

  1. lambda로 이동 > 함수 생성

▶ 함수 이름 생성 후 아래의 코드 소스 오른쪽에 에서 업로드 클릭 > AWS S3 위치 누르기

https://본인의버킷이름.s3.ap-northeast-2.amazonaws.com/aws-upload.zip

  • index.handler 확인
  1. lambda > 함수 안 > 구성 > 트리거 추가

1) s3로 설정

2) 버킷에 본인의 버킷 추가(클릭하면 됨)

3) 접두사 : s3에 있는 본인 폴더 추가

4) "입력과 출력 모두에 동일한 S3 버킷을 사용하는 것은 권장되지 않으며, 이 구성으로 인해 재귀 호출이 발생하고, Lambda 사용량이 증가하여 비용이 증가될 수 있음을 이해합니다." 체크할 것

profile
개발 블로그, 티스토리(https://ba-gotocode131.tistory.com/)로 갈아탐

0개의 댓글