Configurazione dell'errore di deployment non riuscita

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

Sintomo

Il deployment delle revisioni del proxy API o del flusso condiviso tramite l'interfaccia utente Edge o l'API di gestione non riesce e viene visualizzato l'errore Configuration failed.

Messaggio di errore

Nell'interfaccia utente Edge viene visualizzato un messaggio di errore come mostrato di seguito:

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

Ecco lo screenshot di un messaggio di errore di esempio osservato nell'interfaccia utente Edge:

Possibili cause

Il deployment di un proxy API può non riuscire e viene visualizzato l'errore "Configuration failed" per diversi motivi. La tabella seguente elenca alcune cause osservate di frequente che generano questo errore :

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
Classe Java mancante nella policy JavaCallout Manca una classe Java nel file JAR a cui fa riferimento la policy JavaCallout. Utenti di Edge Private Cloud
Operandi errati utilizzati nelle condizioni nel flusso di condizioni Gli operandi/le espressioni utilizzati su uno o entrambi i lati degli operatori nelle condizioni non sono validi.
Nome host non valido nella policy Message Logging Il nome host utilizzato nella policy MessageLogging non può essere risolto o potrebbe contenere alcuni caratteri speciali indesiderati.
Nome KeyValueMap non valido KeyValueMap non è valido o è vuoto nella policy KeyValueMapOperations nel proxy API.

Passaggi di diagnostica comuni

  1. Recupera lo stato dei deployment per la revisione specifica del proxy API per cui stai osservando l'errore di deployment utilizzando l'API riportata di seguito:

    curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Ecco un output di esempio dell'API riportata sopra:

    "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. Viene visualizzato il messaggio di errore "Configuration failed" in ognuno dei processori di messaggi nell'output dello stato del deployment.

  4. Accedi a uno dei processori di messaggi e controlla il log /opt/apigee/var/log/edge-message-processor/logs/system.log. Verifica se si sono verificati errori durante il deployment del proxy API.

  5. A seconda dell'errore/dell'eccezione osservata nel log del processore di messaggi, devi seguire i passaggi di risoluzione dei problemi e la risoluzione appropriati per il problema.

  6. Le sezioni seguenti forniscono alcune delle eccezioni osservate più di frequente che generano l'errore di deployment "Configuration failed" e forniscono i passaggi per risolvere i problemi e risolverli.

Causa: classe Java mancante nella policy JavaCallout

Diagnosi

  1. Nei log del processore di messaggi, se vedi un'eccezione con il messaggio "Failed to instantiate the JavaCallout Class" durante il deployment di un proxy API (DeployEvent) come mostrato di seguito, procedi al passaggio 2. In caso contrario, vai a Operandi errati utilizzati nelle condizioni nel flusso di condizioni.
  2. Il processore di messaggi mostra la seguente eccezione durante il deployment del proxy 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. Il messaggio di errore nell'eccezione riportata sopra indica che non è stato possibile creare un'istanza della classe JavaCallout com.something.apigee.callout.crypto.main.SecretCallout. Questo errore si verifica in genere quando la classe specifica non è disponibile nel file JAR specificato nella policy JavaCallout o in uno dei relativi file JAR dipendenti.

  4. Controlla il file JAR che conteneva tutte le classi relative al pacchetto com.something.apigee.callout.crypto.main e verifica che la classe specifica com.something.apigee.callout.crypto.main.SecretCallout non sia presente.

Risoluzione

  1. Aggiungi la classe mancante al file JAR specifico e carica il file JAR.
  2. Esegui di nuovo il deployment del proxy API.
  3. Nell'esempio riportato sopra, abbiamo risolto il problema:
    1. Aggiungendo la classe mancante com.something.apigee.callout.crypto.main.SecretCallout al file JAR.
    2. Caricando il file JAR aggiornato ed eseguendo di nuovo il deployment del proxy API.

Causa: operandi errati utilizzati con gli operatori nel flusso di condizioni

Diagnosi

  1. Nei log del processore di messaggi, se vedi un com.apigee.expressions.parser.ParseException durante il deployment di un proxy API o di un flusso condiviso come mostrato nei messaggi di esempio riportati di seguito, procedi al passaggio 2. In caso contrario, vai alla causa successiva Nome host non valido nella policy Message Logging.

    Messaggio di errore di esempio

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    
  2. Vediamo un esempio per capire come diagnosticare questo problema.

    Esempio : gli operandi per l'espressione <Operator> devono essere espressioni di dati

  3. Il processore di messaggi mostra la seguente eccezione durante il deployment di un flusso condiviso:

    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. Il messaggio di errore in ParseException - "Both the operands for EQUALS expression should be data expressions" indica che si è verificato un problema con una condizione che coinvolge l'operatore uguale a (=), diverso da (!=) o Stats with (=|).

  5. Esamina le condizioni in tutti i flussi di condizioni che coinvolgono l'operatore specifico menzionato nel messaggio di errore e verifica se si sono verificati i seguenti problemi:

    1. Le espressioni su entrambi i lati dell'operatore sono dello stesso tipo. Ad esempio, se hai una variabile stringa sul lato sinistro dell'operatore, devi avere un'altra variabile stringa o un valore stringa sul lato destro.
    2. Tra gli operatori vengono utilizzate variabili valide.
    3. È presente uno spazio tra l'operatore e ciascuna delle espressioni.

  6. Se uno dei criteri sopra menzionati non viene soddisfatto, viene visualizzato ParseException - "Both the operands for EQUALS expression should be data expressions".

  7. Vediamo un esempio per capire questo problema. Ecco una condizione di errore di esempio

    <Condition>
               (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved")
    </Condition>
    
  8. In questo esempio, puoi notare che non c'è spazio tra l'operatore "or" e la condizione successiva. Pertanto, quando viene analizzata la seconda condizione, la prima espressione viene considerata "or(fault.name" per l'operatore EQUALS. Questo non è un nome di variabile valido, quindi non viene trattato come un'espressione di dati valida. Di conseguenza, viene visualizzata questa eccezione:

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

Risoluzione

  1. Assicurati di avere sempre espressioni di dati corrette su entrambi i lati degli operatori.
  2. Nell'esempio discusso sopra, la risoluzione consisteva nell'assicurarsi che ci fosse uno spazio dopo l'operatore "or", come descritto nello snippet di codice:

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

Nome host non valido nella policy MessageLogging

Diagnosi

  1. Nei log del processore di messaggi, se vedi un'eccezione con il messaggio "Invalid HostName" durante il deployment del proxy API o del flusso condiviso come mostrato di seguito, procedi al passaggio 2. In caso contrario, vai alla causa successiva Nome KeyValueMap non valido.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Esaminiamo i due esempi riportati di seguito per capire come risolvere questo problema.

Esempio 1: nome host con caratteri speciali indesiderati

  1. Il processore di messaggi mostra la seguente eccezione durante il deployment del proxy 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. L'eccezione riportata sopra mostra che il deployment non riesce a causa di "Invalid HostName '<hostname>' for Syslog handler". Ciò indica che il nome host utilizzato nella policy MessageLogging non è valido.

  3. L'esame attento dell'eccezione nel log del processore di messaggi mostra che alla fine del nome host 'splunkprod.myorg.com/'. è presente un carattere speciale indesiderato "/".

  4. Questo carattere speciale indesiderato è stato la causa dell'errore di deployment.

Risoluzione

  1. Modifica la policy MessageLogging per rimuovere eventuali caratteri speciali indesiderati per risolvere il problema.
  2. Nell'esempio riportato sopra, il carattere speciale "/" è stato rimosso dalla policy MessageLogging. Il problema è stato risolto.

Esempio 2: nome host non risolvibile

  1. Il log del processore di messaggi conteneva alcune righe che mostrano che viene attivato l'evento di deployment per un proxy API, seguito da un'eccezione che si verifica durante il deployment del proxy 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. L'eccezione riportata sopra mostra che il deployment non riesce a causa di "Invalid HostName '<hostname>' for Syslog handler".

  3. Se leggi la riga sopra l'eccezione, puoi notare che il processore di messaggi non è in grado di risolvere il nome host 'input-prd.cloud.splunk.com' fornito nella policy MessageLogging.

  4. Per confermare, puoi provare a eseguire telnet sul nome host e sul numero di porta utilizzati nella policy Message Logging.

    1. Controlla la policy MessageLogging nella revisione specifica del proxy API e verifica il nome host e il numero di porta utilizzati. Nell'esempio riportato sopra, il nome del proxy API è myapi e la revisione è 42.

      Policy MessageLogging

        <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. Esegui telnet sull'host con una porta specifica. Per questo esempio, abbiamo provato telnet e abbiamo ricevuto lo stesso errore visualizzato nel log del processore di messaggi:

      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. Questo ha dimostrato chiaramente che il nome host non può essere risolto.

Risoluzione

  1. Modifica la policy MessageLogging in modo da utilizzare il nome host valido.

Se il problema persiste, vai a Raccogliere informazioni di diagnostica.

Causa: nome KeyValueMap non valido

Diagnosi

  1. Nei log del processore di messaggi, se vedi un'eccezione con il messaggio "KeyValueMap name is invalid" durante il deployment di un proxy API o di un flusso condiviso come mostrato di seguito, procedi al passaggio 2. In caso contrario, vai a Raccogliere informazioni di diagnostica.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Vediamo un esempio per capire come risolvere questo problema.

  3. Log del processore di messaggi di esempio che mostra l'eccezione con il messaggio "KeyValueMap name is invalid" che genera un errore durante il deployment del proxy 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. La seconda eccezione riportata sopra indica che si è verificato un errore di deployment per proxy API: CustomerAPI, revisione: 1.

  5. Controllando lo stacktrace, puoi notare che viene generato un errore durante l'esecuzione della policy KeyValuMapOperations.

  6. Esaminando il bundle del proxy API, scopri che esiste una policy KeyValuMapOperations con il codice mostrato di seguito:

    <?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. Come mostrato sopra, mapIdentifier, che indica il nome di KeyValueMap, ha una stringa vuota. Il nome KeyValueMap non può essere una stringa vuota. Questa è stata la causa dell'errore di deployment.

Risoluzione

  1. Modifica la policy KeyValueMapOperations in modo che abbia un nome valido per KeyValueMap.
  2. Nell'esempio riportato sopra, abbiamo risolto il problema modificando KeyValueMapOperations in modo che il nome KeyValueMap sia "MyKeyValueMap", come mostrato di seguito:

      <?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>
    

Raccogliere informazioni di diagnostica

Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni di diagnostica. Contatta l'assistenza Apigee Edge e fornisci le informazioni raccolte.

  1. Output del comando

    curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Log del processore di messaggi

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    
  3. Dettagli sulle sezioni di questa guida che sono state provate e su eventuali altre informazioni che ci aiuteranno ad accelerare la risoluzione di questo problema.