Создание проекта GCP через API не позволяет использовать Service Usage API
Я пытаюсь автоматизировать весь процесс создания проекта с помощью официального Google SDK для Node.js. Для создания проекта я использую SDK Resource Manager:
const resource = new Resource();
const project = resource.project(projectName);
const [, operation,] = await project.create();
Мне также нужно включить некоторые службы, чтобы использовать их в процессе. Когда я бегу:
const client = new ServiceUsageClient();
const [operation] = await client.batchEnableServices({
parent: `projects/${projectId}`,
serviceIds: [
"apigateway.googleapis.com",
"servicecontrol.googleapis.com",
"servicemanagement.googleapis.com",
]
});
Я получил:
Service Usage API has not been used in project 1014682171642 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/serviceusage.googleapis.com/overview?project=1014682171642 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
Мне кажется подозрительным, что API использования службы не включен по умолчанию, когда я создаю проект через API. Очевидно, что если мне нужно было что-то включить вручную, то можно использовать преимущества API. Когда я создаю проект через Could Console, API использования службы включен по умолчанию, поэтому эта проблема затрагивает только API. Возможно, есть другой способ программно включить API использования службы.
Буду признателен за любую помощь.
3 ответа
Как описано в документации GCP:
Когда вы создаете облачный проект с помощью Cloud Console или Cloud SDK, следующие API и службы включены по умолчанию ...
В вашем случае вы создаете проект с клиентской библиотекой . В проектах, созданных с использованием клиентских библиотек или REST, по умолчанию не включены какие-либо API.
К сожалению, вы не можете вызвать функцию «Использование службы», чтобы включить использование службы в проекте, так как для этого необходимо, чтобы использование службы было уже включено в проекте ресурса.
Я предлагаю автоматизировать процесс создания проекта на каком-то сценарии bash и создавать их с помощью gcloud projects create
команды.
Я написал полный блок кода, который у меня сработал. Заранее прошу прощения, если страдает качество кода (наверное, я его забил) - буквально не знаю никаких nodejs - я скомпилировал его из вашего кода и пары примеров в Интернете.
const {Resource} = require('@google-cloud/resource-manager');
const {ServiceUsageClient} = require('@google-cloud/service-usage');
const projectId = '<YOUR PROJECT ID>';
const orgId = '<YOUR ORG ID>'; // I had to use org for my project
const resource = new Resource();
async function create_project() {
await resource
.createProject(`${projectId}`, {
name: `${projectId}`,
parent: { type: "organization", id: `${orgId}` }
})
.then(data => {
const operation = data[1];
return operation.promise();
})
.then(data => {
console.log("Project created successfully!");
enable_apis();
});
}
const client = new ServiceUsageClient();
async function enable_apis() {
const [operation] = await client.batchEnableServices({
parent: `projects/${projectId}`,
serviceIds: [
"serviceusage.googleapis.com",
"servicecontrol.googleapis.com",
"servicemanagement.googleapis.com",
]
})
}
create_project();
Это успешно создает проект и включает три API. Я бы убедился, что проект полностью создан, прежде чем пытаться включить apis (это всего лишь теория).
Что касается ссылки , о которой вы упомянули ранее, я собираюсь здесь порассуждать, но я думаю, что под Cloud SDK они имели в виду инструмент командной строки gcloud, который является частью Cloud SDK.
Я хотел сделать то же самое: полностью программную настройку нового проекта, включая включение API.
По сути, это единственный результат в Интернете, который затрагивает эту потребность, я думаю, что все просто используют clickops или gcloud.
Ну, я сделал--log-http
на gcloud при создании проекта и обнаружил, что он POSTS{}
к:https://serviceusage.googleapis.com/v1/projects/<project-id>/services/cloudapis.googleapis.com:enable?alt=json
Несмотря на то, что при этом используетсяserviceusage
конечной точки, в этом проекте у меня отключен API использования сервисов. Я думаю, может быть, они позволяютcloudapis.googleapis.com
мета-сервис должен быть включен, даже если использование сервиса еще не включено.
Когда я отправил сообщение в эту конечную точку, используяcurl
для нового проекта, созданного через API, он действительно включил базовый набор API, включая API использования сервиса.
$ curl -X POST -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d "{}" https://serviceusage.googleapis.com/v1/projects/<project-id>/services/cloudapis.googleapis.com:enable?alt=json
{
"name": "operations/acat.p2-3333333333-5555fffe-88888-472c-b280-444444444444"
}
$ curl -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" https://serviceusage.googleapis.com/v1/operations/acat.p2-3333333333-5555fffe-88888-472c-b280-444444444444?alt=json
{
"name": "operations/acat.p2-3333333333-5555fffe-88888-472c-b280-444444444444",
"metadata": {
"@type": "type.googleapis.com/google.protobuf.Empty"
},
"done": true,
"response": {
"@type": "type.googleapis.com/google.api.serviceusage.v1.EnableServiceResponse",
"service": {
"name": "projects/11111111111111/services/cloudapis.googleapis.com",
"config": {
"name": "cloudapis.googleapis.com",
"title": "Google Cloud APIs",
"documentation": {
"summary": "This is a meta service for Google Cloud APIs for convenience. Enabling this service enables all commonly used Google Cloud APIs for the project. By default, it is enabled for all projects created through Google Cloud Console and Google Cloud SDK, and should be manually enabled for all other projects that intend to use Google Cloud APIs. Note: disabling this service has no effect on other services.\n"
},
"quota": {},
"authentication": {},
"usage": {
"requirements": [
"serviceusage.googleapis.com/tos/cloud"
]
},
"monitoring": {}
},
"state": "ENABLED",
"parent": "projects/11111111111111"
}
}
}
Я также смог сделать это с помощью nodejs@google-cloud/service-usage
библиотека:
const svcclient = new ServiceUsageClient()
async function enableServices(id) {
const [op] = await svcclient.enableService({ name: `projects/${id}/services/cloudapis.googleapis.com` })
const [resp] = await op.promise()
console.log(`Enabled services on project.`)
}