[express] aws s3 upload

dnslfkrh·2024년 7월 19일

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

profile
안녕하세요

0개의 댓글