Amazon S3(Amazon Simple Storage Servive) 는 인터넷용 스토리지 서비스이다.
이번 프로젝트에서는 이미지만 저장할 목적으로 S3을 이용하였다.
S3에는 Bucket과 Object 라는 단위가 있다. 객체(Object)는 데이터와 메타데이터를 구성하는 저장 단위이며, 버킷(Bucket)은 이러한 객체를 저장하고 관리하는 역할이다. 버킷을 생성하면 Owner 권한을 부여 받아 버킷 단위로 여러가지 기능들을 제어할 수 있다.
Amazon S3에서 버킷을 생성한 뒤
util/aws.ts
import AWS from 'aws-sdk';
import path from 'path';
import { v4 as uuidv4 } from 'uuid';
import { ENV } from '@config';
const {
AWS_ACCESS_KEY,
AWS_REGION,
AWS_SECRET_ACCESS_KEY,
AWS_S3_BUCKET_NAME,
} = ENV;
const BUCKET_URL = `https://${AWS_S3_BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com`;
const BUCKET = new AWS.S3({
accessKeyId: AWS_ACCESS_KEY,
secretAccessKey: AWS_SECRET_ACCESS_KEY,
region: AWS_REGION,
});
export const uploadImage = async (
data: Express.Multer.File
): Promise<string | null> => {
try {
if (!data) {
console.log('invalid data');
return null;
}
const fileExtension = path.extname(data.originalname); //파일명
let imageName = path.basename(data.originalname, fileExtension);
let uuid = uuidv4();
const fileName = `${uuid}_${imageName}${fileExtension}`;
if (AWS_S3_BUCKET_NAME) {
await BUCKET.putObject({
Key: fileName,
Bucket: AWS_S3_BUCKET_NAME,
ContentType: 'image/*',
Body: data.buffer,
ACL: 'public-read',
}).promise();
return `${BUCKET_URL}/${fileName}`;
} else {
console.log('uploadImage fail, not setting AWS_S3_BUCKET_NAME');
return null;
}
} catch (err: any) {
console.error('uploadImages error : ', err.message);
return null;
}
};