📝

Cloud StorageのSDK(Node.js)でオブジェクトを操作してみた

2024/08/05に公開

はじめに

業務でCloudStorageを触る機会を頂いたので、SDK(Node.js)でオブジェクトを操作する方法をメモしました!

準備

  1. Node.jsをインストール
    • 公式のインストーラを使用する場合、下記リンクからインストーラをダウンロードしてインストール
      https://nodejs.org/en
    • Homebrewを使用する場合、下記コマンドを入力
      brew install node
      
  2. Cloud StorageのSDKをインストール
    npm install @google-cloud/storage
    

オブジェクト一覧取得

動作の確認のため、バケットを↓の状態に設定します

cloud-storage-sdk-sample/
├── sample_folderA/
│   ├── sample1.txt
│   ├── sample2.txt
│   └── sample_folderB/
│       └── sample3.txt
└── sample4.txt

オプションなし

BucketのgetFilesメソッドを利用することで、バケットからオブジェクトの一覧を取得することができます
https://cloud.google.com/storage/docs/samples/storage-list-files?hl=ja#storage_list_files-nodejs

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function getObjectListSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    // オプションなし
    const options = {};
    const [files] = await storage.bucket(bucketName).getFiles(options);
    files.forEach(file => {
        console.log(file.name);
    });
}

getObjectListSample().catch(console.error);
コンソールの出力値
sample4.txt
sample_folderA/sample1.txt
sample_folderA/sample2.txt
sample_folderA/sample_folderB/sample3.txt

prefixオプション

プレフィックスで始まるオブジェクトのみを取得できるオプションです

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function getObjectListSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    const options = {
        // sample_folderA/で始まるオブジェクトに絞り込む
        prefix: "sample_folderA/",
    };
    const [files] = await storage.bucket(bucketName).getFiles(options);
    files.forEach(file => {
        console.log(file.name);
    });
}

getObjectListSample().catch(console.error);
コンソールの出力値
sample_folderA/sample1.txt
sample_folderA/sample2.txt
sample_folderA/sample_folderB/sample3.txt

delimiterオプション

指定した値で区切られたオブジェクトを仮想的にグループ化し、フォルダ構造のようにオブジェクトを取得できます

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function getObjectListSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    const options = {
        // sample_folderA/で始まるオブジェクトに絞り込む
        prefix: "sample_folderA/",
        // sample_folderA/~/の間のオブジェクトに絞り込む
        delimiter: "/",
    };
    const [files] = await storage.bucket(bucketName).getFiles(options);
    files.forEach(file => {
        console.log(file.name);
    });
}

getObjectListSample().catch(console.error);
コンソールの出力値
sample_folderA/sample1.txt
sample_folderA/sample2.txt

matchGlobオプション

Globパターンに一致したオブジェクトのみを取得できるオプションです

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function getObjectListSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    const options = {
        // ...1.txtの名称を持つオブジェクトに絞り込む
        matchGlob: "**/*1.txt"
    };
    const [files] = await storage.bucket(bucketName).getFiles(options);
    files.forEach(file => {
        console.log(file.name);
    });
}

getObjectListSample().catch(console.error);
コンソールの出力値
sample_folderA/sample1.txt

オプションの詳細は下記をご確認ください
https://googleapis.dev/nodejs/storage/latest/Bucket.html#getFiles

オブジェクトのアップロード

Bucketのuploadメソッドを利用することで、バケットにファイルをアップロードできます
https://cloud.google.com/storage/docs/samples/storage-upload-file?hl=ja#storage_upload_file-nodejs

動作の確認のため、バケットを空に設定します

アップロードの確認用には↓のファイルを利用します

sample1.txt
サンプルテキストです。
サンプルテキストです。
サンプルテキストです。
サンプルテキストです。
サンプルテキストです。

オプションなし

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function uploadFileSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    // アップロードファイル名
    const filePath = "./sample1.txt";
    // オプションなし
    const options = {};

    await storage.bucket(bucketName).upload(filePath, options);

    console.log(`${filePath} uploaded to ${bucketName}`);
}

uploadFileSample().catch(console.error);

実行後のバケット

ブラウザでファイルを確認
繧オ繝ウ繝励Ν繝�く繧ケ繝医〒縺吶€�
繧オ繝ウ繝励Ν繝�く繧ケ繝医〒縺吶€�
繧オ繝ウ繝励Ν繝�く繧ケ繝医〒縺吶€�
繧オ繝ウ繝励Ν繝�く繧ケ繝医〒縺吶€�
繧オ繝ウ繝励Ν繝�く繧ケ繝医〒縺吶€�

destinationオプション

アップロード後の保存ファイル名を設定できます

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function uploadFileSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    // アップロードファイル名
    const filePath = "./sample1.txt";

    const options = {
        // アップロード後のファイル名
        destination: "sample_folderA/sample.txt",
    };

    await storage.bucket(bucketName).upload(filePath, options);
    console.log(`${filePath} uploaded to ${bucketName}/${destFileName}`);
}

uploadFileSample().catch(console.error);

実行後のバケット

contentType

アップロードファイルのcontentTypeを設定できます

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function uploadFileSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    // アップロードファイル名
    const filePath = "./sample1.txt";

    const options = {
        // contentTypeを設定
        contentType: "text/plain; charset=utf-8",
    };

    await storage.bucket(bucketName).upload(filePath, options);
    console.log(`${filePath} uploaded to ${bucketName}/${destFileName}`);
}

uploadFileSample().catch(console.error);

実行後のバケット

ブラウザでファイルを確認
サンプルテキストです。
サンプルテキストです。
サンプルテキストです。
サンプルテキストです。
サンプルテキストです。

gzipオプション

trueに設定するとアップロード時にファイルをgzip圧縮できます

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function uploadFileSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    // アップロードファイル名
    const filePath = "./sample1.txt";

    const options = {
        // contentTypeを設定
        contentType: "application/gzip",
        // アップロード時にファイルをgzip圧縮する
        gzip: true,
    };

    await storage.bucket(bucketName).upload(filePath, options);
    console.log(`${filePath} uploaded to ${bucketName}/${destFileName}`);
}

uploadFileSample().catch(console.error);

実行後のバケット

オプションの詳細は下記をご確認ください
https://googleapis.dev/nodejs/storage/latest/Bucket.html#upload

オブジェクトのダウンロード

Bucketのdownloadメソッドを利用することで、バケットからファイルをダウンロードできます
https://cloud.google.com/storage/docs/samples/storage-download-file?hl=ja#storage_download_file-nodejs

動作の確認のため、バケットを↓の状態に設定します

cloud-storage-sdk-sample/
└── sample1.txt
sample1.txt
サンプルテキストです。

オプションなし

オプションなしで実行すると、ダウンロード対象のデータがバッファとして返還されます

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function downloadFileSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    // ダウンロードファイル名
    const srcFilename = "sample1.txt";
    // オプションなし
    const options = {};

    const [contents] = await storage.bucket(bucketName).file(srcFilename).download(options);

    console.log("File contents:", contents.toString());
}

downloadFileSample().catch(console.error);
コンソールの出力値
File contents: サンプルテキストです。

destination

ダウンロード先のファイルパスを設定できます

サンプルコード
const { Storage } = require("@google-cloud/storage");
const fs = require("fs");

async function downloadFileSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    // ダウンロードファイル
    const srcFilename = "sample1.txt";

    const options = {
        // ダウンロード先のファイルパス
        destination: "./downloadedSample1.txt"
    };

    await storage.bucket(bucketName).file(srcFilename).download(options);

    console.log(`Downloaded file contents: ${fs.readFileSync("./downloadedSample1.txt")}`);
}

downloadFileSample().catch(console.error);
コンソールの出力値
Downloaded file contents: サンプルテキストです。

オプションの詳細は下記をご確認ください
https://googleapis.dev/nodejs/storage/latest/File.html#download

オブジェクトの削除

Bucketのdeleteメソッドを利用することで、バケットのオブジェクトを削除することができます
https://cloud.google.com/storage/docs/samples/storage-delete-file?hl=ja#storage_delete_file-nodejs

実行前のバケット

サンプルコード
const { Storage } = require("@google-cloud/storage");

async function deleteObjectSample() {
    // Storageのインスタンスを作成
    const storage = new Storage({ keyFilename: "./sample-sa-key.json" });
    // バケット名
    const bucketName = "cloud-storage-sdk-sample";
    // 削除ファイル名
    const fileName = "sample_folderA/sample1.txt";

    await storage.bucket(bucketName).file(fileName).delete();

    console.log(`${fileName} deleted from ${bucketName}`);
}

deleteObjectSample().catch(console.error);

実行後のバケット

オプションの詳細は下記をご確認ください
https://googleapis.dev/nodejs/storage/latest/File.html#delete

まとめ

今回は利用頻度の高そうな操作とオプションについて触ってみました。
アップロードメソッドのオプションで gzip圧縮したファイルはダウンロード時に自動でunzipしてくれるのが非常に便利に感じました。

ご覧いただきありがとうございました!

レスキューナウテックブログ

Discussion