express.js + aws s3 upload 테스트 완료
해당 포스트 코드에 필요한 패키지
npm install express multer dotenv @aws-sdk/client-s3 path
테스트 실습을 위한 코드로, 실제 적용 시 수정 필요
// s3Router
const express = require('express');
const router = express.Router();
const { upload, uploadToS3 } = require('../_config/aws.js'); // Multer 및 S3 업로드 함수 가져오기
router.post('/uploadAnnouncement', upload.single('file'), async (req, res) => {
try {
if (!req.file) {
return res.status(400).json({ error: '파일이 업로드되지 않았습니다.' });
}
const result = await uploadToS3(req.file);
console.log("파일 업로드 성공:", result);
res.status(200).json({ message: '업로드 성공', file: req.file });
} catch (error) {
console.error("업로드 오류:", error);
res.status(500).json({ error: '업로드 실패' });
}
});
module.exports = router;
// aws config + upload
const multer = require('multer');
const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');
const path = require('path');
require('dotenv').config();
const s3 = new S3Client({
region: 'ap-northeast-2',
credentials: {
accessKeyId: process.env.AWS_S3_SECRET_ID,
secretAccessKey: process.env.AWS_S3_SECRET_KEY,
}
});
const storage = multer.memoryStorage();
const upload = multer({ storage });
const uploadToS3 = async (file) => {
try {
const uploadParams = {
Bucket: process.env.BUCKET_NAME,
Key: `${Math.floor(Math.random() * 1000)}-${Date.now()}${path.extname(file.originalname)}`,
Body: file.buffer,
};
const command = new PutObjectCommand(uploadParams);
const result = await s3.send(command);
return command;
} catch (error) {
console.error('S3 Upload Error:', error);
throw error;
}
};
module.exports = { upload, uploadToS3 };
aws 보안 키는 aws IAM으로 생성
참고 : https://velog.io/@chrkb1569/AWS-S3-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0-IAM-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4%EC%A0%95