デプロイ時のエラー: Configuration failed

症状

Edge UI または管理 API を使用した API プロキシまたは共有フローのリビジョンのデプロイが失敗し、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 プロキシのデプロイは、さまざまな理由により "Configuration failed" エラーで失敗することがあります。次の表は、このエラーにつながる原因のうち頻繁に見られるものをいくつか示しています。

原因 説明 トラブルシューティング手順の適用対象
JavaCallout ポリシーにおける Java クラスの欠落 JavaCallout ポリシーによって参照される JAR ファイルに Java クラスがない。 Edge Private Cloud ユーザー
条件フローの条件で使用されているオペランドが正しくない 条件内の演算子の片側または両側で使用されているオペランド / 式が無効である。
Message Logging ポリシーの無効なホスト名 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. デプロイ ステータス出力の各 Message Processor に "Configuration failed" というエラー メッセージが表示されます。

  4. いずれかの Message Processor にログインし、/opt/apigee/var/log/edge-message-processor/logs/system.log というログを確認します。API プロキシのデプロイ中にエラーが発生していないかどうかを確認します。

  5. Message Processor ログに見つかるエラー / 例外に応じて、適切なトラブルシューティングの手順と問題の解決方法に従う必要があります。

  6. 以下のセクションでは、デプロイ時のエラーである "Configuration failed" につながる最も頻繁に見られる例外をいくつか示し、それらのトラブルシューティングと解決手順を示します。

原因: 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 をインスタンス化できなかったことを示しています。このエラーは通常、JavaCallout ポリシーで指定された JAR ファイルまたはそのいずれかの従属 JAR ファイル内で、特定のクラスを利用できない場合に発生します。

  4. パッケージ com.something.apigee.callout.crypto.main に関連するすべてのクラスを含む JAR ファイルを確認し、特定のクラス com.something.apigee.callout.crypto.main.SecretCallout が欠落していることを確認します。

解決策

  1. 欠落しているクラスを特定の JAR ファイルに追加し、JAR ファイルをアップロードします。
  2. API プロキシを再デプロイします。
  3. 上記の例で、次の手順によって問題を解決しました。
    1. 欠落していたクラス com.something.apigee.callout.crypto.main.SecretCallout を JAR ファイルに追加します。
    2. 更新された JAR ファイルをアップロードし、API プロキシを再デプロイします。

原因: 条件フロー内の演算子で不正なオペランドが使用された

診断

  1. Message Processor ログで、com.apigee.expressions.parser.ParseException が、以下のサンプル メッセージに示すように API プロキシまたは共有フローのデプロイ中に出現する場合、ステップ 2 に進みます。そうでない場合、次の原因の Message Logging ポリシーの無効なホスト名に進みます。

    エラー メッセージの例

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
        
  2. この問題を診断する方法を理解するための例を見てみましょう。

    例: <Operator> 式のオペランドは、データ表現である必要があります

  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」演算子と次の条件の間にスペースがないことがわかります。したがって、2 番目の条件が解析されるとき、最初の式は 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. Message Processor のログで、以下に示すように API プロキシまたは共有フローのデプロイ中に "Invalid HostName" というメッセージを伴う例外が見つかる場合、ステップ 2 に進みます。そうでない場合は、次の原因の Invalid KeyValueMap Name(無効な KeyValueMap 名)に進みます。

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
        
  2. この問題をトラブルシューティングして解決する方法を理解するために、以下の 2 つの例を見てみましょう。

例 1: 不要な特殊文字を含む HostName

  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. 上記の例外は、"Invalid HostName '<hostname>' for Syslog handler" によってデプロイが失敗していることを示しています。これは、MessageLogging ポリシーで使用されている HostName が無効なホスト名であることを示しています。

  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. 上記の例外は、"Invalid HostName '<hostname>' for Syslog handler" によってデプロイが失敗していることを示しています。

  3. 例外の上の行を読んでいくと、Message Processor は MessageLogging ポリシーで提供されているホスト名 'input-prd.cloud.splunk.com' を解決できていないことがわかります。

  4. これを確認するために、Message Logging ポリシーで使用されているホスト名とポート番号に 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 接続を試して、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 ログの例: API プロキシのデプロイ中に "KeyValueMap name is invalid" メッセージを伴う例外が表示されてエラーが発生した例

    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. 上記の 2 番目の例外は、API プロキシ: CustomerAPI、リビジョン: 1 のデプロイ時のエラーが発生したことを示しています。

  5. スタックトレースを確認すると、KeyValuMapOperations ポリシーの実行中にエラーがスローされていることがわかります。

  6. API プロキシ バンドルを調べると、次に示すコードを含む KeyValuMapOperations ポリシーが 1 つあることがわかります。

    <?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 サポートに連絡して、収集した情報を提供してください。

  1. コマンドの出力

    curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
        
  2. Message Processor ログ

    /opt/apigee/var/log/edge-message-processor/logs/system.log
        
  3. このプレイブックで試したセクションと、その他すべての分析情報を詳しく説明していただけると、迅速な問題解決に役立ちます。