趣味開発でAWS LambdaからGoogle傘下サービスFirebaseのFirestoreへデータを書き込みをしたい需要が発生したため試した。
環境
- OSX HighSierra
- AWS CLI 導入・設定済
- Node v10.6
firebase-adminインストール
yarn add firebase-admin
ソース
公式のクイックスタートを参考に以下コードをざっと書く。
const admin = require("firebase-admin");
const serviceAccount = require("./serviceAccountKey.json"); // FirebaseのWebコンソールから落としてくる。
const app = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "" // 略
});
const db = admin.firestore();
const docRef = db.collection("users").doc("alovelace");
const setAda = docRef.set({
first: "Ada",
last: "Lovelace",
born: 1815
});
nodeモジュールを含むためzipで固めてデプロイ。
実行時エラー発生
いざLambdaコンソールでテスト実行すると以下のエラーが発生してFirestoreのメソッドが機能しない。
Error: Failed to load gRPC binary module because it was not installed for the current system
原因と対処
要するに、ローカル開発環境とデプロイ先Lambda環境間における、
- OSの差異 (ローカル=OSX, Lambda=たぶんAmazonLinux)
- Nodeバージョンの差異 (ローカル=v10.6, Lambda=v6.10)
が原因っぽい。
一旦node_modulesを削除。
lockファイルも削除。
rm -r node_modules
rm package-lock.json yarn.lock
Dockerのnode:6.10イメージを使ってnodeモジュールを落としてくる。
docker run --rm -it -v "$PWD":/worker -w /worker node:6.10.3 npm i --silent
再度zipで固めてアップロードしたらちゃんとFirestoreに書き込めた。
ちなみに、 LambdaはNode v8.10も対応しているのでv8.10に切り替えてのデプロイも試みたが、なぜか上手くいかなかったので深追いせずv6.10で妥協。
参考
https://firebase.google.com/docs/firestore/quickstart
https://stackoverflow.com/questions/39436072/cannot-destroy-firebase-connections-making-hot-lambda-fail-due-to-firebase-app
https://stackoverflow.com/questions/47979568/aws-lambda-error-failed-to-load-grpc-binary-module-because-it-was-not-installed
https://github.com/firebase/firebase-admin-node/issues/247
https://medium.com/@samstern_58566/how-to-use-cloud-firestore-on-aws-lambda-4bf6d3a473d9
https://www.npmjs.com/package/node-pre-gyp