com.google.api.config.ServiceConfigSupplier - не удалось получить версию конфигурации по умолчанию для службы (только на локальном хосте)

Я использую Cloud Endpoints Frameworks (2.0.1) для Java как часть моего проекта за последний год и до сих пор был относительно успешным с ним. У меня нет проблем при развертывании на моем домене appspot.com, однако при локальном развертывании у меня возникают некоторые проблемы.

(Любые ссылки на my-project-id в следующих блоках кода являются псевдонимами для моего фактического идентификатора проекта в облачном Google)

У меня есть действительный дескриптор openapi (openapi.json) аннотированного класса @API, который я развертываю на конечных точках облака, используя "gcloud service-management deploy openapi.json". Команда успешно возвращается:

Service Configuration [2017-02-23r0] uploaded for service [api.endpoints.<my-project-id>.cloud.goog]

Затем я сопоставляю возвращенный config_id с правильным endpoints_api_service в моем app.yaml

endpoints_api_service:
  name: api.endpoints.<my-project-id>.cloud.goog
  config_id: 2017-02-23r0

Эта служба указана в gcloud cli с помощью "списка управления службами gcloud".

    NAME                                                           TITLE
    storage-component.googleapis.com                 Google Cloud Storage
    api.endpoints.<my-project-id>.cloud.goog         api.endpoints.<my-project-id>.cloud.goog
    etc...

и "список конфигураций управления службами gcloud --service api.endpoints.my-project-id.cloud.goog"

CONFIG_ID        SERVICE_NAME
2017-02-23r0     api.endpoints.<my-project-id>.cloud.goog
... other version configs

и доступен в моем домене appspot.com (я могу позвонить на конечную точку и получить правильный ответ)

Я пытаюсь развернуть свой проект на локальном хосте, используя плагин maven appengine для java (mvn appengine:devserver), но после запуска я получаю следующее исключение:

 WARNING: Failed startup of context com.google.appengine.tools.development.DevAppEngineWebAppContext...

com.google.api.config.ServiceConfigException: Failed to fetch default config version for service 'api.endpoints.<my-project-id>.cloud.goog'. No versions exist!
at com.google.api.config.ServiceConfigSupplier.fetchLatestServiceVersion(ServiceConfigSupplier.java:155)
....

Затем развертывание застревает в бесконечном цикле попыток запустить причал и получить сообщение об ошибке, перезапуск и т. Д. Любые попытки доступа к localhost:8080 приводят к ошибке "503: служба не найдена"

Я предполагал, что локальное развертывание моего приложения сможет получить доступ к конфигурации службы, которая была развернута с помощью "развертывания gcloud service-management", так же, как и развертывание appspot.com, но разве это не так? Глядя на источник для ServiceConfigSupplier.getchLatestServiceVersion(), я понимаю, что serviceManagement.services(). Configs(). List(my-service-name).execute(). GetServiceConfigs() возвращает пустой список, но почему это только происходит локально?

Дополнительная информация

моя переменная окружения ENDPOINTS_SERVICE_NAME совпадает с 'api.endpoints.my-project-id.cloud.goog'

Я заметил, что несколько дней назад было обновление (1.0.2) для com.google.api.config, и оно зависит от более старой версии com.google.api.services.servicemanagement (зависит от v1-rev14). -1.22.0 с последней версией v1-rev340-1.22.0) Я сомневаюсь, что это проблема, но я подумал, что упомяну об этом, поскольку он содержит классы, относящиеся к исключению (ServiceManagement используется ServiceConfigSupplier, который выбрасывает исключение). Возможно, есть несогласованность в том, где они ищут сервисные конфиги?

Я довольно озадачен, это немного над моей головой. Мне не хотелось бы удалять конечные точки, как мне это начинает нравиться, но мы также не можем потерять использование нашего devserver. Я надеюсь, что кто-то может пролить немного света на эту проблему.

7 ответов

Это не исправление, но я смог обойти проблему, воспользовавшись советом в /questions/11287199/ispolzovanie-oblachnyih-konechnyih-tochek-google-v-appengine/11287207#11287207.

А именно, комментируя ServiceManagementConfigFilter:

б) закомментируйте ServiceManagementConfigFilter из web.xml, т.е.

<!--
    <filter>
      <filter-name>endpoints-api-configuration</filter-name>
      <filter-class>com.google.api.control.ServiceManagementConfigFilter</filter-class>
   </filter>
-->

<!--    
<filter-mapping>
    <filter-name>endpoints-api-configuration</filter-name>
    <servlet-name>EndpointsServlet</servlet-name>
</filter-mapping>
-->

Обратите внимание, что вы должны закомментировать filter и filter-mapping и они не рядом друг с другом в файле.

Я обнаружил, что мне не нужно удалять блок масштабирования, как указано в пункте "а" в связанном ответе.

Это может быть связано с проблемой разрешения, если вы извлекли все последние обновления. git pull Также убедитесь, что ваш Cloud SDK обновлен, используя: gcloud components update,

Предполагая, что вы следовали инструкциям, перечисленным на https://cloud.google.com/endpoints/docs/frameworks/java/quickstart-frameworks-java. Чтобы обойти эту проблему, вы можете создать учетную запись службы с необходимыми разрешениями или использовать команду gcloud auth application-default login,

Вы можете настроить служебную учетную запись с помощью Cloud SDK gcloud по адресу https://cloud.google.com/sdk/docs/authorizing

Пожалуйста, дайте мне знать, если у вас есть еще вопросы.

Что касается команды gcloud auth application-default login, Согласно описанию справки:

Получает учетные данные для доступа пользователей через веб-поток и помещает их в известное место для учетных данных приложения по умолчанию, чтобы использовать их в качестве прокси для учетной записи службы.

Когда вы используете эту команду, она получает учетные данные для gcloud вашей учетной записи Gmail. что-то@gmail.com, а затем сохраняет учетные данные в месте, которое, как известно, содержит учетные данные приложения.

Это может произойти, если вы изменили проект Google Cloud, в котором вы пытаетесь пройти аутентификацию (если кто-то изменил проект, это может произойти, когда вы извлекаете изменения из системы контроля версий). В этом случае учетные данные учетной записи службы, которые вы использовали для старого проекта, больше не будут действительными, и вы можете пройти аутентификацию в новом проекте, выполнив:

gcloud auth application-default login

Он работал с "gradle appengineRun", но в проекте IntelliJ Idea мне пришлось заменить все ${endpoints.project.id} в web.xml и appengine-web.xml, чтобы запустить / отладить localhost из IntelliJ (импортированный из исходников gradle, установленный Плагин Google Cloud Tools и настройте конфигурацию запуска / отладки из Tools/GoogleCloudTools/ Запуск на локальном сервере App Engine Standard dev).

Моя ошибка: не удалось получить версию конфигурации по умолчанию для службы 'echo-api.endpoints.${Endpoints.project.id}.cloud.goog'. Никаких версий не существует!

cloud.google.com в документах есть только пример сборки Maven Сборка Gradle находится на github.com

Для меня проблема заключалась в том, что я не развернул открытый API. Таким образом, выполнив приведенное ниже, проблема была устранена:

      gcloud endpoints services deploy openapi.json

У меня была довольно похожая ошибка,

endpoints.repackaged.com.google.api.config.ServiceConfigException: не удалось получить конфигурацию службы (код состояния 404): не удалось найти имя конфигурации службы и идентификатор конфигурации. Дважды проверьте правильность установки параметров инициализации фильтра endpoints.projectId и endpoints.serviceName.

и проблема для меня заключалась в том, что переменная среды ENDPOINTS_SERVICE_VERSION была указана в моем appengine-web.xml. Таким образом, в принципе, удаления этих строк было достаточно в моем случае (поскольку конечные точки используют самый последний ENDPOINTS_SERVICE_VERSION, если он не предоставлен).

<env-var name="ENDPOINTS_SERVICE_VERSION" value="1" />

Еще одна вещь, которую стоит иметь в виду, это то, что ваша учетная запись службы имеет необходимые разрешения, ваша учетная запись службы выглядит следующим образом

[project ID]@appspot.gserviceaccount.com. 

По умолчанию это Project(редактор), по крайней мере, вам нужно предоставить его в качестве роли Service Controller.

Если это не так, вы можете следовать этим инструкциям, чтобы добавить обратно.

Другие вопросы по тегам