Gcp/Firebase/CloudFunctions/基本
目次
- 1 CloudFunctionsとは
- 2 CloudFunction準備
- 3 functionsを新規作成
- 4 スクリプト修正
- 5 deploy
- 6 現在のデフォルトプロジェクト確認
- 7 httpアクセス
- 8 東京リージョン指定
- 9 log
- 10 errorlog
- 11 Spark無料枠
- 12 Blaze 従量プラン
- 13 Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictionsが出る場合
- 14 一定数のリクエストを超えると
- 15 存在しないエンドポイントにアクセスすると
- 16 外部ライブラリインストール
CloudFunctionsとは
- サーバーレスアーキテクチャ。関数処理をしてくれるもの。awsのLambdaと同じ。
- nodeで動く
CloudFunction準備
nvmインストール
Javascript/nodejs/インストール/nvm [ショートカット]
firebaseログイン
$ npm install -g firebase-tools $ firebase --version 6.10.0 $ firebase login
ブラウザが開くので、firebaseコンソールに繋がるgoogleアカウントでログインする。
firebaseログアウト
$ firebase logout
functionsを新規作成
$ firebase init functions ? What language would you like to use to write Cloud Functions? JavaScript ? Do you want to use ESLint to catch probable bugs and enforce style? No ✔ Wrote functions/package.json ✔ Wrote functions/index.js ✔ Wrote functions/.gitignore ? Do you want to install dependencies with npm now? Yes
- プロジェクトを選択
- JavaScriptとTypeScriptを選択、とりあえずJavaScriptを選択
- ESLintはデフォルトoffだったので、offで作成
- npmの依存パッケージはデフォルトyesだったので、yesで作成
スクリプト修正
functions/index.js
exports.helloWorld = functions.https.onRequest((request, response) => { response.send("Hello from Firebase!"); });
コメントを外す
deploy
$ firebase deploy --only functions ttps://us-central1-unity-xxxxx.cloudfunctions.net/helloWorld
メソッドをコメントアウトしたままだと公開用urlは出てこない
現在のデフォルトプロジェクト確認
$ firebase list │ Name │ Project ID / Instance │ Permissions │ │ unitysample (current) │ unitysample-31353 │ Owner │ │ unity-fabric-project │ unity-android-demo │ Owner │
現在のデフォルトプロジェクト変更
$ firebase use [project id]
プロジェクト指定
$ firebase deploy --only functions --project hogeproject-12341
Error: Error parsing triggers: Cannot find module 'firebase-functions'エラーが出る場合
cd functions npm install
特定functionのみ
firebase deploy --only functions:addMessage
httpアクセス
Hello from Firebase!
最初のアクセスだけgoogle認証が必要?2回目からは別のブラウザからでも認証画面が出てこなかった。
東京リージョン指定
const functions = require('firebase-functions'); exports.helloWorld = functions.region('asia-northeast1').https.onRequest((request, response) => { response.send("Hello from Firebase! asia-northeast1"); });
既に別の場所にdeployしてる場合は、その場所のfunctionsは削除され、東京に新たに作られる。
hostingから連携してた場合は、us-central1以外へアクセスすると"Your client does not have permission to get URL /helloWorld from this server."エラーとなる。
log
console.log('I am a log entry!');
- console.log() INFO ログレベル
- console.error() ERROR ログレベル
- 内部システム DEBUG ログレベル
以下のような感じで表示される
時刻arrow_downward レベル 関数 イベント メッセージ 1:57:06.117 午前 info helloWorld I am aa log entry! 1:56:20.007 午前 warning helloWorld2 error2
\nで改行にできる。ただし、文字列が多い場合のみ
logに表示されるのは丁度5000文字まででした。5000文字以上は特にエラーなくカットされてた。
errorlog
以下記述よってグラフ反映に違いがある。
console.error(new Error('message')); // エラーグラフに反映される console.error('message'); // エラーグラフに反映されない。がjavaエラーのStackLogなフォーマットな感じだと記録されるっぽい。
Stackdriver Error Reporting にエラーを送信したい場合も。
参考:https://cloud.google.com/functions/docs/monitoring/error-reporting?hl=ja
errorlogをメールアラート設定
新しく起こったerrorlogをメールするには stackdriverのサイトhttps://console.cloud.google.com/errors へ行って、 設定から新しいエラーが起こったときに通知するように設定する。
既存エラーでピークが発生した際は設定がないので自力でやる?
log割り当て制限
https://cloud.google.com/logging/quota-policy
ログエントリのサイズ 100 KB* entries.write リクエストのサイズ 5 MB* entries.write API 呼び出しの数 1 プロジェクトあたり 1,000 回/秒 entries.list API 呼び出しの数 1 プロジェクトあたり 1 回/秒 ログエントリの保持期間 30 日(プレミアム階層) 7 日(基本階層) ユーザー定義のログベースの指標 1 プロジェクトあたり 500 件 API からのページトークンの有効期間 24 時間
Spark無料枠
呼び出し125K/month GB 秒 40K/month CPU 秒 40K/month アウトバウンド ネットワーキング Google services only
https://firebase.google.com/pricing/?hl=ja
Blaze 従量プラン
呼び出し $0.40/百万 GB 秒 $0.0025/千 CPU 秒 $0.01/千 アウトバウンド ネットワーキング $0.12/GB
Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictionsが出る場合
請求先アカウントを登録する
一定数のリクエストを超えると
speakプランで、呼び出し125K/monthを超えた後でもstatus_code:200が返ってきた。 70回/分を超えると以下のようになったが・・。
status_code=429 message=Too Many Requests
存在しないエンドポイントにアクセスすると
Error: Forbidden Your client does not have permission to get URL /dummyendpoint from this server.
ステータスコード403となる
外部ライブラリインストール
例としてmomentライブラリを入れる
cd functions npm install moment
functions/package.json にmomentが追加されてることを確認
"dependencies": { "firebase-admin": "^8.0.0", "firebase-functions": "^3.1.0", "moment": "^2.24.0" },
index.js
const moment = require("moment"); console.log("format=" + moment().format()); // format=2019-08-24T09:19:10+00:00 console.log("YYYY-MM-DD=" + moment().format("YYYY-MM-DD")); // YYYY-MM-DD=2019-08-24 console.log("YYYY-MM-DD HH=" + moment().format("YYYY-MM-DD HH:mm:ssZ")); // YYYY-MM-DD HH=2019-08-24 09:19:10+00:00 console.log("unix format=" + moment().unix()); // unix format=1566638922 moment.unix(1404817123); // 日付設定