cron でジョブを回して生成したファイルをホストする というようなありがちなパターンをGCPを使ってサーバレス・ほぼ無料 で実現するためのTipsをまとめます。Functions は python で記述します。
1. 省略手順書
- Storageダッシュボードで バケットを作成 します
- PubSubダッシュボードで トピックを作成 します
- Functions ダッシュボードで 上記PubSub トピックをトリガとしたFunctionsを定義し出力先を上記Storageのバゲット内のファイルにします
- Scheduler ダッシュボードで上記PubSubトピックに定期的にエンキューする タイマを定義 します
公式ドキュメントのチュートリアルが参考になるかも:
2. Tips
Storageまわり
- Webに公開するためには allUser にオブジェクト参照権限を付与してください
- デフォルトのキャッシュ設定が6時間なので同一ファイル更新する場合明示的にキャッシュコントロールが必要です。単純にはキャッシュ無効にすればいいのでしょうがケースバイケースです。以下はpythonでのFunctionsのコード例:
def _upload(bucket, name, content):
b = storage.Client().bucket(bucket).blob(name)
b.cache_control = 'no-cache, no-store, max-age=0'
b.upload_from_string(content)
Functionsまわり
- Storageにファイル格納するということは、Storageのクライアントアプリということになります。クライアントライブラリを含める必要があります。自動でFunctionsを実行するサービスエージェントとして認証されます(前述のスニペット):
requiremnt.txt
google-cloud-storage==2.*
PubSubまわり
- 作成したトピックですが、Functionsがサブスクライブしたら不要なので、メッセージ保持時間を10分程度に短くしておいたほうが安心です。とはいえ、デフォルトの7日間でも多分無料枠でいけると思います
- Functions側で設定するとサブスクライブ用のトピックが自動生成されていますが気にしなくてよいです
3. 費用
- Functions は月300万回まで無料だった気がするので気にする必要はありません
- Storage はアップロードを含むタイプAの操作の無料枠が月3000回とかなので、アップロードの頻度に気を付けたほうがいいでしょう
- PubSubの料金は、一般的にはかなりエグいのですがこのユースケースであればほぼ無料です
- Schedulerは月3個まで無料です
以上より、費用の大部分はネットワーク通信費となるでしょう。Storageで公開したファイルのダウンロード回数や、Functionsのロジックを回した際にWebへのアクセスする際の通信が該当するでしょう。個人や少人数のグループでつかうなら月に10円とかでしょうか?
ダウンロード数が多く費用がかかるなら GCP やめて github pages とかにするとかも考えられます。
4. 所感
GCPではインスタンス1個が無料なので、本稿でやったようなことはあまり不要かもしれませんが、一度作ってしまえばサーバレスでメンテフリーとなるのはうれしいかもしれません。