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にしよう。

Subscribe to 猫好きが猫以外のことも書く

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe