AWS
[Lambda] Lambda와 S3를 사용한 이미지 리사이징 (2)- AWS Lambda 구축
J_Dev
2024. 11. 4. 17:39
AWS Lambda 이미지 리사이징 구축
1) 기본설정
- 런타임은 Node.js 기반으로 구축, 버전은 20 버전을 사용하였다.
2) 권한설정
- S3 버킷을 트리거로 사용, 버킷에 리사이징된 이미지를 저장해야 하므로 권한에 S3를 등록해 줘야 한다.
- Lambda의 구성 -> 권한을 클릭한다.
- 역할 이름의 바로가기를 클릭하여 IAM 역할 페이지로 이동한다.
- 권한 정책에서 AmazonS3FullAccess를 추가한다.
- 다시 Lambda의 구성 -> 권한으로 돌아와 S3 권한이 추가되었는지 확인한다.
3) 트리거 설정
- 해당 버킷에 업로드된 모든 객체 생성 이벤트에 대해 작동하도록 설정한다.
- 이 버킷은 오로지 이미지 업로드 용도로만 사용한다.
4) 코드 업로드
- Node.js 기반으로 구축되었으므로, JavaScript로 코드를 작성하였다.
- sharp 라이브러리 인스톨시, 플랫폼을 리눅스에 맞춰야 정상작동한다.
npm install --platform=linux --arch=x64 sharp
- 트리거가 작동하면 원본 버킷에서 이미지를 가져와 리사이징 후, 리사이징된 이미지 버킷에 저장한다.
- 원본 이미지는 600x800 사이즈로 업로드되므로 150x200으로 리사이징하도록 지정하였다.
- 소스코드는 index.js로 작성하고 zip 파일로 업로드한다. (람다 기본값이 index.js)
const sharp = require("sharp");
const AWS = require("aws-sdk");
//s3 클라이언트 연결
const s3 = new AWS.S3();
//이미지가 업로드될 버킷과, 리사이징 이미지를 업로드할 버킷명 지정
//순환참조 문제가 발생할 수 있으므로, 하드코딩으로 지정할것
const BUCKET_NAME = "net-novel-img-storage";//이미지가 업로드될 버킷
const DESTINATION_BUCKET_NAME = "mini-img-storage";//리사이징 이미지가 업로드될 버킷
exports.handler = async (event) => {
try {
// S3 이벤트로부터 파일의 Key(경로)를 가져옵니다.
const Key = event.Records[0].s3.object.key;
// Key에서 파일 이름만 추출합니다. 여러 폴더가 있을 수 있으므로 마지막 부분을 가져옵니다.
const keyOnly = Key.split("/").pop();
console.log(`Image Resizing: ${keyOnly}`);
// S3에서 원본 이미지를 가져옵니다.
const image = await s3
.getObject({ Bucket: BUCKET_NAME, Key })//원본 이미지가 업로드된 버킷
.promise();
// 이미지 크기를 150x200으로 변환합니다.
const resizedImage = await sharp(image.Body)
.resize(150, 200) // 150x200 크기로 리사이즈
.toBuffer(); // 변환된 이미지를 버퍼로 변환
// 변환된 이미지를 S3에 저장합니다. 파일명에 "mini"를 붙입니다.
// const miniKey = keyOnly.replace(/(\.\w+)$/, "-mini$1"); // 확장자 앞에 "mini"를 추가
const miniKey = `mini-${keyOnly}`; // 파일명 앞에 "mini-"를 추가
await s3
.putObject({
Bucket: DESTINATION_BUCKET_NAME, // 리사이징 이미지 저장할 버킷, 원본 파일 버킷과 다르게할것!
Body: resizedImage, // 변환된 이미지 데이터
Key: `thumbnail/${miniKey}`, // 새로운 경로로 변환된 이미지 저장
})
.promise();
// 모든 작업이 성공적으로 완료되었음을 반환합니다.
return {
statusCode: 200,
body: event,
};
} catch (err) {
console.error(err);
return {
statusCode: 500,
body: JSON.stringify(err),
};
}
};
5) 런타임 설정
- 함수 런타임 설정에서 핸들러 정보를 변경하였다.
- 람다 기본값인 index.js로 작성하였으므로 index.handler 를 입력해준다.
6) 기본 리소스 설정
- 이미지 리사이징이므로, 메모리와 임시 스토리지, 제한 시간을 늘려 설정하였다.