Доступ к computeMetadata при отладке в облачном коде

#google-cloud-run #google-cloud-code

# #google-cloud-запустить #google-cloud-code

Вопрос:

Я пытаюсь локально отладить контейнер для запуска в облаке. В моем коде я пытаюсь получить информацию об окружающей среде через computeMetadata.

     location = requests.get("http://metadata.google.internal/computeMetadata/v1/instance/region",
                          headers={'Metadata-Flavor': 'Google'}).text
    logging.warning(f"Location set to {location}")
    project = requests.get("http://metadata.google.internal/computeMetadata/v1/project/project-id",
                              headers={'Metadata-Flavor': 'Google'}).text
    logging.warning(f"Project set to {project}")
 

При выполнении этого фрагмента кода я получаю приведенную ниже ошибку.

 urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='metadata.google.internal', port=80): Max retries exceeded with url: /computeMetadata/v1/instance/region (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fb00be99190>: Failed to establish a new connection: [Errno 111] Connection refused'))
 

Конечно, я ничего не знаю о запуске порта 80 на моем Macbook, который мог бы обслуживать это, и, похоже, в контейнере нет ничего, что могло бы это сделать, поэтому было бы разумно, что он не может подключиться.

Итак, с учетом сказанного, как я могу выполнить этот код локально, чтобы убедиться, что он ведет себя так, как я хочу, перед его развертыванием? На данный момент я заключил его в оператор try / except, но он не идеален для воспроизведения сценариев реального мира.

Комментарии:

1. Я нашел это . Я никогда не тестировал.

2. Правильно, вы не можете получить доступ к серверу метаданных локально. Однако у вас, вероятно, есть локальные учетные данные, установленные с помощью учетных данных приложения по умолчанию с использованием переменной среды GOOGLE_APPLICATION_CREDENTIALS . Используя библиотеку Google-auth , вы можете получить свой идентификатор проекта с помощью: « импортировать google. учетные данные для авторизации, project_id = google.auth.default() «

3. Что касается местоположения, это немного сложнее, и я бы рекомендовал добавить флаг env var, например if os.env.PROD: ...

Ответ №1:

Существует несколько эмуляторов, которые вы можете запускать локально.

Гийом указал в комментариях к вопросу на тот, который больше внимания уделял GCE

И совсем недавно Келси Хайтауэр выпустила еще один, посвященный метаданным, доступным в облачном режиме