Использование BigQuery API в сценариях приложения с учетной записью службы

Я пытаюсь выполнить задание BigQuery в проекте VPC с помощью сценариев приложений.

Моя цель - сохранить результат в массиве для создания динамического приглашения для DataStudio с использованием коннекторов сообщества.

Используя следующий код:

function runQuery() {
  
  var sql =  "SELECT Distinct ss_cd FROM `vf-pt-ngbi-dev-gen-03.AEAD_DataSet_test.d_customer` WHERE end_dttm IS NOT NULL";
  var queryResults;
  var projectNumber = 'projectNumber'
  
    // Inserts a Query Job
  try {
    var queryRequest = BigQuery.newQueryRequest();
    queryRequest.setQuery(sql).setTimeoutMs(100000);
    queryResults = BigQuery.Jobs.query(queryRequest, projectNumber);
  }
  catch (err) {
    Logger.log(err);
    return;
  }

Поскольку это проект VPC, мне нужно использовать учетную запись службы для выполнения этого запроса?

Однако я хотел бы знать, как добавить эту авторизацию?

Или существует другой подход для выполнения задания BigQuery в проекте VPC и сохранения результатов в массиве?


person Joao Simoes    schedule 19.07.2021    source источник
comment
Удалось ли вам проверить решение ниже?   -  person NaziA    schedule 20.07.2021


Ответы (1)


Вы можете получить токен учетной записи службы в скрипте приложений (см. ссылка), затем используйте этот токен для REST API через UrlFetchApp.

Sample:

function runQuery() {
  // ...
  var service = getService();
  if (service.hasAccess()) {
    sendQuery(service);
  }
  // ...
}

function sendQuery(service){
  var projectId = 'projectID';
  var url = 'https://bigquery.googleapis.com/bigquery/v2/projects/' + projectId + '/queries';
 
  // see request body for reference
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query#QueryRequest
  var body = {
    // ...
  }
      
  var options = {
   "method": "post",
   "headers": {
      "Authorization": "Bearer " + service.getAccessToken()
     },
   "contentType": "application/json", 
   "payload": JSON.stringify(body)
   };
   var response = UrlFetchApp.fetch(url, options);    
}
// direclty copied from https://github.com/googleworkspace/apps-script-oauth2/blob/master/samples/GoogleServiceAccount.gs
function getService() {
  return OAuth2.createService('BigQuery:' + USER_EMAIL)
      // Set the endpoint URL.
      .setTokenUrl('https://oauth2.googleapis.com/token')

      // Set the private key and issuer.
      .setPrivateKey(PRIVATE_KEY)
      .setIssuer(CLIENT_EMAIL)

      // Set the name of the user to impersonate. This will only work for
      // Google Apps for Work/EDU accounts whose admin has setup domain-wide
      // delegation:
      // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
      .setSubject(USER_EMAIL)

      // Set the property store where authorized tokens should be persisted.
      .setPropertyStore(PropertiesService.getScriptProperties())

      // Set the scope. This must match one of the scopes configured during the
      // setup of domain-wide delegation.
      .setScope('https://www.googleapis.com/auth/bigquery');
}

References:

Note:

  • См. вопрос, содержащий код, как ваш должен выглядеть.
person NaziA    schedule 19.07.2021