Language/Node.js

nodejs에서 AWS S3에 파일 업로드 (multer-s3)

Jen'_' 2022. 10. 19. 20:12
반응형

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}/*"
		}
	]
}

버킷 정책은 버킷과 해당 버킷의 객체에 대한 액세스 권한을 부여할 수 있는 리소스 기반 정책입니다.

익명 사용자가 해당 버킷의 객체를 읽을 수 있도록 설정하겠습니다.

참고: https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-use-case-2

 

 


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
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형