키 값 맵 작업 런타임 오류 문제 해결

현재 Apigee Edge 문서를 보고 있습니다.
Apigee X 문서.
정보

UnsupportedOperationException

오류 코드

java.lang.UnsupportedOperationException

오류 응답 본문

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

원인

이 오류는 키 값 맵 작업 정책에서 mapIdentifier 속성이 빈 문자열로 설정된 경우에 발생합니다.

진단

  1. 오류가 발생한 특정 API 프록시의 모든 키 값 맵 작업 정책을 검토합니다. mapIdentifier 속성이 빈 문자열로 설정된 키 값 맵 작업 정책이 있는 경우 오류의 원인이 됩니다.

    예를 들어 다음 키 값 맵 작업 정책에는 빈 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>
    

해결 방법

mapIdentifier 속성이 키 값 맵 작업 정책의 유효한 키 값 맵으로 설정되었는지 확인합니다.

위에 나온 예시 정책을 수정하려면 mapIdentifier를 기존 키 값 맵 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"
      }
   }
}

원인

이 오류는 암호화된 키 값 맵에서 값을 검색하려 하고 이름에 private. 프리픽스가 없는 변수로 설정하려고 할 때 발생합니다. 디버깅 중 기본 보안 목적으로 필요한 프리픽스는 API 프록시 Trace 및 디버그 세션에서의 암호화된 값을 숨깁니다.

진단

1. 오류가 발생한 키 값 맵 작업 정책과 값을 설정할 수 없는 변수의 이름을 식별합니다. 두 항목 모두 오류 응답의 faultstring 요소에서 찾을 수 있습니다. 예를 들어 다음 faultstring에서 정책 이름은 EncryptedKVM이고 변수는 myvar입니다.

  "faultstring":"Failed to set variable myvar in KeyValueMapStepDefinition EncryptedKVM"

1. 해당 키 값 매핑 작업 정책 XML에서 <Get> 키 요소의 assignTo 속성에 지정된 변수의 이름이 위 1단계의 오류 문자열에 식별된 변수 이름과 일치하는지 확인합니다. 예를 들어, 다음 키 값 맵 작업 정책은 faultstring의 내용과 일치하는 <Get> 요소에서 myvar라는 변수를 지정합니다.

  <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>
  1. mapIdentifier 속성에 지정된 키 값 맵이 암호화된 KVM인지 확인합니다. KVM이 환경 범위에서 암호화된 경우 Edge UI에서 암호화되었는지 확인할 수 있습니다. 그렇지 않고 조직 또는 apiproxy 범위에서 생성된 경우에는 Management API를 사용하여 암호화 여부를 확인합니다. KVM 관리 및 사용도 참고하세요.

    환경 범위 KVM이 Edge UI에서 암호화되었는지 확인하려면 다음 안내를 따르세요.

    1. Edge UI의 왼쪽 탐색 메뉴에서 Admin(관리자)을 클릭합니다.
    2. 환경을 클릭합니다.
    3. 키 값 맵을 클릭합니다.
    4. 사용할 키 값 맵을 찾습니다.
    5. 이름 왼쪽에 있는 화살표를 클릭하여 값 목록을 펼칩니다.
    6. 암호화된 KVM 정보에 표시된 것처럼 암호화된 키 값 맵은 UI 내의 별표(*****)로 마스킹된 값을 표시합니다.

    조직, 환경 또는 apiproxy 수준에서 범위가 지정된 KVM이 암호화되었는지 확인하려면 다음을 사용합니다. Management API API를 사용하는 경우, 값에 대해 암호화된 설정과 별표를 모두 표시하는 샘플 응답은 다음과 같습니다.

    {
      "encrypted": true,
      "entry": [
        {
          "name": "foo",
          "value": "*****"
        }
      ],
      "name": "encrypted"
    }
    
  2. 키 값 맵이 암호화된 KVM이고 <Get> 요소의 assignTo 속성에 사용되는 변수 이름에 프리픽스 private이 없는 경우 이는 오류의 원인이 됩니다.

    위의 키 값 맵 작업 정책 예시에서는 키 값 맵 testEncrypted가 암호화되고 변수 이름 myvar에 프리픽스 private이 없습니다. 따라서 다음과 같은 오류 코드가 수신됩니다.

    steps.keyvaluemapoperations.SetVariableFailed
    

해결 방법

사용된 키 값 맵이 암호화된 경우 키 값 맵 작업 정책에 있는 <Get> 요소의 assignTo 속성에 있는 변수 이름에 프리픽스 private.가 있는지 확인합니다.

위의 키 값 맵 작업 정책 예시를 수정하려면 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>