Google Cloud functions (with Pubsub) error

Viewed 350

We are using GCP with Cloud functions (with Pubsub topic triggers), and though it works fine most of the time, we do see it often throwing the following authentication error:

Error: Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project. at (/user_code/node_modules/@google-cloud/pubsub/node_modules/grpc/src/node/src/client.js:569)

Has anyone seen this or know what causes it or how to fix?

Cloud function code:

require('dotenv').config()
const datastore = require('@google-cloud/datastore')()
const pubsub = require('@google-cloud/pubsub')()
const promiseRetry = require('promise-retry')
const elasticsearch = require('elasticsearch')
const SupplierSearchManager = require('shared-managers').SupplierSearchManager
const BaseManager = require('shared-managers').BaseManager
const Util = require('shared-managers').Util
const StatsManager = require('shared-managers').StatsManager
var unitTestMode = false
var searchManagerMock, pubsubMock

exports.setUnitTestMode = (searchManagerMockP, pubsubMockP) => {
  unitTestMode = true
  searchManagerMock = searchManagerMockP
  pubsubMock = pubsubMockP
}

exports.updateElastic = event => {
  let dataObject
  try {
    dataObject = JSON.parse(Buffer.from(event.data.data, 'base64').toString())
  } catch (err) {
    console.log(err)
    console.log(event.data.data)
    return Promise.reject(err)
  }
  const baseManager = new BaseManager(datastore, new Util('base-manager'), pubsub)
  const statsManager = new StatsManager(baseManager, new Util('stats-manager'))
  let supplierId = dataObject.supplierId
  let retryCount = dataObject.retryCount
  let refresh = dataObject.refresh === true
  if (!retryCount) retryCount = 0
  return new Promise((resolve, reject) => {
    let elasticClient = new elasticsearch.Client({
      host: process.env.ELASTIC_HOST,
      httpAuth: process.env.ELASTIC_AUTH
    })
    const supplierSearchManager = unitTestMode ? searchManagerMock : new SupplierSearchManager(elasticClient, baseManager, statsManager)
    supplierSearchManager.indexSupplier(process.env.ELASTIC_INDEX, supplierId, refresh).then(resolve, err => {
      console.log(err)
      if (retryCount < 2) {
        const topic = unitTestMode ? pubsubMock : pubsub.topic(process.env.PUBSUB_PREFIX + process.env.PUBSUB_TOPIC_ELASTIC)
        promiseRetry({retries: 4, maxTimeout: 8000}, (retry, number) => {
          return topic.publish({ supplierId: supplierId, retryCount: retryCount + 1 }).catch(err => {
            retry(err)
          })
        }).then(resolve, err => {
          console.log(err)
          reject(err)
        })
      } else {
        resolve(true)
      }
    })
  })
}
0 Answers
Related