Edited at

[GCP]Cloud StorageのアップロードイベントをCloud Functionsへ通知するための流れをざっくり


概要

Google Cloud Functions(以下、GCF)とGoogle Cloud Storage(GCS)を組み合わせて、サーバレスな関数を作る機会が合ったので手順を書く。

これによって、GCSにmp4をアップロードしたタイミングでGCFを起動しZencoderのAPIを通してHLSに変換したり応用した。


やりたかった事


  • GCSの特定バケットにアップロードされたイベントでGCFを起動する

  • GCFはbeta版のNode.js(version8)を使う

  • 環境変数をyaml形式のenvファイルに定義しGCFで使用する


    • env varはベータ版のようで下位互換なしで変更される可能性があるため注意。詳細はこちらに




前提

gcloudコマンドがインストールされている事。してない場合はここから


GCFの関数サンプル

適当なディレクトリを作成しnpm initして、エントリポイントとなるjsファイルを作成する。

例としてindex.jsとする。package.jsonの設定はnpm initでも後で修正するでも良い


index.js

'use strict';

exports.sampleHandler = (data, event) => {
console.log('hello GCS upload event');
};



package.json

{

"name": "sampleHandler",
"version": "1.0.0",
"description": "Google Cloud Functions Sample",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"private": true
}


デプロイするまでのコマンドフロー

gcloud componentであるbetaをインストールする

$ gcloud components update && gcloud components install beta

GCFへのデプロイする。runtimeにはnodejs8を指定する。(いずれ、Goも指定できるようになる)

gcloud beta functions deploy {FUNCTION_NAME} --region {REGION} --runtime nodejs8 --stage-bucket {GCS_SRC_STORAGE} --trigger-bucket={TARGET_GCS_BUCKET}  --env-vars-file={ENV_YAML}


コマンドオプション一覧

- {FUNCTION_NAME}

- GCFのエントリポイントとなる関数名。例だとsampleHandler
- {REGION}
- どのリージョンを使用するか
- {GCS_SRC_STORAGE}
- GCFのソースコードを保存するGCSバケット
- {TARGET_GCS_BUCKET}
- アップロードイベントを監視するGCSバケット
- {ENV_YAML}
- 環境変数を定義したyamlフォーマットのファイル


終わり

gloud beta functionsコマンドの詳細は公式ドキュメントにて