Ошибка развертывания. Не удалось настроить конфигурацию.

Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee
X.info

Симптом

Развертывание изменений API-прокси или Shared Flow через пользовательский интерфейс Edge или API управления завершается ошибкой "Configuration failed ".

Сообщение об ошибке

В пользовательском интерфейсе Edge появится сообщение об ошибке, как показано ниже:

The revision is deployed, but traffic cannot flow.
com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}

Вот скриншот примера сообщения об ошибке, наблюдаемого в пользовательском интерфейсе Edge:

Возможные причины

Развертывание API-прокси может завершиться ошибкой «Configuration failed» по множеству различных причин. В таблице ниже перечислены некоторые часто встречающиеся причины, приводящие к этой ошибке:

Причина Описание Инструкции по устранению неполадок, применимые для
Отсутствует Java-класс в политике JavaCallout. В JAR-файле, на который ссылается политика JavaCallout, отсутствует Java-класс. Пользователи частного облака Edge
В условиях выполнения алгоритма обработки условий используются некорректные операнды. Операнды/выражения, используемые с одной или обеих сторон операторов в условиях, недействительны.
Недопустимое имя хоста в политике регистрации сообщений. Имя хоста, используемое в политике MessageLogging, не может быть разрешено или может содержать нежелательные специальные символы.
Недопустимое имя KeyValueMap В политике KeyValueMapOperations в API-прокси значение KeyValueMap недействительно или пусто.

Общие этапы диагностики

  1. Получите статус развертывания для конкретной версии API-прокси, для которой вы наблюдаете ошибку развертывания, используя указанный ниже API:

    curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Вот пример выходных данных, полученных с помощью указанного выше API;

    "server" : [ { 
    "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "0a20926c-f4bf-401b-af84-05fd84b9f492" 
    }, { 
    "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "f2ee6ab4-a108-4465-a7ba-b56530d8e3fc" 
    }, { 
    "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "0f41991e-b310-4e77-aac5-5fdb150ef9f6" 
    },
    
  3. В выходных данных о состоянии развертывания в каждом из обработчиков сообщений вы увидите сообщение об ошибке «Сбой конфигурации» .

  4. Войдите в один из обработчиков сообщений и проверьте журнал /opt/apigee/var/log/edge-message-processor/logs/system.log . Убедитесь, что нет ошибок, возникших во время развертывания API-прокси.

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

  6. В разделах ниже описаны некоторые из наиболее часто встречающихся исключений, приводящих к ошибке развертывания « Сбой конфигурации» , а также приведены шаги по устранению и исправлению этих ошибок.

Причина: Отсутствует Java-класс в политике JavaCallout.

Диагноз

  1. Если в журналах обработчика сообщений вы видите какое-либо исключение с сообщением «Не удалось создать экземпляр класса JavaCallout» во время развертывания прокси-сервера API (DeployEvent), как показано ниже, перейдите к шагу № 2. В противном случае перейдите к разделу «Неправильные операнды, используемые в условиях в потоке условий» .
  2. В процессе развертывания API-прокси обработчик сообщений выдает следующее исключение:

    2017-10-10 05:02:42,330 Apigee-Main-5 ERROR MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : error configuring config events [DeployEvent{organization='myorg', application='oauth2', applicationRevision='14', deploymentSpec=basepath=/;env=dev;, deploymentID=null}] 
    com.apigee.kernel.exceptions.spi.UncheckedException: Failed to instantiate the JavaCallout Class com.something.apigee.callout.crypto.main.SecretCallout 
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition.newInstance(JavaCalloutStepDefinition.java:89) ~[javacallout-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.StepDefinition.getStepDefinitionExecution(StepDefinition.java:230) ~[message-processor-1.0.0.jar:na] 
    
    <snipped>
    
  3. Сообщение об ошибке в указанном выше исключении указывает на то, что не удалось создать экземпляр класса JavaCallout com.something.apigee.callout.crypto.main.SecretCallout . Эта ошибка обычно возникает, когда конкретный класс отсутствует в JAR-файле, указанном в политике JavaCallout, или в любом из зависимых от него JAR-файлов.

  4. Проверьте JAR-файл, содержащий все классы, относящиеся к пакету com.something.apigee.callout.crypto.main , и убедитесь, что отсутствует конкретный класс com.something.apigee.callout.crypto.main.SecretCallout .

Разрешение

  1. Добавьте недостающий класс в соответствующий JAR-файл и загрузите этот JAR-файл.
  2. Повторно разверните API-прокси.
  3. В приведенном выше примере мы решили проблему следующим образом:
    1. Добавление отсутствующего класса com.something.apigee.callout.crypto.main.SecretCallout в JAR-файл.
    2. Загрузка обновлённого JAR-файла и повторное развертывание API-прокси.

Причина: Неправильные операнды, использованные с операторами в потоке условий.

Диагноз

  1. В журналах обработчика сообщений, если вы видите исключение com.apigee.expressions.parser.ParseException это означает, что в них может отображаться ошибка. com.apigee.expressions.parser.ParseException Если при развертывании API-прокси или общего потока, как показано в приведенных ниже примерах сообщений, перейдите к шагу № 2. В противном случае перейдите к следующей причине: Недопустимое имя хоста в политике ведения журнала сообщений .

    Пример сообщения об ошибке

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    
  2. Давайте рассмотрим пример, чтобы понять, как диагностировать эту проблему.

    Пример: Операндами для выражения <Оператор> должны быть выражения данных.

  3. В процессе развертывания общего потока сообщений обработчик сообщений выдает следующее исключение:

    2017-11-23 09:11:04,498  Apigee-Main-6 ERROR MESSAGING.RUNTIME - AbstractConfigurator.loadXMLConfigurations() : Unable to Load default for path /organizations/myorg/apiproxies/Introspection/revisions/12/sharedflows/default
    2017-11-23 09:11:04,499  Apigee-Main-6 ERROR MESSAGING.RUNTIME - Application.sync() :  sync error for Introspection and revision 12
    2017-11-23 09:11:04,499  Apigee-Main-6 ERROR MESSAGING.RUNTIME - Application.sync() :  Actual Error
    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
        at com.apigee.expressions.parser.ExpressionParser.buildExpressionTree(ExpressionParser.java:337) ~[expressions-1.0.0.jar:na]
        at com.apigee.expressions.parser.ExpressionParser.parse(ExpressionParser.java:24) ~[expressions-1.0.0.jar:na]
        at com.apigee.expressions.parser.ExpressionParser.parseLogicExpression(ExpressionParser.java:28) ~[expressions-1.0.0.jar:na]
        at com.apigee.messaging.runtime.Step.getExpression(Step.java:67) ~[message-processor-1.0.0.jar:na]
        at com.apigee.messaging.runtime.Step.handleAdd(Step.java:58) ~[message-processor-1.0.0.jar:na]
        at com.apigee.messaging.runtime.SharedFlowRuntime.addStep(SharedFlowRuntime.java:81) ~[message-processor-1.0.0.jar:na]  <snipped>
    
  4. Сообщение об ошибке в ParseException — « Both the operands for EQUALS expression should be data expressions » — указывает на проблему, связанную с условием равенства (=), неравного значения (!=) или статистической значимости с оператором (=|).

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

    1. Выражения по обе стороны от оператора имеют один и тот же тип. Например, если слева от оператора находится строковая переменная, то справа от неё должна находиться другая строковая переменная или строковое значение.
    2. Между операторами используются допустимые переменные.
    3. Между оператором и каждым из выражений стоит пробел.

  6. Если хотя бы один из вышеупомянутых критериев не выполняется, возникает исключение ParseException — " Both the operands for EQUALS expression should be data expressions ".

  7. Давайте рассмотрим пример, чтобы понять эту проблему. Вот пример ошибки, которая...

    <Condition>
               (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved")
    </Condition>
    
  8. В этом примере видно, что между оператором «или» и следующим условием нет пробела. Поэтому при разборе второго условия первое выражение воспринимается как «or(fault.name)» для оператора EQUALS. Это недопустимое имя переменной, поэтому оно не рассматривается как допустимое выражение данных. В результате возникает следующее исключение:

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    

Разрешение

  1. Убедитесь, что по обе стороны от операторов всегда используются корректные выражения данных.
  2. В приведенном выше примере решение заключалось в том, чтобы обеспечить наличие пробела после оператора «или», как описано в фрагменте кода:

    <Condition>
               (fault.name = "invalid_access_token") or (fault.name = "ApiKeyNotApproved")
    </Condition>
    
    

Недопустимое имя хоста в политике регистрации сообщений.

Диагноз

  1. Если в журналах обработчика сообщений вы видите какое-либо исключение с сообщением "Invalid HostName" во время развертывания API-прокси или общего потока, как показано ниже, перейдите к шагу № 2. В противном случае перейдите к следующей причине : Invalid KeyValueMap Name .

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Рассмотрим два примера ниже, чтобы понять, как устранять и решать эту проблему.

Пример 1: Имя хоста содержит нежелательный специальный символ.

  1. В процессе развертывания API-прокси обработчик сообщений выдает следующее исключение:

      2018-01-20 02:12:13,535 Apigee-Main-3 ERROR MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : error configuring config events [DeployEvent{organization='myorg', application='providersearch', applicationRevision='4', deploymentSpec=basepath=/;env=prod;, deploymentID=null}] 
      com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler 
      at com.apigee.messaging.runtime.destinations.SyslogDestination.<init>(SyslogDestination.java:44) ~[message-processor-1.0.0.jar:na] 
      at com.apigee.messaging.runtime.destinations.SysLoggerFactory.getInstance(SysLoggerFactory.java:39) ~[message-processor-1.0.0.jar:na]
      at com.apigee.messaging.runtime.destinations.DestinationRegistry.newDestination(DestinationRegistry.java:44) ~[message-processor-1.0.0.jar:na] 
      ...<snipped>
    
  2. Приведенное выше исключение указывает на то, что развертывание завершается с ошибкой "Недопустимое имя хоста '<имя хоста>' для обработчика Syslog" . Это означает, что имя хоста, используемое в политике MessageLogging, является недопустимым именем хоста.

  3. Внимательное изучение исключения в журнале обработчика сообщений показывает, что в конце имени хоста 'splunkprod.myorg.com/'.

  4. Этот нежелательный специальный символ стал причиной ошибки при развертывании.

Разрешение

  1. Для решения проблемы измените политику MessageLogging, удалив все нежелательные специальные символы.
  2. В приведенном выше примере специальный символ "/" был удален из политики регистрации сообщений. Это решило проблему.

Пример 2: Неразрешимое имя хоста

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

    2017-12-22 00:13:49,057 Apigee-Main-87446 INFO MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : configuring [DeployEvent{organization='myorg', application='myapi', applicationRevision='42', deploymentSpec=basepath=/;env=dev;, deploymentID=null}] 
    
    2017-12-22 00:13:49,318 Apigee-Main-87446 ERROR c.a.p.h.d.DNSCachedAddress - DNSCachedAddress.refresh() : Unable to resolve host : input-prd.cloud.splunk.com: Name or service not known 
    
    2017-12-22 00:13:49,323 Apigee-Main-87446 ERROR MESSAGING.RUNTIME - AbstractConfigurator.handleUpdate() : Fatal error deploying proxy: {} 
    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'input-prd.cloud.splunk.com' for Syslog handler 
    at com.apigee.messaging.runtime.destinations.SyslogDestination.<init>(SyslogDestination.java:44) ~[message-processor-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.destinations.SysLoggerFactory.getInstance(SysLoggerFactory.java:39) ~[message-processor-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.destinations.DestinationRegistry.newDestination(DestinationRegistry.java:44) ~[message-processor-1.0.0.jar:na] 
    at com.apigee.steps.messagelogging.MessageLoggingStepDefinition.populateDestinations(MessageLoggingStepDefinition.java:118) ~[message-logging-1.0.0.jar:na] 
    at com.apigee.steps.messagelogging.MessageLoggingStepDefinition.handleAdd(MessageLoggingStepDefinition.java:99) ~[message-logging-1.0.0.jar:na] 
    
    <snipped> 
    
  2. Приведенное выше исключение указывает на то, что развертывание завершается с ошибкой "Недопустимое имя хоста '<hostname>' для обработчика Syslog" .

  3. Если вы внимательно прочитаете строку выше сообщения об исключении, то заметите, что обработчик сообщений не может разрешить имя хоста 'input-prd.cloud.splunk.com' указанное в политике MessageLogging.

  4. Для подтверждения этого вы можете попробовать подключиться через Telnet к имени хоста и номеру порта, указанным в политике регистрации сообщений.

    1. Проверьте политику MessageLogging в конкретной версии API-прокси и убедитесь в правильности используемого имени хоста и номера порта. В приведенном выше примере имя API-прокси: myapi, версия: 42.

      Политика ведения журнала сообщений

        <MessageLogging async="false" continueOnError="false" enabled="true" name="Log-To-Splunk">
            <DisplayName>Log-To-Splunk</DisplayName>
            <Syslog>
                <Message>Message.id = {request.header.id}</Message>
                <Host>input-prd.cloud.splunk.com</Host>
                <Port>2900</Port>
                <Protocol>TCP</Protocol>
                <SSLInfo>
                    <Enabled>true</Enabled>
                </SSLInfo>
            </Syslog>
        </MessageLogging>
      
    2. Подключитесь к хосту через Telnet, используя указанный порт. В этом примере мы попробовали использовать Telnet и получили ту же ошибку, что и в журнале обработчика сообщений:

      telnet input-prd.cloud.splunk.com 2900 
      telnet: input-prd.cloud.splunk.com: Name or service not known 
      input-prd.cloud.splunk.com: Host name lookup failure
      
  5. Это ясно доказало, что имя хоста не может быть разрешено.

Разрешение

  1. Измените политику MessageLogging, чтобы она использовала допустимое имя хоста.

Если проблема сохраняется, перейдите к разделу «Необходимо собрать диагностическую информацию» .

Причина: Недопустимое имя KeyValueMap.

Диагноз

  1. Если в журналах обработчика сообщений во время развертывания API-прокси или общего потока, как показано ниже, вы видите исключение с сообщением «Недопустимое имя KeyValueMap» , перейдите к шагу № 2. В противном случае перейдите к разделу «Необходимо собрать диагностическую информацию» .

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Давайте рассмотрим пример, чтобы понять, как устранять и решать эту проблему.

  3. Пример журнала обработчика сообщений , демонстрирующий исключение с сообщением "Недопустимое имя KeyValueMap", приводящее к ошибке при развертывании API-прокси.

    2018-02-27 14:14:50,318  Apigee-Main-6 ERROR MESSAGING.RUNTIME - AbstractConfigurator.handleUpdate() : Fatal error deploying proxy: {}
    com.apigee.keyvaluemap.KeyValueMapApiException: KeyValueMap name  is invalid
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.validateMapName(KeyValueMapServiceImpl.java:125) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.createOrUpdateKeyValueMap(KeyValueMapServiceImpl.java:185) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.digest(KeyValueMapOperationsStepDefinition.java:180) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.handleAdd(KeyValueMapOperationsStepDefinition.java:197) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.entities.AbstractConfigurator.handleUpdate(AbstractConfigurator.java:130) [config-entities-1.0.0.jar:na]
            at com.apigee.messaging.runtime.Application.handleUpdate(Application.java:229) [message-processor-1.0.0.jar:na]
    
    2018-02-27 14:14:50,344  Apigee-Main-6 ERROR BOOTSTRAP - RuntimeConfigurationServiceImpl.dispatchToListeners() : RuntimeConfigurationServiceImpl.dispatchToListeners : Error occurred while dispatching the request DeployEvent{organization='myorg', application='CustomerAPI', applicationRevision='1', deploymentSpec=basepath=/;env=test;, deploymentID=null} to com.apigee.application.bootstrap.listeners.MessageProcessorBootstrapListener@5009d06e
    com.apigee.keyvaluemap.KeyValueMapApiException: KeyValueMap name  is invalid
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.validateMapName(KeyValueMapServiceImpl.java:125) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.createOrUpdateKeyValueMap(KeyValueMapServiceImpl.java:185) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.digest(KeyValueMapOperationsStepDefinition.java:180) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.handleAdd(KeyValueMapOperationsStepDefinition.java:197) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.entities.AbstractConfigurator.handleUpdate(AbstractConfigurator.java:130) ~[config-entities-1.0.0.jar:na]
            at com.apigee.messaging.runtime.Application.handleUpdate(Application.java:229) ~[message-processor-1.0.0.jar:na]
    
  4. Второе исключение, указанное выше, свидетельствует о том, что ошибка развертывания произошла для API-прокси: CustomerAPI, версия: 1.

  5. Проверив трассировку стека, можно заметить, что ошибка возникает при выполнении политики KeyValuMapOperations.

  6. Изучив пакет API Proxy, вы обнаружите одну политику KeyValuMapOperations, содержащую код, показанный ниже:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Pulling-Keys" mapIdentifier="">
     <DisplayName>Pulling Keys</DisplayName>
     <Properties/>
     <ExclusiveCache>false</ExclusiveCache>
    
    
  7. Как видно выше, mapIdentifier , указывающий имя KeyValueMap, содержит пустую строку. Имя KeyValueMap не может быть пустой строкой. Это и стало причиной ошибки развертывания.

Разрешение

  1. Измените политику KeyValueMapOperations, чтобы присвоить KeyValueMap корректное допустимое имя.
  2. В приведенном выше примере мы решили проблему, изменив KeyValueMapOperations и присвоив KeyValueMap имя "MyKeyValueMap", как показано ниже:

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Pulling-Keys" mapIdentifier="MyKeyValueMap">
        <DisplayName>Pulling Keys</DisplayName>
        <Properties/>
        <ExclusiveCache>false</ExclusiveCache>
    

Необходимо собрать диагностическую информацию.

Если проблема сохраняется даже после выполнения вышеуказанных инструкций, пожалуйста, соберите следующую диагностическую информацию. Свяжитесь со службой поддержки Apigee Edge и предоставьте им собранную информацию.

  1. Вывод команды

    curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Журналы обработчика сообщений

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    
  3. Подробная информация о том, какие разделы этого руководства были опробованы, а также любые другие сведения, которые помогут нам ускорить решение этой проблемы.