0

Ich benutze Lambda zu Firebase-Nachricht. Ich ref this. Aber die Lambda-Funktion noch Timeout, weil es keine Verbindung zum Google-Server herstellen kann.AWS Lambda mit Firebase-Admin initializeApp Zeitüberschreitung

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".]

Aber ich gleiche serviceAccount.json auf meine EC2 und Arbeit finden laufen. Bekommt jemand das?

+0

Wie haben Sie Ihre Datei 'serviceAccount.json' hinzugefügt? Ich nehme an, Sie haben eine Zip zu Lambda hochgeladen und es ist nicht nur Inline-Code? – Deif

+1

Ist dieser Thread hilfreich? http://stackoverflow.com/questions/36508974/python-request-in-aws-lambda-timing-out – jwngr

+0

@Deif ich benutze serverless um meine serviceAccount.json Datei hochzuladen. – Jim

Antwort

2

Nach ein paar Stunden kämpfen, finde ich endlich den Grund. Da mein Lambda mit VPC RDS und die Netzwerkschnittstelle von VPC verbinden nur private IP haben.

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.

Also muss ich NAT innerhalb der VPC erstellen. Ich folge diesem Blog und Problem gelöst.