LoginSignup
10
9

More than 5 years have passed since last update.

AWS LambdaからFirestoreに書き込む

Last updated at Posted at 2018-07-16

趣味開発でAWS LambdaからGoogle傘下サービスFirebaseのFirestoreへデータを書き込みをしたい需要が発生したため試した。

環境

  • OSX HighSierra
  • AWS CLI 導入・設定済
  • Node v10.6

firebase-adminインストール

yarn add firebase-admin

ソース

公式のクイックスタートを参考に以下コードをざっと書く。

index.js
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

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9