部署错误配置失败

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

通过 Edge 界面或 Management API 部署 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 代理的部署可能会失败,并显示“配置失败”的错误消息导致出现此错误的情形。下表列出了导致此错误的一些常见原因:

原因 说明 适用的问题排查说明
JavaCallout 政策中缺少 Java 类 JavaCallout 政策引用的 JAR 文件中缺少 Java 类。 边缘私有云用户
条件流中的条件使用了错误的操作数 条件中运算符一侧或两侧使用的运算数/表达式无效。
消息日志记录政策中的主机名无效 MessageLogging 政策中使用的主机名无法解析,或者可能包含一些不需要的特殊字符。
KeyValueMap 名称无效 API 代理的 KeyValueMapOperations 政策中的 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. 以下部分介绍了一些导致部署错误“配置失败”的最常见的异常,并提供了问题排查和解决步骤。

原因:JavaCallout 政策中缺少 Java 类

诊断

  1. 在消息处理器日志中,如果您在部署 API 代理 (DeployEvent) 期间看到任何异常(如下所示)消息 "Failed to Instant the JavaCallout Class",请继续执行第 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。当 JavaCallout 政策中指定的 JAR 文件或其任何依赖的 JAR 文件中没有特定类时,通常会发生此错误。

  4. 检查包含与软件包 com.something.apigee.callout.crypto.main 相关的所有类的 JAR 文件,并确认缺少特定类 com.something.apigee.callout.crypto.main.SecretCallout

分辨率

  1. 将缺少的类添加到特定的 JAR 文件,然后上传该 JAR 文件。
  2. 重新部署 API 代理。
  3. 在上面的示例中,我们通过以下方式解决了这个问题: <ph type="x-smartling-placeholder">
      </ph>
    1. 将缺失的类 com.something.apigee.callout.crypto.main.SecretCallout 添加到 JAR 文件中。
    2. 上传更新后的 JAR 文件并重新部署 API 代理。

原因:条件流中的运算符使用了错误的操作数

诊断

  1. 在消息处理器日志中,如果您在部署 API 代理或共享流期间看到 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. 在此示例中,您可以发现“或”之间没有空格运算符和下一个条件。因此,在解析第二个条件时,将第一个表达式视为 EQUALS 运算符的 "or(fault.name")。这不是有效的变量名称,因此不会将其视为有效的数据表达式。因此,您就会遇到以下异常:

    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. 在消息处理器日志中,如果在部署 API 代理或共享流(如下所示)期间看到消息“无效主机名”存在任何异常,请继续执行第 2 步。如果不是,则查看下一个原因:KeyValueMap Name 无效

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. 下面我们来看两个示例,了解如何排查和解决此问题。

示例 1:HostName 包含多余的特殊字符

  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. 上面的异常显示部署由于"Invalid HostName '<主机名>'Syslog 处理程序”。这表示 MessageLogging 政策中使用的主机名是无效的主机名。

  3. 通过仔细查看消息处理器日志中的异常,您会发现有一个不需要的特殊字符“/”主机名 'splunkprod.myorg.com/'. 的末尾

  4. 这个不需要的特殊字符是导致部署错误的原因。

分辨率

  1. 请修改 MessageLogging 政策,移除所有不需要的特殊字符,以解决此问题。
  2. 在上述示例中,特殊字符“/”已从 MessageLogging 政策中移除。这解决了问题。

示例 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. 上面的异常显示部署由于"Invalid HostName '<主机名>'Syslog 处理程序”

  3. 如果您仔细阅读上述异常行,会发现消息处理器无法解析 MessageLogging 政策中提供的主机名 'input-prd.cloud.splunk.com'

  4. 要确认这一点,您可以尝试 telnet 到消息日志记录政策中使用的主机名和端口 #。

    1. 请检查 API 代理的特定修订版本中的 MessageLogging 政策,并验证所使用的主机名和端口 #。在上面的示例中,API 代理名称为 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 政策,以使用有效的主机名。

如果问题仍然存在,请参阅必须收集诊断信息

原因:KeyValueMap 名称无效

诊断

  1. 在消息处理器日志中,如果在部署 API 代理或共享流期间看到消息 "KeyValueMap name is invalid" 的异常(如下所示),请继续执行第 2 步。如果不是,请参阅必须收集诊断信息

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. 我们来看一个示例,了解如何排查和解决此问题。

  3. 消息处理器日志示例显示异常以及消息“KeyValueMap name is invalid”导致 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. 如上所示,表示 KeyValueMap 名称的 mapIdentifier 具有空字符串。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. 详细说明本手册中的哪些内容已被尝试过,以及可帮助我们快速解决此问题的任何其他分析洞见。