Облачная функция Google; Используйте API Google Cloud Rest - PullRequest
0 голосов
/ 21 января 2019

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

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

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

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

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

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

1 Ответ

0 голосов
/ 21 января 2019

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

Ограниченное количество сервисов GCP разрешает доступ с использованием только ключа API:

  • API Google Cloud Natural Language
  • Google Cloud Speech API
  • API Google Cloud Translation
  • API Google Cloud Vision
  • Конечные точки Google Cloud
  • API Google Billing Catalog API
  • API предотвращения потери данных в облаке

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

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

Я сделал небольшой пример со своей стороны, который создает экземпляр 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.log('done');
};

package.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, однако, если вы когда-либо будете использовать другую учетную запись для выполнения этих функций, вам придется предоставить ей правильные области доступа (см. Параметры вышеупомянутая функция).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...