firebase functionsのメモリ使用量を制御する
create: 2019-11-22
firebase functions

functionsの課金方式を確認してみました。
Cloud Functions の料金

呼び出し回数の他にCPU時間というのがありまして、使用メモリを下げると CPU のスペックも下がるという仕様。

2019/11/22 現在、下記のような料金体系になっています。

メモリ CPU1 料金/100 ミリ秒
128 MB 200 MHz $0.000000231
256 MB 400 MHz $0.000000463
512 MB 800 MHz $0.000000925
1,024 MB 1.4 GHz $0.000001650
2,048 MB 2.4 GHz $0.000002900

Slack連携のためにBlazeプランにしたので、少しでも課金されないようにfunctionsのスペックを下げてみます。
デフォルトでは 256MB が割り当てられていますが、コメントの I/O だけではオーバースペックです。

128MB に変更してみましょう。

プログラム内でランタイムオプションを渡す

GUI コンソール無しでデプロイ時に決定できる方法です。
firebase 公式の関数のデプロイとランタイム オプションを管理するに設定方法が紹介されています。

プログラムではなく、firebase コンソールから GUI で変更したい場合は「firebase functions のメモリ使用量をコンソールから制御する」を参照してください。

const functions = require('firebase-functions')

// ランタイムオプション(メモリ割り当てなど)
const runtimeOpts = {
  timeoutSeconds: 30,
  memory: '128MB'
}

// 関数登録時にrunWithでランタイムオプションを設定する
exports.api = functions.runWith(runtimeOpts).https.onCall((data, ctx) => {
  // do something
})

今回はメモリサイズのついでにタイムアウトも設定してみました。
なんらかの不具合で無限ループした場合や外部要因で応答がない場合は 30 秒でタイムアウトするようにしています。

メモリサイズに使える値は以下の通りで、最小構成は 128MB のようです。

  • 128MB
  • 256MB
  • 512MB
  • 1GB
  • 2GB

メモリを 256MB から 128MB に落とすと CPU クロックが半分になるため、単純に処理時間がほぼ 2 倍になってしまいます。
コールドスタート時のアイドルも含めると結構長く感じます。

うーん、悩ましい。

ここまでやってみたけど、どうせアクセスも少ないので1GBにしよう。