AWS Lambda с использованием тайм-аута инициализации приложения firebase-admin

Я использую сообщение Lambda для Firebase. Я ссылаюсь на это. Но функция лямбда по-прежнему истекает, потому что не может подключиться к серверу Google.

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() через свойство «credential», не смогла получить действительный токен доступа Google OAuth2 со следующей ошибкой: «connect ETIMEDOUT 172.217.26.45:443».]

Но я использую тот же serviceAccount.json для запуска на своем ec2 и поиска работы. Кто-нибудь сталкивался с этим?


comment
Как вы добавили свой файл serviceAccount.json? Я предполагаю, что вы загрузили почтовый индекс в Lambda, и это не просто встроенный код?   -  person DF_    schedule 18.02.2017
comment
Эта ветка полезна? stackoverflow.com/questions/36508974 /   -  person jwngr    schedule 18.02.2017
comment
@Deif Я использую serverless для загрузки моего файла serviceAccount.json.   -  person Jim    schedule 19.02.2017
comment
@jacobawenger Спасибо за ссылку. Вы даете мне правильное направление!   -  person Jim    schedule 19.02.2017


Ответы (1)


После пары часов борьбы я, наконец, нашел причину. Потому что моя Lambda, использующая VPC для подключения RDS, и сетевой интерфейс VPC имеют только частный IP-адрес.

документ AWS:

Когда вы добавляете конфигурацию VPC в функцию Lambda, она может получить доступ только к ресурсам в этом VPC. Если функции Lambda требуется доступ как к ресурсам VPC, так и к общедоступному Интернету, VPC должен иметь экземпляр преобразования сетевых адресов (NAT) внутри VPC.

Поэтому мне нужно создать NAT внутри VPC. Я читаю этот блог и проблема решена.

person Jim    schedule 19.02.2017