자바스크립트(NodeJS , React(NextJS))에서 multer를 이용하여 AWS S3 에 파일 업로드 코드 작성하기

박정호·2022년 3월 17일

프로젝트를 하나 진행하면서 S3에 파일을 업로드하는 자동화 코드를 작성해야 했다.

코드를 작성하다 막히는 부분이 있어 고민이었던 중에
처음 노드를 공부하면서 파일 업로드시 multer 라이브러리를 사용했던 것이 떠올랐고

검색을 진행하고 multer-s3 라이브러리가 쓸만 할 것 같아
multer 라이브러리를 다시 사용하기로 해보았다.
(multer가 express 관련 라이브러리 인것도 처음 알게 되었다. Wow...)

위에 언급한 막힌 이슈는 맨 아래에 자세히 풀어보도록 하겠다.
우선은, 완성한 코드 설명을 먼저 진행한다.

multer docs는 깃허브에 한글화가 잘 되어 있으니 링크를 남긴다
https://github.com/expressjs/multer/blob/master/doc/README-ko.md

사용한 multer-s3 라이브러리는 다음과 같다
https://github.com/anacronw/multer-s3

multer-s3 Usage를 간략히 써본다
express를 사용하는 법을 안다는 가정하에 글을 작성한다.
이에 대해 모를 경우 express 사전 숙지가 필요하다.

  • 노드 환경이라 가정하고 코드를 기술한다.
    브라우저 환경(React)에서 S3 업로드를 사용하고 싶다면 아래에 막힌 이슈와 함께 설명하겠다.
const aws = require("aws-sdk");
const express = require("express");
const multer = require("multer");
const multerS3 = require("multer-s3");

const app = express();

// 연결할 S3 Config를 적어주면 된다.
// 아래에 구체적으로 기술한다.
const s3 = new aws.S3({
  /* ... */
});

// 업로드 설정
const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 본인의 S3 버켓 이름,

    // 크게는 s3, bucket 파라미터다
    // 아래 파라미터들은 github를 참고하여 취사선택을 하면 된다. 지금은 github example를 가져왔다.
    acl: "public-read",
    key: function (req, file, cb) {
      cb(null, Date.now().toString());
    },
  }),
});

// express api
// 일반적인 경우와 차이라면, 미들웨어로 upload가 들어간다.
// single, array 등 방법의 경우가 많으므로 이 역시 github를 참고하여 본인의 기호에 맞게 작성을 진행한다
app.post('/upload', upload.array('photos', 3), function(req, res, next) {
  res.send('Successfully uploaded ' + req.files.length + ' files!')
})

multer는 간단하게로는 이대로도 동작을 할 것이다.
다음으로 생각해야 할 것이 두 가지가 있다.

  1. AWS S3에 대한 설정
  2. 권한에 대한 설정(EC2를 이용해봤다면 겪었을 그런 복잡 어마 무시한..)
  1. 위에 코드와 이어진다.
// Set the AWS Region
AWS.config.update({
  region: 본인 S3 버킷의 지역(버킷 생성할 때 있었다),
  // 그리고 여기에 2. 권한을 적어주어야 한다.
  // 방법이 여러가지가 있으므로 아래에 순번을 적어 기술해본다.
});

// 앞서 건드리지 않았던 s3 인스턴스를 생성해준다.
const s3 = new AWS.S3({
  apiVersion: "2006-03-01",
  params: { Bucket: 본인 S3 버킷 이름 },
});
  1. 권한에 대한 설정
    1) 직접 적어주기

2) IAM 사용하기
IAM 이란? : Identity and Access Management 란다. 단어가 직관적이서 좋다

https://us-east-1.console.aws.amazon.com/iamv2/home#/users
에서 사용자 추가를 클릭해 본인의 IAM를 생성한다.

나는 액세스 키를 이용하였다(accesKey, secretKey 요런거)
권한을 주기 위해 정책을 선택해 주어야 하는데 AmazonS3FullAccess 를 선택했다

그렇다면 IAM 또한 마무리 되었고 이를 코드에 적어주면 끝이다

AWS.config.update({
  region: 본인 S3 버킷의 지역,
  accessKeyId: 본인 AccesKey,
  secretAccessKey: 본인 SecretKey,
});

이런 식으로 말이다.

3) Cognito 사용하기

// credentials: new AWS.CognitoIdentityCredentials({
//   IdentityPoolId: IDENTITY_POOL_ID,
// }),

const IDENTITY_POOL_ID = "ap-northeast-2:ee62d023-c180-46bf-9e24-935ff2fa2b5a";

이렇게 한다면 업로드는 잘 진행 될 것이다.

혹시나 앞서 기술한 내용이 이해가 잘 안되거나 + 내 푸념식으로

일기를 좀 쓴다.

~~

이분법으로 나누어서 본다면

  1. 클라이언트에서 처리
  2. 서버에서 처리

~~

EC2에 또 배포를 할텐데 지금 이 경험을 꼭 기억하고 양분삼아
더 나은 결과를 만들어보자

뭘 만들고, 그걸 쓰려면 인증을 거친다.

이 프로세스도 프로세스 글에 추가해야 겠다.

참으로 바쁜데 재미는 기깔 나구나~

profile
개발하기

0개의 댓글