Ситуация такова, что в моей облачной функции мне нужно создать экземпляр виртуальной машины из шаблона экземпляра. Я использовал пакет @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 в облачной функции.

В соответствии с документация, которую вы связали использование ключей 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 также могут использовать Oauth или учетную запись службы, и, кроме того, они единственные, которые также поддерживают использование ключей API. Я считаю, что лучший вариант — использовать клиентские библиотеки для выполнения этих вызовов API. Также можно выполнять вызовы CURL непосредственно в www.googleapis.com/..., добавляя тело запроса вручную, но возможно, что это не работает с некоторыми API, и я не пробовал.
API Google поддерживают 3 различных схемы авторизации: ключ API, аутентификация учетной записи пользователя (идентификатор клиента OAuth2) и аутентификация учетной записи службы (JWT/OAuth2). В большинстве случаев это один из последней пары. API-интерфейсы GCP обычно являются межсерверными, что означает учетные записи служб, но, как указано здесь, некоторые из них (доступ к общедоступным данным) также позволяют использовать ключи API. OTOH, к тем, кто обращается к ПОЛЬЗОВАТЕЛЬСКИМ данным, то есть к файлам Диска, можно получить доступ с авторизацией пользователя или svc acct (но никогда с ключом API). Ключи API можно легко потерять или взломать, поэтому в большинстве API Google вместо этого используется схема OAuth. Видео и сообщения в блогах в какой-то момент.
Эй, спасибо за пост. В документации говорится, что перечисленные API-интерфейсы разрешают аутентификацию только с помощью ключей API, английский не является моим родным языком, поэтому я могу неправильно интерпретировать, не означает ли это, что эти API-интерфейсы не допускают другие режимы аутентификации, такие как OAuth, учетная запись службы ? И да, я уже начал изучать googleapis, хотя он огромен, но другого варианта я пока не вижу.