본문 바로가기
개발 환경/AWS

[AWS] Google drive에 있는 파일을 Amazon S3 Bucket에 업로드하기

by 우주다람쥐 2021. 4. 21.
반응형

비개발자에게 Amazon S3 Bucket에 직접 파일을 업로드하도록 하기에는 보안, 운영 등 여러 부분에서 이슈가 생길 수 있다.

Google Drive에 파일을 올리게 하고 해당 파일을 자동으로 S3 Bucket으로 업로드 시키도록 개발을 해보자.

 

Google Drive API

1. 서비스 계정 만들기

Google Cloud Platform에서 서비스 계정을 만들어 준다.

 

 

서비스 계정 이름, 계정 ID을 작성한다.

서비스 계정 설명 및 선택사항은 작성하지 않아도 된다.

 

 

서비스 계정 정보에 들어가서 새 키를 생성해 준다.

 

 

json으로 만들면 해당 파일 다운로드까지 된다.

다운로드한 json 파일은 추후에 필요하니 잘 저장해 준다.

 

 

2. 구글 드라이브 파일에 서비스 계정 연결하기

구글 드라이브 파일에 서비스 계정을 연결한다.

1번에서 만든 서비스 계정의 이메일을 공유자로 추가해준다.

이 때는 반드시 편집자 권한을 줘야한다.

 

 

 

3. 구글 드라이브 파일 가져오기

먼저 드라이브에 테스트할 이미지 하나를 업로드 한다.

 

업로드한 이미지를 가져와 buffer 구조의 파일로 변환하는 코드는 다음과 같다.

 

'use strict';

const { google } = require('googleapis');
const path = require('path');

const drive = google.drive('v3');

(async function() {
  try {
    // json 비공개 key 파일 경로
    const keyFile = path.join(__dirname, 'key/test.json');
    // auth 설정
    const auth = new google.auth.GoogleAuth({
      keyFile,
      scopes: ['https://www.googleapis.com/auth/drive'],
    });
    google.options({ auth });

    // 공유한 폴더
    const parentsId = '1ynDKfx_r6rBF9F38bhHimg49IUMdx6iM';

    // 공유한 폴더 하위 리스트
    const list = await drive.files.list({
      q: `'${parentsId}' in parents`,
    });

    // 하위 리스트 중 첫번째 이미지를 가져온다
    const fileId = list.data.files[0].id;
    const { data } = await drive.files.get({
      fileId,
      alt: 'media',
      supportsAllDrives: true
    }, {
      responseType: 'stream'
    });

    // buffer 구조로 이미지 데이터를 변환한다
    const buf = [];
    data.on('data', (e) => {
      buf.push(e);
    });

    let buffer = false;
    data.on('end', () => {
      buffer = Buffer.concat(buf);
    });
  } catch (error) {
    console.error(error);
  }
})();

 

중간에 가져온 리스트를 console.log로 찍어 보면 다음과 같다.

 

 

여기서 id를 이용해서 상세 조회를 하거나, 파일을 다운로드 할 수 있다.

나머지 정보는 파일과 관련된 기본 메타정보 이다.

 

위의 코드에서는 해당 id 값으로 이미지 파일을 가져왔다.

그리고 buffer 구조로 변환하였는데, 그 이유는 AWS SDK에서 사용하기 위해서 이다.

이제 Amazon S3 Bucket에 해당 데이터를 업로드 해본다.

 

- 관련 링크 : https://www.npmjs.com/package/googleapis

 

googleapis

Google APIs Client Library for Node.js

www.npmjs.com

 

4. Amazon S3 Bucket으로 이미지 업로드

AWS SDK를 이용해서 S3에 업로드 한다.

 

'use strict';

const { google } = require('googleapis');
const path = require('path');
const AWS = require('aws-sdk');

const drive = google.drive('v3');

(async function() {
  try {
    // json 비공개 key 파일 경로
    const keyFile = path.join(__dirname, 'key/test.json');
    // auth 설정
    const auth = new google.auth.GoogleAuth({
      keyFile,
      scopes: ['https://www.googleapis.com/auth/drive'],
    });
    google.options({ auth });

    // 공유한 폴더
    const parentsId = '1ynDKfx_r6rBF9F38bhHimg49IUMdx6iM';

    // 공유한 폴더 하위 리스트
    const list = await drive.files.list({
      q: `'${parentsId}' in parents`,
    });
    const fileId = list.data.files[0].id;
    const fileName = list.data.files[0].name;

    // 하위 리스트 중 첫번째 이미지를 가져온다
    const { data } = await drive.files.get({
      fileId,
      alt: 'media',
      supportsAllDrives: true
    }, {
      responseType: 'stream'
    });

    // buffer 구조로 이미지 데이터를 변환한다
    const buf = [];
    data.on('data', (e) => {
      buf.push(e);
    });
    data.on('end', () => {
      const buffer = Buffer.concat(buf);

      // s3 업로드 관련 정보 세팅
      const s3 = new AWS.S3();
      const params = {
        Bucket: 'test',
        Key: `images/${fileName}`,
        Body: buffer,
      };
      // s3 업로드
      s3.putObject(params, (err, res) => {
        if (err) {
          console.error(err);
        } else {
          console.log(res);
        }
      });
    });
  } catch (error) {
    console.error(error);
  }
})();

 

해당 코드를 동작시키려면 AWS SDK에 S3 업로드 권한이 있는 유저로 configure를 등록해야 한다.

관련 내용은 아래의 링크를 참조하면 된다.

 

기본 세팅이 완료되었다면 S3 버킷을 하나 만들고, 폴더를 추가해 준다.

그리고 params에 해당 정보를 작성하고, 관련 정보를 업로드 한다.

 

- 관련 링크 : https://aws.amazon.com/ko/sdk-for-node-js/

 

Node.js의 JavaScript용 AWS SDK

Node.js에서 JavaScript용 AWS SDK를 AWS와 함께 사용하여 빠르게 시작합니다. SDK를 사용하면 Amazon S3, Amazon EC2, DynamoDB 및 Amazon SWF를 포함하는 AWS 서비스를 위한 JavaScript 객체가 제공되므로 복잡하게 코드

aws.amazon.com

 

반응형

댓글