# #go #google-cloud-platform #google-compute-engine
#Вперед #google-облачная платформа #google-compute-engine
Вопрос:
Я пытаюсь получить список всех вычислительных экземпляров GCP во всех проектах, к которым у меня есть доступ. Однако есть один проект, который продолжает выдавать мне ответ «в разрешении отказано», и я не могу понять, почему…
Для проверки подлинности я создал учетную запись службы в одном из проектов (назовем ее sa1
, в project_a
). Затем, на уровне организации, я присвоил этому SA роль администратора вычислений. И все работает нормально для всех проектов, кроме одного (давайте назовем его нерабочим project_x
).
Теперь я использую computeService.Instances.AggregatedList
вызов, для которого, согласно документам, требуется compute.instances.list
разрешение. Если я перейду в IAM amp; Admin / Средство устранения неполадок политики и проверю, я узнаю, что это должно сработать:
Access granted for API call for sa1@project_a, compute.instances.list, projects/project_x.
If this outcome was unexpected, contact your support team for further assistance.
Однако, если я попытаюсь фактически запустить код, как только я нажму на этот проект, я получу:
googleapi: Error 403: Permission denied on resource project project_x, forbidden
Код написан на Go на основе примера из документации. Фактический вызов, который я использую, выглядит следующим образом:
func getInstances ( ctx context.Context, cs *compute.Service, projectName string) {
req := cs.Instances.AggregatedList(projectName)
err := req.Pages(ctx, func(page *compute.InstanceAggregatedList) error {
for name, instancesScopedList := range page.Items {
if len(instancesScopedList.Instances) > 0 {
fmt.Printf("===== %v =====n", name)
for _, instance := range instancesScopedList.Instances {
fmt.Printf("-- %#v, %#vn", instance.Name, instance.NetworkInterfaces[0].AccessConfigs[0].NatIP)
}
}
}
return nil
})
if err != nil {
fmt.Println("Error getting list!")
log.Fatal(err)
}
}
Честно говоря, я понятия не имею, что может быть причиной этого, и понятия не имею, как устранить неполадки в дальнейшем. Кто-нибудь может указать мне правильное направление?
О, и если это имеет значение — на самом деле в project_x нет экземпляров compute engine. Но это не должно быть проблемой — у меня есть другие проекты без экземпляров, и я просто получаю от них пустой список.
Комментарии:
1. «Нет вычислительного движка» — это правильный путь. Отличная идея проверить это. Просто сделайте еще один шаг: можете ли вы проверить, активирован ли compute API в project_x?
2. Я об этом не подумал — но я только что проверил, и API Compute Engine включен в этом проекте.
3. Аргумент…. Это моя первая идея. При более внимательном рассмотрении вашего кода вы используете
projectName string
параметр as. Вы уверены, что имя проекта равно project_id для этого проекта?4. Вот и все! Спасибо! У меня был один символ верхнего регистра в названии проекта, который стал строчным в идентификаторе проекта — этой крошечной разницы было достаточно. Я думаю, это то, что я получаю за невнимательное чтение документации (я полностью упустил тот факт, что аргументом должен быть идентификатор :)). Что ж … по крайней мере, я правильно назвал свои переменные: P Если вы опубликуете это в качестве ответа, я с радостью приму его. Еще раз спасибо!!