created: 2019-12-04T05:47:44.000Z

nodejsで Google Cloud Storage にファイルをアップロードしてCDNで配信する

こんな場合のスニペット

  • データをJSON形式でアップロードしたい
  • 静的ファイルをアップロードしてCDNがわりに使うようなヘッダを付与したい
    • gcsはs3と違い、公開バケットをCDNキャッシュされてるような状態で配信できる
const upload = async (data, gcsUrl) => {
  const storage = new Storage({
    projectId: '...',
    // gcpのコンソールからダウンロードできるjson鍵ファイル
    credentials: require('cred.json')
  });
  // gs://bucket-name/key/of/path みたいな文字列をパース
  const [bucketName, ...keys] = gcsUrl.replace('gs://', '').split('/');

  // fileオブジェクトを作ってそこにデータを流し込む
  const file = storage
    .bucket(bucketName)
    .file(keys.join('/'));

  // `gzip: true` でアップロードすると gz圧縮された状態でアップロードされる
  // クライアントが Accept-Encoding ヘッダを送ってくる場合には Content-Encoding: gzip で返される
  await file.save(JSON.stringify(data), { gzip: true });
  
  // もろもろメタデータが設定できる
  await file.setMetadata({
    contentType: 'application/json',
    cacheControl: 'public, max-age=600',
    contentLanguage: 'ja'
  });
};

file#metadata はドキュメントにもほとんど記載がなく、TypeScriptの型定義ファイルでもanyになっているのでどんな引数をとるのかがよくわからなかったが、公式のexampleにいろいろ書いてある

ここの another example あたり

console.log(Cache-control: ${metadata.cacheControl}); console.log(Content-type: ${metadata.contentType}); console.log(Content-disposition: ${metadata.contentDisposition}); console.log(Content-encoding: ${metadata.contentEncoding}); console.log(Content-language: ${metadata.contentLanguage});