PythonScript 정책

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

내용

Python 스크립트 정책을 사용하면 특히 필요한 기능이 Edge에서 즉시 사용 가능한 정책에서 제공하는 것 이상으로 지원되는 경우 맞춤설정된 Python 기능을 API 프록시 흐름에 추가할 수 있습니다.

Python 언어 지원은 Jython 버전 2.5.2를 통해 제공됩니다. 추가하는 타사 라이브러리는 '순수 Python'(Python에만 구현)이어야 합니다. 라이브러리 추가에 대한 자세한 내용은 리소스 파일을 참조하세요.

Python 정책에는 실제 코드가 없습니다. 대신 Python 정책은 Python 리소스를 참조하고 Python 스크립트가 실행되는 API 흐름의 단계를 정의합니다. 관리 UI 프록시 편집기를 통해 스크립트를 업로드하거나 로컬에서 개발한 API 프록시의 /resources/py 디렉터리에 포함할 수 있습니다.

샘플

Python 정책 및 스크립트

Python 스크립트 정책

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Script name="Python-1">
        <DisplayName>Python-1</DisplayName>
        <ResourceURL>py://myscript.py</ResourceURL>
</Script>

이 예시에서는 ResourceURL 요소가 관련 Python 스크립트 리소스를 지정합니다.

Python 스크립트

여기에는 Python 스크립트 자체에 포함할 수 있는 항목이 표시됩니다.

import base64

username = flow.getVariable("request.formparam.client_id")
password = flow.getVariable("request.formparam.client_secret")

base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
authorization = "Basic "+base64string

flow.setVariable("authorizationParam",authorization)

요소 참조

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Script name="Python-1">
    <DisplayName>Python-1</DisplayName>
    <ResourceURL>py://myscript.py</ResourceURL>
    <IncludeURL>py://myscript_dependency.py</IncludeURL>
</Script>

다음 표는 모든 정책 상위 요소의 공통 속성에 대해 설명합니다.

속성 설명 기본 계정 현재 상태
name

정책의 내부 이름입니다. name 속성의 값에는 문자, 숫자, 공백, 하이픈, 밑줄, 마침표가 포함될 수 있습니다. 이 값은 255자(영문 기준)를 초과할 수 없습니다.

원하는 경우 <DisplayName> 요소를 사용하여 관리 UI 프록시 편집기의 정책에 다른 자연어 이름을 사용하여 정책에 라벨을 지정합니다.

N/A 필수
continueOnError

정책이 실패할 경우 오류가 반환되도록 하려면 false로 설정합니다. 이는 대부분의 정책에서 예상되는 동작입니다.

정책이 실패해도 흐름 실행이 계속되도록 하려면 true로 설정합니다.

false 선택사항
enabled

정책을 시행하려면 true로 설정합니다.

정책을 중지하려면 false로 설정합니다. 정책이 흐름에 연결되어 있어도 정책이 시행되지 않습니다.

true 선택사항
async

이 속성은 지원이 중단되었습니다.

false 지원 중단됨

<DisplayName> 요소

name 속성 외에도 이 요소를 사용하여 관리 UI 프록시 편집기의 정책에 다른 자연어 이름으로 라벨을 지정합니다.

<DisplayName>Policy Display Name</DisplayName>
기본 계정

N/A

이 요소를 생략하면 정책 name 속성 값이 사용됩니다.

현재 상태 선택사항
유형 문자열

<ResourceURL> 요소

이 요소는 API 흐름에서 실행되는 기본 Python 파일을 지정합니다. 이 파일을 API 프록시 범위(API 프록시 번들의 /apiproxy/resources/py 아래 또는 API 프록시 편집기 탐색창의 스크립트 섹션) 또는 리소스 파일의 설명대로 여러 API 프록시에 다시 사용할 수 있도록 조직이나 환경 범위에 저장할 수 있습니다. 코드에서 자바스크립트 객체 모델의 객체, 메서드, 속성을 사용할 수 있습니다.

<ResourceURL>py://myscript.py</ResourceURL>
기본값: 없음
현재 상태: 필수
유형: 문자열

<IncludeURL> 요소

<ResourceURL> 요소를 사용하여 지정한 기본 Python 파일에 종속 항목으로 로드할 Python 파일을 지정합니다. 스크립트는 정책에 나열된 순서대로 평가됩니다.

추가 <IncludeURL> 요소를 사용하여 Python 종속 항목 리소스를 두 개 이상 포함합니다.

<IncludeURL>py://myscript_dependency.py</IncludeURL>
기본값: 없음
현재 상태: 선택사항
유형: 문자열

오류 코드

이 섹션에서는 반환되는 오류 코드, 오류 메시지, 정책이 오류를 트리거할 때 Edge에서 설정하는 오류 변수를 설명합니다. 오류를 처리하기 위해 오류 규칙을 개발 중인 경우, 이 정보는 중요합니다. 자세한 내용은 정책 오류에 대해 알아야 할 사항오류 처리를 참조하세요.

런타임 오류

이러한 오류는 정책이 실행될 때 발생할 수 있습니다.

오류 코드 HTTP 상태 원인 수정
steps.script.ScriptEvaluationFailed 500 PythonScript 정책은 여러 유형의 ScriptExecutionFailed 오류를 발생시킬 수 있습니다. 일반적으로 발생하는 오류 유형에는 NameErrorZeroDivisionError가 있습니다.

배포 오류

이 오류는 이 정책이 포함된 프록시를 배포할 때 발생할 수 있습니다.

오류 이름 원인 수정
InvalidResourceUrlFormat PythonScript 정책의 <ResourceURL> 또는 <IncludeURL> 요소 내에서 지정된 리소스 URL 형식이 잘못된 경우 API 프록시 배포가 실패합니다.
InvalidResourceUrlReference <ResourceURL> 또는 <IncludeURL> 요소가 존재하지 않는 PythonScript 파일을 참조하는 경우 API 프록시 배포가 실패합니다. 참조된 소스 파일은 API 프록시, 환경 또는 조직 수준에 있어야 합니다.

오류 변수

이러한 변수는 이 정책이 런타임 시 오류를 트리거할 때 설정됩니다. 자세한 내용은 정책 오류에 대해 알아야 할 사항을 참조하세요.

변수 각 항목의 의미는 다음과 같습니다.
fault.name="fault_name" fault_name은 위의 런타임 오류 표에 나열된 오류 이름입니다. 오류 이름은 오류 코드의 마지막 부분입니다. fault.name Matches "ScriptExecutionFailed"
pythonscript.policy_name.failed policy_name은 오류를 발생시킨 정책의 사용자 지정 이름입니다. pythonscript.PythonScript-1.failed = true

오류 응답 예시

{
  "fault": {
    "faultstring": "Execution of SetResponse failed with error: Pythonscript runtime error: "ReferenceError: "status" is not defined.\"",
    "detail": {
      "errorcode": "steps.script.ScriptExecutionFailed"
    }
  }
}

오류 규칙 예시

<FaultRule name="PythonScript Policy Faults">
    <Step>
        <Name>AM-CustomErrorResponse</Name>
        <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition>
    </Step>
    <Condition>(pythonscript.PythonScript-1.failed = true) </Condition>
</FaultRule>

관련 주제