Облачная функция Google; Используйте API-интерфейсы Google Cloud Rest

Ситуация такова, что в моей облачной функции мне нужно создать экземпляр виртуальной машины из шаблона экземпляра. Я использовал пакет @google-cloud/compute, но он не дает возможности сделать это.

Теперь я пытаюсь использовать REST API, однако не могу его авторизовать. Я использую ключи API, как указано на этой странице Используйте API-ключи.

https://www.googleapis.com/compute/v1/projects/<ID>/zones/us-central1-a/instances?key=<API_KEY>&sourceInstanceTemplate=projects/<TEMPLATE_URL>

Также есть тело сообщения, но это не имеет значения, так как ошибка связана с авторизацией.

Я получил ошибку login required.

У меня есть учетная запись службы, которую я использую с клиентом nodejs облачного хранилища в той же облачной функции, но я не смог найти документацию о том, как использовать ту же учетную запись службы с REST API в облачной функции.

Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
0
1 218
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В соответствии с документация, которую вы связали использование ключей API ограничено ограниченным числом API:

A limited number of GCP services allow access using only an API key:

  • Google Cloud Natural Language API
  • Google Cloud Speech API
  • Google Cloud Translation API
  • Google Cloud Vision API
  • Google Cloud Endpoints
  • Google Cloud Billing Catalog API
  • Cloud Data Loss Prevention API

Следовательно, невозможно использовать ключи API для выполнения вызовов REST к ресурсам Compute Engine.

Однако у вас есть возможность использовать Клиент Node.js API Google.

Я сделал небольшой пример со своей стороны, который создает экземпляр Compute Engine из шаблона экземпляра в облачной функции, работающей в Node.js 8 (в Node.js 6 у вас нет возможности создавать асинхронные вызовы, я полагаю , и вы получаете выгоду от этих вызовов, поскольку вам не нужно ждать создания экземпляра, чтобы получить ответ от CF):

index.js

const {google} = require('googleapis');
const compute = google.compute('v1');

exports.helloWorld = async data => {
  const authClient = await google.auth.getClient({
    scopes: [
      'https://www.googleapis.com/auth/cloud-platform',
      'https://www.googleapis.com/auth/compute',
    ],
  });
  const projectId = await google.auth.getProjectId();
  const result = await compute.instances.insert({
    auth: authClient,
    project: projectId,
    zone: "us-east1-c",
    sourceInstanceTemplate: "projects/YOUR_PROJECT_NAME/global/instanceTemplates/YOUR_TEMPLATE_NAME-template",
    resource: {
        name: "example-vm-from-api-call",
    },
  });
  console.info('done');
};

пакет.json

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "google-auth-library": "3.0.0",
    "googleapis-common": "0.6.0",
    "googleapis": "36.0.0"
  }
}

Я жестко запрограммировал имя экземпляра так, чтобы оно всегда было example-vm-from-api-call, но при выполнении запросов к облачной функции вы можете передать имя экземпляра в параметрах и использовать его для создания экземпляра.

Также обратите внимание, что аутентификация выполняется путем выполнения строки const authClient = await google.auth.getClient(...). При этом используется аутентифицированная учетная запись приложения по умолчанию, которая является учетной записью службы, которая выполняет облачную функцию.

Эта учетная запись службы по умолчанию имеет разрешения project/editor, которых достаточно для создания виртуальных машин CE, однако, если вы когда-либо будете использовать другую учетную запись для выполнения этих функций, вам придется предоставить ей правильные области доступа (см. параметры вышеупомянутой функции).

Эй, спасибо за пост. В документации говорится, что перечисленные API-интерфейсы разрешают аутентификацию только с помощью ключей API, английский не является моим родным языком, поэтому я могу неправильно интерпретировать, не означает ли это, что эти API-интерфейсы не допускают другие режимы аутентификации, такие как OAuth, учетная запись службы ? И да, я уже начал изучать googleapis, хотя он огромен, но другого варианта я пока не вижу.

relentless-coder 22.01.2019 06:44

Нет, перечисленные API также могут использовать Oauth или учетную запись службы, и, кроме того, они единственные, которые также поддерживают использование ключей API. Я считаю, что лучший вариант — использовать клиентские библиотеки для выполнения этих вызовов API. Также можно выполнять вызовы CURL непосредственно в www.googleapis.com/..., добавляя тело запроса вручную, но возможно, что это не работает с некоторыми API, и я не пробовал.

Joan Grau Noël 22.01.2019 12:47

API Google поддерживают 3 различных схемы авторизации: ключ API, аутентификация учетной записи пользователя (идентификатор клиента OAuth2) и аутентификация учетной записи службы (JWT/OAuth2). В большинстве случаев это один из последней пары. API-интерфейсы GCP обычно являются межсерверными, что означает учетные записи служб, но, как указано здесь, некоторые из них (доступ к общедоступным данным) также позволяют использовать ключи API. OTOH, к тем, кто обращается к ПОЛЬЗОВАТЕЛЬСКИМ данным, то есть к файлам Диска, можно получить доступ с авторизацией пользователя или svc acct (но никогда с ключом API). Ключи API можно легко потерять или взломать, поэтому в большинстве API Google вместо этого используется схема OAuth. Видео и сообщения в блогах в какой-то момент.

wescpy 01.05.2020 01:29

Другие вопросы по теме