uju's Tech

[GCP:Node.js] Cloud Storage 파일 업로드 본문

DevOps/GCP

[GCP:Node.js] Cloud Storage 파일 업로드

ujusy 2021. 6. 2. 00:58

<본 포스팅은 공부 목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>

 

aws의 s3를 주로 사용해왔어서 gcp의 cloud storage도 쉬울줄 알았건만 연결하는 과정에서 막히는 부분이 많았다 .. 😭ㅋ

 

1. 일단 gcp의 cloud storage에 들어가서 생성을 해준다.

 (그냥 생성하면 된다.. 여긴 생략)

 

2. iam에서 권한을 바꿔줘야한다..

(권한 바꿔주지 않고 개발하다가 왜 안돼..이랬던 기억이..😔)

 

iam (api 권한) 을 all users 로 변경하고(모든 사용자가 접근할 수 있게), 

ACL 객체 public으로 변경해준다.

 

storage 버킷의 권한에 들어가면 하단에 권한 구성원을 확인할 수 있다.

 

위와 같이 권한을 추가해 주었다. 

 

3. 그러면 multer을 이용해서 프로젝트의 utils파일에 로컬에 올라갈 파일 경로 설정하자,,

 

const uploadUserProfileImage = multer({
  dest: '/tmp/profile',
  limits: {
    fileSize: bytes('1mb'),
    files: 1,
  },
}).single('profileImage');

4. 이를 cloud storage에 올리는 코드 작성..

 

const env = process.env.NODE_ENV;

const { Storage } = require('@google-cloud/storage');

if (env !== 'ci') {
  if (!process.env.STORAGE_USERCONTENTS_HOST) throw new Error('STORAGE_USERCONTENTS 환경변수가 설정되어 있지 않습니다.');
}
const bucketName = process.env.STORAGE_USERCONTENTS_HOST;

const storage = new Storage();

const storageUploadUserProfileImage = (fileData) => new Promise((resolve, reject) => {
  storage.bucket('usercontents').upload(`${fileData.path}`, {
    destination: `/profile/${fileData.filename}`,
  }, (err, data) => {
    if (err) reject(err);
    else resolve(data);
  });
});
module.exports = {
  storageUploadUserProfileImage,
};

 

fileData는 아래와 같은 형식이다.

(console에 찍어보고 구현했다 ..)

{
fieldname: 'profileImage',
originalname: '\x0Bn\fn.jpeg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: '/tmp/profile',
filename: '3511073dbf7f5d605fd24eaa3717e5d8',
path: '/tmp/profile/3511073dbf7f5d605fd24eaa3717e5d8',
size: 111511
}

fileData.path가 multer를 이용해서 로컬에 저장한 파일 경로이다.

해당 경로에 있는 파일을 destination(스토리지 경로)로 업로드 하는 코드이다.

 

 

 

 

multer 구현하는 부분은 aws 구현과 동일하고 클라우드에 올리는 부분의 구현 부분에서 차이가 있다.

 

공식 문서를 보고 코드 작성을 하였고 약간의 시행 착오  + 시간 소요 가 있었지만 정상적으로 잘 작동한다..ㅎㅎ 

 

 

 

 

Comments