Configurazione dell'errore di deployment non riuscita

Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione Documentazione di Apigee X.
Informazioni

Sintomo

Il deployment del proxy API o delle revisioni del flusso condiviso tramite l'interfaccia utente di Edge o l'API di gestione non va a buon fine e restituisce un errore Configurazione non riuscita.

Messaggio di errore

Riceverai un messaggio di errore nella UI di Edge, 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 nella UI Edge:

Possibili cause

Il deployment di un proxy API può non riuscire con lo stato "Configurazione non riuscita" dovuto a diversi motivi. Nella tabella seguente sono elencate alcune cause frequenti che portano a questo errore :

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili per
Classe Java mancante nelle norme relative ai callout Java Nel file JAR a cui fa riferimento il criterio JavaCallout manca una classe Java. Utenti Edge Private Cloud
Utilizzando operandi non corretti in condizioni nel flusso di condizioni Gli operandi/espressioni utilizzati su uno o entrambi i lati degli operatori nelle condizioni non sono validi.
Nome host non valido nel criterio di logging dei messaggi Il nome host utilizzato nel criterio MessageLogging non può essere risolto o potrebbe contenere caratteri speciali indesiderati.
Nome KeyValueMap non valido Il valore KeyValueMap non è valido o è vuoto nel criterio KeyValueMapOperations nel proxy API.

Passaggi diagnostici comuni

  1. Utilizza l'API seguente per verificare lo stato dei deployment per la revisione specifica del proxy API per cui stai visualizzando l'errore di deployment:

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

    "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. Nell'output dello stato del deployment viene visualizzato il messaggio di errore "Configurazione non riuscita" in ognuno dei processori di messaggi.

  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 verificano errori durante il deployment del proxy API.

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

  6. Le sezioni seguenti forniscono alcune delle eccezioni osservate più di frequente che portano all'errore di deployment "Configurazione non riuscita" e forniscono i passaggi per la risoluzione dei problemi.

di Gemini Advanced.

Causa: classe Java mancante nelle norme relative ai callout Java

Diagnosi

  1. Nei log del processore di messaggi, se vedi un'eccezione con il messaggio "Impossibile creare un'istanza della classe JavaCallout Class" durante il deployment di un proxy API (DeployEvent) come mostrato di seguito, vai al passaggio 2. In caso contrario, vai a Operandi non corretti utilizzati in 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 precedente 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 nel criterio JavaCallout o in uno dei suoi 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 mancasse la classe specifica com.something.apigee.callout.crypto.main.SecretCallout.

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 precedente, il problema è stato risolto:
    1. Aggiunta della classe mancante com.something.apigee.callout.crypto.main.SecretCallout al file JAR.
    2. Caricare il file JAR aggiornato ed eseguire nuovamente il deployment del proxy API.

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

Diagnosi

  1. Nei log del processore di messaggi, se vedi un messaggio 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, vai al passaggio 2. In caso contrario, vai alla causa successiva del criterio Nome host non valido nel criterio di Logging dei messaggi.

    Esempio di messaggio di errore

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

    Esempio : operandi per <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 nella ParseException: "Both the operands for EQUALS expression should be data expressions" indica che una condizione che utilizza l'operatore uguale a (=), diverso da (!=) o Statistiche con (=|) ha un problema.

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

    1. Le espressioni ai 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 espressione.

  6. Se uno o più dei criteri sopra menzionati non è soddisfatto, ricevi l'eccezione ParseException - "Both the operands for EQUALS expression should be data expressions".

  7. Esaminiamo un esempio per comprendere il problema. Ecco un esempio di condizione di errore che

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

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

Risoluzione

  1. Assicurati di disporre sempre di espressioni di dati corrette ai lati degli operatori.
  2. Nell'esempio discusso sopra, la risoluzione prevedeva che ci fosse spazio dopo "or" come descritto nello snippet di codice:

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

Nome host non valido nel criterio MessageLogging

Diagnosi

  1. Nei log del processore di messaggi, se noti un'eccezione con il messaggio "Nome host non valido" durante il deployment del proxy API o del flusso condiviso come mostrato di seguito, vai 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. Diamo un'occhiata ai due esempi di seguito per capire come risolvere questo problema.

Esempio 1: HostName contenente un carattere speciale indesiderato

  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 è riuscito a causa di "Nome Host non valido '<nome host>' non valido. per il gestore Syslog". Questo indica che il valore HostName utilizzato nel criterio MessageLogging è un nome host non valido.

  3. L'esame dell'eccezione nel log del processore di messaggi mostra attentamente la presenza di un carattere speciale indesiderato "/" alla fine di HostName 'splunkprod.myorg.com/'.

  4. Questo carattere speciale indesiderato ha causato l'errore di deployment.

Risoluzione

  1. Modifica il criterio MessageLogging per rimuovere i caratteri speciali indesiderati e risolvere il problema.
  2. Nell'esempio precedente, il carattere speciale "/" è stato rimosso dal criterio MessageLogging. Il problema è stato risolto.

Esempio 2: nome host irrisolvibile

  1. Il log del processore di messaggi conteneva alcune righe che mostra l'evento di deployment per l'attivazione di 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 è riuscito a causa di "Nome Host non valido '<nome host>' non valido. per il gestore Syslog".

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

  4. Per conferma, puoi provare a usare il comando telnet al nome host e alla porta n. utilizzati nel criterio di logging dei messaggi.

    1. Controlla il criterio MessageLogging nella revisione specifica del proxy API e verifica il nome host e il numero di porta utilizzati. Nell'esempio precedente, il nome del proxy API: myapi, revisione: 42.

      Criterio 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. Telnet all'host con la 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 il criterio MessageLogging in modo da utilizzare un nome host valido.

Se il problema persiste, vai alla pagina Raccogliere dati diagnostici.

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, vai al passaggio 2. In caso contrario, vai a Raccogliere informazioni diagnostiche.

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

  3. Esempio di log del processore di messaggi che mostra l'eccezione con il messaggio "Il nome KeyValueMap non è valido" causando 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 indicata 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 del criterio KeyValuMapOperations.

  6. Esaminando il bundle del proxy API scopri che esiste un criterio 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 visto sopra, mapIdentifier, che indica il nome di KeyValueMap, ha una stringa vuota. Il nome KeyValueMap non può essere una stringa vuota. Questa è la causa dell'errore di deployment.

Risoluzione

  1. Modifica il criterio KeyValueMapOperations in modo che abbia un nome valido appropriato per KeyValueMap.
  2. Nell'esempio precedente, il problema è stato risolto modificando KeyValueMapOperations con il nome KeyValueMap "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 diagnostiche

Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni diagnostiche. 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 questo playbook che abbiamo provato e su eventuali altri approfondimenti che ci aiuteranno a risolvere rapidamente il problema.