動かざることバグの如し

殿、温めておいたバグがこちらでございます

NodejsでGoogle Cloud Storageへファイルをアップロードしてみる

環境

  • nodejs v8.8.1

ここではAWSでいうS3にあたるGoogle Cloud StorageへNodejsでローカルのファイルをアップロードしたりしてしてみる。

サービスアカウントの作成

まずは権限設定 アクセスに必要なキーを含むJSONファイルをゲットする必要がある。

  • GCPコンソールへログイン
  • GCP のプロジェクトを選択
  • 上の検索バーで「API」と入力 「認証情報 APIとサービス」と項目をクリック
  • 「認証情報を作成」をクリック「サービスアカウントキー」を選択
  • 新しいサービスアカウントを選択、サービスアカウント名は任意、役割でストレージに権限を振る
  • 作成をクリック
  • するとJSONファイルがダウンロードされるので保管

詳しくは以下 Google Cloud Platform のサービスアカウントキーを作成する | MAGELLAN BLOCKS

ライブラリのインストール

公式ライブラリの@google-cloud/storageを使う yarnでインストール

yarn add @google-cloud/storage

基本

async/awaitによる同期処理が可能なので使う。以下のように

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

const storage = new Storage({
  projectId: 'プロジェクトID',
  keyFilename: 'さっき保存したJSONのパス'
});

const bucketName = 'バケット名';

const main = async() => {
  var filename ='index.js';
  await storage
    .bucket(bucketName)
    .upload(filename, {gzip: true})
    .then(res => {
      // 公開状態にする場合
      // res[0].makePublic();
      console.log(res[0].metadata);
      console.log(`${filename} uploaded to ${bucketName}.`);
    })
    .catch(err => {
      console.error('ERROR:', err);
    });
}

main();

これでnode index.jsをするとファイルがGCSにアップロードされる。

一覧表示

ファイル一覧
await storage
  .bucket(bucketName)
  .getFiles()
  .then(results => {
    const files = results[0];
    files.forEach(file => {
      console.log(file.name);
    });
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

プレフィックスで絞ることもできる(suffixはない模様

await storage
  .bucket(bucketName)
  .getFiles({
    prefix: 'us-central1-projects/'
  })
  .then(results => {
    const files = results[0];
    files.forEach(file => {
      console.log(file.name);
    });
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

その他のAPI

以下のサンプルコード集が参考になる。

https://github.com/googleapis/nodejs-storage/blob/master/samples/files.js