nodejs에서 AWS S3에 파일 업로드 (multer-s3)
AWS
1. IAM 사용자 생성
- 서버에서 S3에 접근하려면 Access Key, Secret Key가 필요합니다.
IAM > 사용자 > 사용자 추가
nodejs 어플리케이션에 적용시킬 엑세스키를 발급해야 합니다.
정책 생성을 클릭합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::{YOUR_S3_BUCKET}/*"
}
]
}
json으로 정책을 넣습니다.
Resource 필드에 자신의 S3 bucket arn/*을 넣습니다.
버킷의 모든 객체에 대해 권한을 주기 위해서 맨 뒤에 /*를 넣어야합니다.
.csv 파일을 다운로드합니다.
다운로드하지 않고 넘어가면 재발급이 불가능합니다.
2. S3 Public Access 권한 설정
- 외부에서 S3 버킷의 정적 파일에 접근할 수 있도록 설정하겠습니다.
S3 > 권한 > 퍼블릭 엑세스 차단
위의 체크박스를 해제하면 모든 퍼블릭 엑세스가 허용됩니다.
버킷 정책 편집
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{YOUR_S3_BUCKET}/*"
}
]
}
버킷 정책은 버킷과 해당 버킷의 객체에 대한 액세스 권한을 부여할 수 있는 리소스 기반 정책입니다.
익명 사용자가 해당 버킷의 객체를 읽을 수 있도록 설정하겠습니다.
Node.js
1. AWS S3와 연결
npm install aws-sdk 로 모듈 설치
const AWS = require('aws-sdk');
AWS.config.update({
accessKeyId: ACCESS_KEY_ID,
secretAccessKey: SECRET_ACCESS_KEY,
region: 'ap-northeast-2',
});
AWS config에 위에서 발급받은 Access Key, Secret Key를 설정합니다.
2. multer-s3 모듈
S3와 multer를 연결하기 위해 multer-s3 모듈을 사용해 storage 객체를 생성합니다.
aws-sdk v2버전이라면 multer-s3 v2버전을 설치해야 합니다.
참고: https://github.com/anacronw/multer-s3
const multer = require('multer');
const multerS3 = require('multer-s3');
const s3 = new AWS.S3();
const upload = multer({
storage: multerS3({
s3: s3,
bucket: '{YOUR_S3_BUCKET}',
key: function (req, file, cb) {
cb(null, `original/${Date.now()}${path.basename(file.originalname)}`);
},
}),
limits: { fileSize: 5 * 1024 * 1024 },
});
router.post('/img', isLoggedIn, upload.single('img'), (req, res) => {
console.log(req.file);
res.json({ url: req.file.location });
});
upload.single()을 통해 업로드를 합니다. 이미지가 여러 장 일 경우 array를 사용합니다.
1. 사용자가 이미지가 포함된 multipart-form/data를 보내면
2. S3와 연결된 multer가 S3에 파일을 올리고 관련 정보를 req.file에 담아 controller에 보냅니다.
3. controller에서는 req.file.location에 정보가 들어있습니다.
req.file 객체는 다음과 같습니다.
{
fieldname: 'img',
originalname: 'ubuntu.png',
encoding: '7bit',
mimetype: 'image/png',
size: 5453,
bucket: '{YOUR_S3_BUCKET}',
key: 'original/1666159528777ubuntu.png',
acl: 'private',
contentType: 'application/octet-stream',
contentDisposition: null,
contentEncoding: null,
storageClass: 'STANDARD',
serverSideEncryption: null,
metadata: null,
location: 'https://{YOUR_S3_BUCKET}.s3.ap-northeast-2.amazonaws.com/original/1666159528777ubuntu.png',
etag: '"dacb7485543f82e85fd6f54b89bb5615"',
versionId: undefined
}