AWS Lambda使用firebase-admin initializeApp超时

时间:2017-02-18 07:36:54

标签: amazon-web-services firebase aws-lambda firebase-cloud-messaging firebase-admin

我使用Lambda到Firebase消息。我引用this。但lambda函数仍然超时,因为它无法连接到谷歌服务器。

Handler.js

/ [START imports]
const firebase = require('firebase-admin');
const serviceAccount = require("../serviceAccount.json");

module.exports.message = (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;  
  const registrationToken = "xxxxxxx";

  const payload = {
    data: {
      score: "850",
      time: "2:45"
    }
  };

  // [START initialize]
  if(firebase.apps.length == 0) {   // <---Important!!! In lambda, it will cause double initialization.
    firebase.initializeApp({
      credential: firebase.credential.cert(serviceAccount),
      databaseURL: 'https://messaging-xxxxx.firebaseio.com'
    });
  }

  // Send a message to the device corresponding to the provided
  // registration token.
  firebase.messaging().sendToDevice(registrationToken, payload)
    .then(function(response) {
      // See the MessagingDevicesResponse reference documentation for
      // the contents of response.
      console.log("Successfully sent message:", response);
      callback(null, {
        statusCode: 200,
        body: JSON.stringify("Successful!"),
      });
    })
    .catch(function(error) {
      console.log("Error sending message:", error);
      callback(null, {
        statusCode: 500,
        body: JSON.stringify({
          "status": "error",
          "message": error
        })
      })
    });
};

CloudWatch的

  

[错误:通过“凭据”属性向initializeApp()提供的凭据实施无法获取有效的Google OAuth2访问令牌,但出现以下错误:“connect ETIMEDOUT 172.217.26.45:443”。]

但我使用相同的serviceAccount.json在我的ec2上运行并找到工作。 有人遇到过这个吗?

1 个答案:

答案 0 :(得分:2)

经过几个小时的挣扎,我终于找到了原因。 因为我的Lambda使用VPC连接RDS和VPC的网络接口只有私有IP。

AWS document

  

将VPC配置添加到Lambda函数时,它只能访问该VPC中的资源。如果Lambda函数需要访问VPC资源和公共Internet,则VPC需要在VPC内部具有网络地址转换(NAT)实例。

所以我需要在VPC内部创建NAT。 我遵循这个Blog并解决了问题。