ABOUT ME

Today
Yesterday
Total
  • [49일차] Lambda 이미지 리사이징
    교육/코드스테이츠 2023. 2. 6. 21:13

     

     

    이미지 리사이징 작업은 CPU와 메모리를 많이 사용한다. 때문에 로컬 서버에서 작업을 하게되면
    다른 사용자의 요청을 못받는 현상이 생길 수 있다.

    싱글 스레드 기반 Node 서버는 비동기 프로그래밍 기반 I/O 작업에 유리하나 CPU 작업에는 불리하다.
    그래서 이미지 리사이징 전용 서버를 따로 돌리자니 이것은 자원 낭비이다.

    이러한 상황에서 서버리스 서비스를 활용해 문제점을 해결할 수 있다.

    서버리스 서비스를 통해 특정 동작을 수행하는 로직을 저장하고 요청이 들어오면 이를 작동시킨다.
    마치 함수처럼 호출 할 때 실행하여 Faas(Function-as-a-Service, 서비스로서의 함수 기능)라고 불린다.

     

    1. sam init

    Quick Start Template, Standalone Function을 생성한다 - nodejs 버전은 14.x로 설정했다

    입력한 sam-app라는 이름으로 디렉토리가 생성된다

     

    2. hello-from-lambda.js 파일에 코드 수정

    생성된 파일들중  src/handlers 폴더 안에 있는 hello-from-lambda.js 파일에 코드 수정한다.

    lambda 함수의 파라미터를 정의하는 것이다

    - event, context  CloudWatch 에서 확인하고자함

    exports.helloFromLambdaHandler = async (event, context) => {
        console.log(event)
    
        console.log(context)
    
        return 'Hello from Lambda!';
    }

     

    3. sam build sam deploy -g 명령어 를 통해 빌드 & 배포

     - sam build ==> .aws-sam 폴더 생성 (안에 build 폴더 생성됨)

     - sam deploy -g (-g 옵션은 이후부턴 안붙여도 됨 -- samconfig.toml 파일을 통해 같은 조건으로 배포됨)

     

    4. Lambda 함수 생성 확인

    5. 두개의 S3 버킷을 만들어 원본 버킷에 사진이 업로드 되면 람다를 통해  대상 버킷에 리사이징 된 이미지를 업로드 할 예정이다 

     

    원본 버킷은 ACL을 비활성화 한다

     

    대상 버킷은 ACL을 활성화 한다

    퍼블릭 액세스는 두 버킷 모두 비활성화 했다

     

    6. 람다에 트리거를 추가한다

    트리거 추가를 눌러 S3 버킷을 추가하자. 나는 미리 serverless-album-src-s3 라는 이름으로 S3 버킷을 만들어 놨다.

     

    7. 원본 버킷에 .jpeg 파일 업로드 후 CloudWatch log 확인

     

    8. 제공받은 소스코드 활용 (hello-from-lambda.js 코드에 적용)

    /**
     * A Lambda function that returns a static string
     */
    /*
    exports.helloFromLambdaHandler = async (event, context) => {
        console.log(event)
    
        console.log(context)
    
        return 'Hello from Lambda!';
    }
    */
    
    const aws = require('aws-sdk');
    const s3 = new aws.S3({ apiVersion: '2006-03-01' });
    const sharp = require('sharp');
    const REGION = "ap-northeast-2"
    const snsClient = new aws.SNS(REGION)
    
    exports.helloFromLambdaHandler = async (event, context) => {
        console.log(event);
        console.log(context);
    
        const bucket = event.Records[0].s3.bucket.name;      // 원본 버킷 이름
        const key = event.Records[0].s3.object.key;          // 원본 버킷 키
    
        console.log(bucket);
        console.log(key);
    
        const dstBucket = 'photobook222'     // 썸네일 버킷 이름
    
        // 원본 버킷으로부터 파일 읽기
        const s3Object = await s3.getObject({
            Bucket: bucket,
            Key: key
        }).promise()
    
        // 이미지 리사이즈, sharp 라이브러리가 필요합니다.
        const data = await sharp(s3Object.Body) 
            .resize(200)
            .jpeg({ mozjpeg: true })
            .toBuffer()
    
        // 대상 버킷으로 파일 쓰기
        const result = await s3.putObject({
            Bucket: dstBucket,
            Key: key,                                       // 원본 버킷 키와 동일
            ContentType: 'image/jpeg',                      // 컨텐츠 타입
            Body: data,
            ACL: 'public-read'
        }).promise()
        }

     

    9. sam deploy 후 파일을 재업로드하고 CloudWatchlog와 대상 버킷 확인

     

    10. Amazon SNS 를 통한 e-mail 알림

     - hello-from-lambda.js 코드 추가 후 재빌드 및 배포

        const snsService = {
            TopicArn: 'arn:aws:sns:ap-northeast-2:509484456337:lambda-test',
            Subject: "Creating a Successful Thumbnail",
            Message: `https://${dstBucket}.s3.ap-northeast-2.amazonaws.com/${key}`
        }
    
        const value = await snsClient.publish(snsService).promise();
    
        console.log('Send a successful thumbnail link')
    
        return value;

     

    11. Amazon SNS 생성 및 구독 생성

    12. 프로토콜 이메일로 바꾸고 앤드포인트에 사용 이메일 주소를 입력한다

     

    13. 앤드포인트 해당 이메일에 접속하여 구독 확인 - 링크 접속

    14. Lambda 에서 SNS 대상 추가

     

    15. 이미지 재업로드 후 이메일 확인

     

Designed by Tistory.