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

박정호·2022년 3월 17일
0

프로젝트를 하나 진행하면서 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개의 댓글