AWS S3 bucket 생성하기(bucket 이름 복사)
IAM policies 생성하기
1) detail
(1) servies: "S3"
(2) action: Get Object, Put Object, Delete Object, Get Object Attributes
(3) resource: specific
(4) Add ARN
- Bucket name: 복사 붙여넣기
- Object name * (Any)
2) next tags
3) next review
(1) Review Policy
- name:
4) create policy
Add User
1) set user detail
(1) user name
(2) select AWS credencial type: Access Key
2) set permission
(1) Attach existing policies directly
(2) Filter policies: policy name select
3) next review
4) Create User
(1) Download .csv click
aws-sdk 설치하기
npm install aws-sdk
// .env
AWS_ACCESS_KEY_ID =
AWS_SECRET_ACCESS_KEY =
AWS_REGION =
AWS_BUCKET_NAME =
s3Service.js 파일 만들기// s3Service.js
const {s3} = require("aws-sdk");
const uuid = require("uuid").v4;
exports.s3Uploadv2 = async(file) => {
const s3 = new s3();
const param = {
Bucket: process.env.AWS_BUCKET_NAME,
key: `uploads/${uuid()}-${file.originalname}`,
Body: file.buffer
};
return await s3.upload(param).promise();
}
index.js 파일을 다음과 같이 수정 // index.js
require("dotenv").config();
const express = require("express");
const multer = require("multer");
const uuid = require("uuid").v4;
const app = express();
// custom filename
const storage = multer.memoryStorage({
// memoryStorage(): 업로드된 파일을 메모리에 저장하는 방법을 지정하는 함수. 업로드된 파일을 버퍼로 저장하며, 파일 시스템에 저장하지 않고도 파일을 처리할 수 있게 함.
destination: (req, file, cb) => {
cb(null, "uploads"); // error가 없을 경우 null을 반환하고 파일을 업로드함.
},
filename: (req, file, cb) => {
const {originalname} = file;
cb(null, `${uuid()}-${originalname}`);
}
});
const fileFilter = (req, file, cb) => {
if(file.mimetype.split("/")[0] === 'image/jpeg') {
cb(null, true)
} else {
cb(new Error("file is not of the correct type."), false);
}
};
//["image", "jpeg"]
// multer middleware
const upload = multer({
storage,
fileFilter,
limits: {fileSize: 1000000, files: 2}
});//1 megabyte
app.post("/upload", upload.array("file"), async (req, res) => {
const file = req.files[0];
const result = await s3Uploadv2(file);
res.status(200).json({success: true, result});
})
// error handling middleware
app.use((error, req, res, next)=>{
if (error instanceof multer.MulterError) {
if(error.code==="LIMIT_FILE_SIZE") {
return res.json({message: "file limit reached."});
}
if(error.code === "LIMIT_FILE_COUNT"){
return res.json({message: "file is too large."});
}
if(error.code === "LIMIT_UNEXPECTED_FILE"){
return res.json({message: "file must be an image."});
}
}
})
app.listen(4000, () => console.log("listening on port 4000"));