Ошибка развертывания: не удалось настроить

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

Symptom

Развертывание прокси-сервера API или версий общего потока через интерфейс Edge или API управления завершается неудачно с ошибкой Не удалось выполнить конфигурацию.

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

В интерфейсе 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 может завершиться неудачно с ошибкой "Не удалось выполнить конфигурацию" по разным причинам. В таблице ниже перечислены некоторые распространенные причины этой ошибки.

Cause Описание Инструкции по устранению неполадок, применимые к
Отсутствует класс Java в правиле JavaCallout В JAR-файле, на который ссылается правило JavaCallout, отсутствует класс Java. Пользователи Edge Private Cloud
Неправильные операнды, используемые в условиях в потоке условий Операнды или выражения, используемые с одной или обеих сторон операторов в условиях, недопустимы.
Недействительное имя хоста в правилах ведения журналов сообщений Имя хоста, используемое в правиле 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. Войдите в один из Message Processor(s) и проверьте журнал /opt/apigee/var/log/edge-message-processor/logs/system.log. Проверьте, не возникают ли ошибки при развертывании прокси API.

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

  6. В разделах ниже приведены наиболее распространенные исключения, которые приводят к ошибке развертывания Не удалось выполнить конфигурацию, а также инструкции по устранению неполадок.

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

диагностика;

  1. Если в журналах Message Processor во время развертывания прокси API (DeployEvent) вы видите исключение с сообщением "Failed to instantiate the JavaCallout Class", как показано ниже, перейдите к шагу 2. Если нет, перейдите к разделу Некорректные операнды, используемые в условиях в потоке условий.
  2. При развертывании прокси API Message Processor выдает следующее исключение:

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

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

диагностика;

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

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

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

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

  3. При развертывании общего потока Message Processor показывает следующее исключение:

    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>
    
    

Недействительное имя хоста в правилах MessageLogging

диагностика;

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

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

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

  1. При развертывании прокси API Message Processor выдает следующее исключение:

      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. Исключение выше показывает, что развертывание не удалось из-за недействительного имени хоста "<hostname>" для обработчика Syslog. Это означает, что имя хоста, используемое в правиле MessageLogging, является недействительным.

  3. Изучив исключение в журнале Message Processor, можно заметить, что в конце HostName 'splunkprod.myorg.com/'. есть нежелательный специальный символ "/".

  4. Именно из-за этого нежелательного специального символа произошла ошибка развертывания.

Разрешение

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

Пример 2. Не удается проанализировать имя хоста

  1. В журнале Message Processor есть несколько строк, в которых показано, что было запущено событие развертывания для прокси 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 и получили ту же ошибку, что и в журнале Message Processor:

      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. Если в журналах Message Processor во время развертывания прокси API или общего потока вы видите исключение с сообщением "KeyValueMap name is invalid", как показано ниже, перейдите к шагу 2. Если нет, перейдите к разделу Как получить диагностическую информацию.

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

  3. Пример журнала Message Processor, в котором показано исключение с сообщением "Недопустимое название 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, вы обнаружите, что в нем есть правило 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. Подробности о том, какие разделы этого руководства вы уже попробовали и какие выводы сделали. Это поможет нам быстрее решить проблему.