aws-lambda image-resizing(node.js)

고윤혁·2021년 12월 16일
0

AWS

목록 보기
1/1

어떤 서비스든지 이미지를 볼 때, 모바일에서 보는 이미지와 PC에서 보는 이미지는 용량이 다르고 크기도 다르다.
사용자가 어디서 보든지 원본 이미지를 그대로 보여주면 용량만 차지하고 비효율적이다. 때문에 때에 맞춰 이미지의 크기를 리사이징 해줄 필요가 있다.

lambda란? AWS Lambda는 Amazon Web Services의 일부로 Amazon에서 제공하는 이벤트 중심의 서버리스 컴퓨팅 플랫폼. 이벤트에 대한 응답으로 코드를 실행하고 해당 코드에 필요한 컴퓨팅 리소스를 자동으로 관리하는 컴퓨팅 서비스.
쉽게 말해 함수를 만들어 놓으면 서비스 안에서 이벤트가 실행될 시 코드를 실행해주고 필요한 리소스를 자동으로 관리해주는 것

aws lambda

lambda로 이미지 리사징하기

1. 먼저 front와 back 폴더 2개가 있다면 root 폴터에 lambda 폴더도 생성해준다.
2. git init (package.json이 생김)
3. git add . && git commit

lambda 폴더안에 index.js 파일 생성

$ npm install aws-sdk sharp
const AWS = require('aws-sdk');
const sharp = require('sharp');

const s3 = new AWS.S3();

exports.handler = (event, context, callback) => {
  const Bucket = event.Records[0].s3.bucket.name; // react-nodebird-s3
  const Key = decodeURIComponent(event.Records[0].s3.object.key); // original/12312312_abc.png, decodeURIComponent: 한글 깨짐현상 해결
  console.log('Bucket: ', Bucket, 'Key: ', Key);
  const filename = Key.split('/')[Key.split('/').length - 1]; // 파일이름 추출
  const ext = Key.split('.')[Key.split('.').length - 1].toLowerCase(); // 확장자 추출.toLowerCase(), 확장자 대문자를 소문자로
  const requiredFormat = ext === 'jpg' ? 'jpeg' : ext;
  console.log('filename', filename, '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);
  }
};
이후 Linux(Ubuntu)에서 back으로 이동한다. 아래의 명령어를 차례로 실행
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/back$ sudo git pull
--------------------------------------------------------
lambda 파일로 이동
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/back$ cd ../lambda
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ sudo npm i
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ sudo apt install zip
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ sudo zip -r aws-upload.zip ./*
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ ls
aws.upload.zip  index.js  node_modules  package-lock.json  package.json
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ ls
aws.upload.zip  awscliv2.zip  index.js  node_modules  package-lock.json  package.json
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ sudo unzip awscliv2.zip
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ sudo ./aws/install
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ aws

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

aws: error: the following arguments are required: command

--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ aws configure
AWS Access Key ID [None]: 실제값
AWS Secret Access Key [None]: 실제값
Default region name [None]: ap-northeast-2 (aws에 설정한 나의 위치)
Default output format [None]: json
--------------------------------------------------------
ubuntu@ip-000-00-00-000: ~/root/~/~/lambda$ sudo aws s3 cp "aws-upload.zip" s3://[사용자 S3 bucket 이름]
--------------------------------------------------------

이걸 하는 이유는 EC2에서 S3로 소스코드를 보내려고 한다. lambda 압축한 zip 파일을 S3로 보낼 것이다.

aws 가서 제대로 생성이 되었는지 확인한다.

  • aws / lambda / 함수생성 / 함수이름 작성 / 함수 생성
  • 코드소스는 Amazon S3에 위치
Amazon S3 링크 URL:
https://coding-factory-s3.s3.ap-northeast-2.amazonaws.com/aws-upload.zip
https://[s3_bucket_name].s3.[aws에 설정한 위치].amazonaws.com/[압축한 파일 이름]

구성 / 일반구성 / 편집

트리거 추가

  1. S3
  2. 버킷: 내가 만든 버킷
  3. 이벤트 유형: 모든 객체 생성 이벤트
  4. 접두사: S3에서 이미지가 들어가는 파일 루트 ( original/ )
  5. 재귀 호출 체크
profile
기억보다 기록이 좋다

0개의 댓글