Невозможно отобразить вычислительные экземпляры в одном проекте

# #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 Если вы опубликуете это в качестве ответа, я с радостью приму его. Еще раз спасибо!!