0

我使用Lambda to Firebase消息。我参考​​。但lambda函数仍然超时,因为它无法连接到谷歌服务器。AWS Lambda使用firebase-admin initializeApp超时

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的

[Error: Credential implementation provided to initializeApp() via the "credential" property failed to fetch a valid Google OAuth2 access token with the following error: "connect ETIMEDOUT 172.217.26.45:443".]

但是我用同样的serviceAccount.json对我的EC2和工作发现运行。 有人遇到过吗?

+0

你是如何添加'serviceAccount.json'文件的?我假设你上传了一个zip到Lambda,它不只是内联代码? – Deif

+1

此线程有帮助吗? http://stackoverflow.com/questions/36508974/python-request-in-aws-lambda-timing-out – jwngr

+0

@Deif我使用无服务器来上传我的serviceAccount.json文件。 – Jim

回答

2

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

AWS document

When you add VPC configuration to a Lambda function, it can only access resources in that VPC. If a Lambda function needs to access both VPC resources and the public Internet, the VPC needs to have a Network Address Translation (NAT) instance inside the VPC.

所以我需要创建NAT的VPC内。 我按照这个Blog和问题解决。