-
[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. 이미지 재업로드 후 이메일 확인
'교육 > 코드스테이츠' 카테고리의 다른 글
[51일차] Terraform & Full Stack 애플리케이션 구성 (0) 2023.02.09 [50일차] Terraform (0) 2023.02.07 [46일차] 메세지 브로커 & CQRS(브로커 툴 다시 정리하기) (0) 2023.02.01 [45일차] 도메인 주도 설계(DDD,Domain-Driven-Design) (0) 2023.01.31 [44일차] 마이크로서비스 구조와 특징 (0) 2023.01.30