Key-Value マップ オペレーションのランタイム エラーのトラブルシューティング

UnsupportedOperationException

エラーコード

java.lang.UnsupportedOperationException
    

エラー レスポンスの本文

{
       "fault":{
          "faultstring":"java.lang.UnsupportedOperationException",
          "detail":{
             "errorcode":"Internal Server Error"
          }
       }
    }
    

原因

このエラーは、Key-Value マップで mapIdentifier 属性に空の文字列が設定されている場合に発生します。

診断

  1. エラーが発生した API プロキシで、すべての Key Value Map Operations ポリシーを調べます。mapIdentifier 属性に空の文字列が設定されている Key Value Map Operations ポリシーがある場合、これがエラーの原因です。

    たとえば、次の Key Value Map Operations ポリシーには空の mapIdentifier が設定されています。

    <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="StoreKvm" mapIdentifier="">
            <DisplayName>StoreKvm</DisplayName>
            <Properties/>
            <ExclusiveCache>false</ExclusiveCache>
            <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
            <Put override="true">
                <Key>
                    <Parameter ref="request.queryparam.key"/>
                </Key>
                <Value ref="request.queryparam.value"/>
            </Put>
            <Scope>apiproxy</Scope>
        </KeyValueMapOperations>
        

解決策

Key Value Map Operations ポリシーの mapIdentifier 属性に有効な Key-Value マップを設定します。

上記のポリシーの例を修正するには、mapIdentifier に既存の Key-Value マップ UserLocationMap を指定します。

<KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="StoreKvm" mapIdentifier="UserLocationMap">
        <DisplayName>StoreKvm</DisplayName>
        <Properties/>
        <ExclusiveCache>false</ExclusiveCache>
        <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
        <Put override="true">
            <Key>
                <Parameter ref="request.queryparam.key"/>
            </Key>
            <Value ref="request.queryparam.value"/>
        </Put>
        <Scope>apiproxy</Scope>
    </KeyValueMapOperations>
    

SetVariableFailed

エラーコード

steps.keyvaluemapoperations.SetVariableFailed
    

エラー レスポンスの本文

    {
       "fault":{
          "faultstring":"Failed to set variable variable_name in KeyValueMapStepDefinition policy_name",
          "detail":{
             "errorcode":"steps.keyvaluemapoperations.SetVariableFailed"
          }
       }
    }
    

エラー メッセージの例

{
       "fault":{
          "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM",
          "detail":{
             "errorcode":"steps.keyvaluemapoperations.SetVariableFailed"
          }
       }
    }
    

原因

暗号化された Key-Value マップから値を取得するときに、名前に private. というプレフィックスがない変数に値を設定すると、このエラーが発生します。このプレフィックスは、API プロキシのトレース セッションとデバッグ セッションから暗号化された値を隠します。これは、デバッグ時の基本的なセキュリティとして必要です。

診断

  1. エラーが発生した Key Value Map Operations ポリシーと、値を設定できない変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素で確認できます。たとえば、次の faultstring では、EncryptedKVM がポリシー名、myvar が変数です。

    "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM"
        
  2. エラーが発生した Key Value Map Operations ポリシーの XML で、<Get> 要素の assignTo 属性に指定された変数の名前が手順 1 で特定した変数名と一致しているかどうか確認します。たとえば、次の Key Value Map Operations ポリシーでは、<Get> 要素に myvar という名前の変数が指定されていますが、これは faultstring に一致します。

    <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Key-Value-Map-Operations-1" mapIdentifier="testEncrypted">
            <DisplayName>KeyValueMapOperations-1</DisplayName>
            <Properties/>
            <ExclusiveCache>false</ExclusiveCache>
            <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
            <Get assignTo="myvar" index="1">
                <Key>
                    <Parameter>foo</Parameter>
                </Key>
            </Get>
            <Scope>environment</Scope>
        </KeyValueMapOperations>
        
  3. mapIdentifier 属性の Key-Value マップが暗号化された KVM かどうか確認します。KVM が環境スコープで暗号化されている場合は Edge UI で暗号化を確認できます。組織または apiproxy のスコープで作成されている場合は、管理 API で暗号化を確認する必要があります。KVM の管理と使用もご覧ください。

    Edge UI で環境スコープの KVM の暗号化を確認するには:

    1. Edge UI で、左側のナビゲーション メニューの [Admin] をクリックします。
    2. [Environments] をクリックします。
    3. [Key Value Maps] をクリックします。
    4. 必要な Key-Value マップを探します。
    5. 名前の左側にある矢印をクリックして、値のリストを展開します。
    6. 暗号化された KVM についての説明のように、暗号化された Key-Value マップの値はアスタリスクでマスキングされて UI に表示されます(***** のように表示されます)。

    暗号化された KVM のスコープ(組織、環境または apiproxy)を確認するには、管理 API を使用します。API を使用した場合のレスポンスでは、暗号化の設定と値のアスタリスクが次のように表示されます。

    {
          "encrypted": true,
          "entry": [
            {
              "name": "foo",
              "value": "*****"
            }
          ],
          "name": "encrypted"
        }
        
  4. Key-Value マップが暗号化された KVM で、<Get> 要素の assignTo 属性に private というプレフィックスが付いていない場合、これがエラーの原因です。

    上記の Key Value Map Operations ポリシーでは、Key-Value マップ testEncrypted が暗号化され、変数名 myvar にプレフィックス private がありません。このため、次のようなエラーコードが返されます。

    steps.keyvaluemapoperations.SetVariableFailed
        

解決策

使用する Key-Value マップが暗号化されている場合、Key Value Map Operations ポリシーで <Get> 要素の assignTo 属性に、プレフィックス private. 付きの変数名を設定します。

上記の Key Value Map Operations ポリシーの例を修正するには、属性の値を assignTo から private.myvar に変更します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Key-Value-Map-Operations-1" mapIdentifier="testEncrypted">
        <DisplayName>KeyValueMapOperations-1</DisplayName>
        <Properties/>
        <ExclusiveCache>false</ExclusiveCache>
        <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
        <Get assignTo="private.myvar" index="1">
            <Key>
                <Parameter>foo</Parameter>
            </Key>
        </Get>
        <Scope>environment</Scope>
    </KeyValueMapOperations>