aws-lambda image-resizing(node.js)


어떤 서비스든지 이미지를 볼 때, 모바일에서 보는 이미지와 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 S 3上にある
  • Amazon S3 링크 URL:
    https://coding-factory-s3.s3.ap-northeast-2.amazonaws.com/aws-upload.zip
    https://[s3_bucket_name].s3.[aws에 설정한 위치].amazonaws.com/[압축한 파일 이름]
    設定/一般設定/編集

    トリガーの追加
  • S3
  • パケット:作成したパケット
  • イベントタイプ:すべてのオブジェクト作成イベント
  • プレフィックス:S 3に画像を含むファイルルート(オリジナル/)
  • コールバックチェック