js-common-code/docs/cloudStorageByNode.md

3.8 KiB

[GCP][GCS]Node.jsライブラリでストレージを活用する

Node.jsのライブラリを使いストレージを制御します

GCSとの連携について

セキュリティやアクセス制御の観点から、 フロントエンドは直接Cloud Storageにアクセスせず サーバー経由で取得するのが一般的です

ただし静的なファイルや公開データであれば フロントエンドから直接Cloud Storageにアクセスすることもあります

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

npm install --save @google-cloud/storage

GCS接続

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

サービスアカウントを環境変数で設定する場合

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
const storage = new Storage()

JSONキーファイルをソースで読み込む場合

const KEY_FILE_PATH = './keys/service-account.json'

const storage = new Storage({
    keyFilename: KEY_FILE_PATH});

JSONキーファイルを使わず直接設定

const serviceAccount = {
  type: "service_account",
  project_id: "your-project-id",
  private_key_id: "your-private-key-id",
  private_key: "-----BEGIN PRIVATE KEY-----\nYOUR-PRIVATE-KEY\n-----END PRIVATE KEY-----\n",
  client_email: "your-service-account@your-project-id.iam.gserviceaccount.com",
  client_id: "your-client-id",
  auth_uri: "https://accounts.google.com/o/oauth2/auth",
  token_uri: "https://oauth2.googleapis.com/token",
  auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs",
  client_x509_cert_url: "https://www.googleapis.com/robot/v1/metadata/x509/your-service-account"
};
const storage = new Storage({ credentials: serviceAccount });

権限について

  • ストレージ管理者 *
  • 環境とストレージ オブジェクト閲覧者
  • Storage オブジェクト閲覧者
  • ストレージ フォルダ管理者

サンプルコード

バケット一覧を取得する

/**
 * バケット一覧を取得する
 */
async function listBuckets() {
    const [buckets] = await storage.getBuckets();
  
    console.log('Buckets:');
    buckets.forEach(bucket => {
      console.log(bucket.name);
    });
}

ファイル検索については以下のページを参照してください [GCP]Google Cloud Storageでパターンにマッチしたファイル一覧を取得する

バケットの中のファイル一覧を取得する

async function listFiles(bucketName) {
    const [files] = await storage.bucket(bucketName).getFiles();

    console.log(`Files in ${bucketName}:`);
    files.forEach(file => {
    console.log(file.name);
    });
}

署名付きURLを発行する

/**
 * 署名付きURLを生成する
 */
const generateV4ReadSignedUrl = async (bucketName, fileName) => {
    const options = {
        version: 'v4',
        action: 'read',
        expires: Date.now() + 15 * 60 * 1000, // 15 minutes
    };
    const [url] = await storage.bucket(bucketName).file(fileName).getSignedUrl(options);
    console.log(`Generated GET signed URL:`);
    console.log(url);
    return url;
}

ファイルをダウンロードする

// ファイルのコンテンツをダウンロードする
const downloadFile = async () => {
    const options = {
        destination: path.join(__dirname, FILE_NAME)
    };
    await storage.bucket(BUCKET_NAME).file(FILE_NAME).download(options);
    // 取得したファイルのコンテンツからファイルを生成する
    console.log(`Downloaded ${FILE_NAME}`);    
};