無法設定部署錯誤

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

問題

透過 Edge UI 或 Management API 部署 API Proxy 或共用流程修訂版本會失敗,並顯示「Configuration failed」錯誤。

錯誤訊息

您會在 Edge UI 中收到錯誤訊息,如下所示:

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

以下是在 Edge UI 中觀察到的範例錯誤訊息的螢幕截圖:

可能原因

API Proxy 部署作業可能會失敗,並顯示「設定失敗」造成錯誤的原因很多下表列出一些經常觀察到的原因,例如造成此錯誤:

原因 說明 疑難排解操作說明
Java 摘要政策中缺少 Java 類別 JavaCALL 政策所參照的 JAR 檔案中缺少 Java 類別。 邊緣私有雲使用者
條件流程中條件使用的運算元不正確 在條件中,運算子一或兩側使用的運算元/運算式無效。
訊息記錄政策中的主機名稱無效 無法解析 MessageLogging 政策中使用的主機名稱,或是含有一些不需要的特殊字元。
KeyValueMap 名稱無效 API Proxy 的 KeyValueMapOperations 政策中的 KeyValueMap 無效或空白。

常見診斷步驟

  1. 使用下列 API,針對觀察到部署錯誤的 API Proxy 特定修訂版本取得部署作業狀態:

    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. 部署狀態輸出內容中的各個訊息處理器會顯示「Configuration failed」錯誤訊息。

  4. 登入其中一個訊息處理器,然後查看 /opt/apigee/var/log/edge-message-processor/logs/system.log 記錄。確認部署 API Proxy 期間是否有任何錯誤。

  5. 根據訊息處理者記錄中觀察到的錯誤/例外狀況,您需採取適當的疑難排解步驟和解決問題。

  6. 以下各節將說明一些最常見的例外狀況,這些例外狀況會導致部署項目「設定失敗」,並提供疑難排解步驟並解決這些問題。

,瞭解如何調查及移除這項存取權。

原因:Java 摘要政策中缺少 Java 類別

診斷

  1. 在訊息處理器記錄中,如果在部署 API Proxy (DeployEvent) 期間,您看到任何例外狀況並顯示「Failed to Instantiate the Java callout Class」訊息,如下所示,然後繼續執行步驟 2。如果不是,請參閱「條件流程中條件使用的運算元不正確」。
  2. 「訊息處理器」在部署 API Proxy 期間會顯示以下例外狀況:

    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. 上述例外狀況中的錯誤訊息表示 JavaCALL 類別 com.something.apigee.callout.crypto.main.SecretCallout 無法例項化。發生這個錯誤,通常是因為 Java 呼叫政策或其任何相依 JAR 檔案中指定的 JAR 檔案沒有特定類別可用。

  4. 檢查 JAR 檔案,其中含有與 com.something.apigee.callout.crypto.main 套件相關的所有類別,並確認缺少特定類別 com.something.apigee.callout.crypto.main.SecretCallout

解析度

  1. 將缺少的類別新增至特定 JAR 檔案,並上傳該 JAR 檔案。
  2. 重新部署 API Proxy。
  3. 在上述範例中,我們已透過以下方式解決問題:
    1. 將缺少的類別 com.something.apigee.callout.crypto.main.SecretCallout 新增至 JAR 檔案。
    2. 上傳更新後的 JAR 檔案並重新部署 API Proxy。

原因:在條件流程中搭配運算子使用的運算元不正確

診斷

  1. 在「訊息處理器」記錄中,如果您在部署 API Proxy 或「共用流程」期間看到 com.apigee.expressions.parser.ParseException (如下方範例訊息所示),請繼續執行步驟 2。如果無效,請參閱「訊息記錄政策中的無效主機名稱」原因。

    錯誤訊息範例

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    
  2. 請查看範例,瞭解如何診斷這個問題。

    範例:<Operator> 的運算元運算式應該是資料運算式

  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」之間沒有空格和下一個條件因此,系統剖析第二個條件時,第一個運算式會做為 EQUALS 運算子的 "or(fault.name"。這不是有效的變數名稱,因此系統不會將其視為有效的資料運算式。因此出現以下例外狀況:

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

解析度

  1. 確認運算子兩側皆使用適當的資料運算式。
  2. 在上述範例中,解析度是確保「or」之後還有空格,如程式碼片段所述:

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

MessageLogging 政策中的主機名稱無效

診斷

  1. 如果您在部署 API Proxy 或共用流程期間 (如下所示),在訊息處理器記錄中發現「Invalid HostName」訊息出現任何例外狀況,請按照下方說明繼續執行步驟 2。如果不是,請移至下一個原因「Invalid KeyValueMap Name」。

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. 我們來看看以下兩個示例,瞭解如何排解及解決這個問題。

示例 1:HostName 含有不必要的特殊字元

  1. 「訊息處理器」在部署 API Proxy 期間會顯示以下例外狀況:

      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. 以上例外狀況顯示部署作業因 「Invalid HostName '<hostname>」而失敗for Syslog 處理常式」。這表示 MessageLogging 政策中的 HostName 是無效的主機名稱。

  3. 仔細查看郵件處理器記錄中的例外狀況,發現有不想要的特殊字元「/」主機名稱 'splunkprod.myorg.com/'. 結尾

  4. 這個不需要的特殊字元導致部署錯誤。

解析度

  1. 修改 MessageLogging 政策,移除任何不需要的特殊字元以解決問題。
  2. 在上述範例中,特殊字元「/」已從 MessageLogging 政策中移除。這解決了問題。

示例 2:無法解析的主機名稱

  1. 訊息處理器記錄中有幾行顯示已觸發 API Proxy 的部署事件,後面接著 API Proxy 部署期間發生的例外狀況:

    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. 以上例外狀況顯示部署作業因 「Invalid HostName '<hostname>」而失敗for Syslog 處理常式」。

  3. 如果您已詳閱例外狀況上方的行,即可發現訊息處理器無法解析 MessageLogging 政策中提供的主機名稱 'input-prd.cloud.splunk.com'

  4. 如要確認這一點,您可以嘗試透過 telnet 連線至訊息記錄政策中使用的主機名稱和通訊埠 #。

    1. 查看 API Proxy 特定修訂版本中的 MessageLogging 政策,驗證使用的主機名稱和通訊埠 #。在上述範例中,API Proxy 名稱:myapi,修訂版本:42。

      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。在此範例中,我們嘗試使用 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 政策,以使用有效的主機名稱。

如果問題仍未解決,請參閱「Must Gather 診斷資訊」。

原因:KeyValueMap 名稱無效

診斷

  1. 在「訊息處理器」記錄中,如果您在部署 API Proxy 或共用流程期間看到「KeyValueMap name is invalid」訊息例外狀況,如下所示,然後繼續執行步驟 2。如果沒有,請參閱「Must Gather Diagnostic Information」。

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. 請參考以下範例,瞭解如何排解及解決這個問題。

  3. 訊息處理器記錄範例:顯示「KeyValueMap name is invalid」訊息的例外狀況導致 API Proxy 部署期間發生錯誤

    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 Proxy: 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 名稱不得為空字串。這就是 Deployment 錯誤的原因。

解析度

  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. 詳細說明已嘗試在本教戰手冊中的哪些部分,以及任何有助於我們快速解決問題的深入分析。