PythonScript ポリシー

このページは ApigeeApigee ハイブリッドに適用されます。

Apigee Edge のドキュメントを表示する。

概要

PythonScript ポリシーを使用すると、カスタマイズした Python 機能を API プロキシフローに追加できます。これは、Apigee の既定のポリシーでは必要な機能が実現できない場合に便利です。

このポリシーは拡張可能なポリシーです。Apigee ライセンスによっては、このポリシーの使用によって費用や使用量に影響する場合があります。ポリシータイプと使用量への影響については、ポリシータイプをご覧ください。

Python 言語のサポートは、Jython バージョン 2.5.2 で提供されます。サードパーティ ライブラリを追加する場合は、純粋な Python にする必要があります(Python でのみ実装される必要があります)。ライブラリの追加の詳細については、リソース ファイルをご覧ください。

Python ポリシーには実際のコードを記述しません。Python ポリシーでは Python リソースを参照し、Python スクリプトを実行する API フローにステップを定義します。スクリプトは、Apigee UI プロキシ エディタからアップロードすることも、ローカルで開発する API プロキシの /resources/py ディレクトリに追加することもできます。

サンプル

Python ポリシーとスクリプト

Python Script ポリシー

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

この例では、関連する Python スクリプト リソースを ResourceURL 要素に指定しています。

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>

The following table describes attributes that are common to all policy parent elements:

Attribute Description Default Presence
name

The internal name of the policy. The value of the name attribute can contain letters, numbers, spaces, hyphens, underscores, and periods. This value cannot exceed 255 characters.

Optionally, use the <DisplayName> element to label the policy in the management UI proxy editor with a different, natural-language name.

N/A Required
continueOnError

Set to false to return an error when a policy fails. This is expected behavior for most policies.

Set to true to have flow execution continue even after a policy fails. See also:

false Optional
enabled

Set to true to enforce the policy.

Set to false to turn off the policy. The policy will not be enforced even if it remains attached to a flow.

true Optional
async

This attribute is deprecated.

false Deprecated

<DisplayName> element

Use in addition to the name attribute to label the policy in the management UI proxy editor with a different, natural-language name.

<DisplayName>Policy Display Name</DisplayName>
Default

N/A

If you omit this element, the value of the policy's name attribute is used.

Presence Optional
Type String

<ResourceURL> 要素

この要素により、API フローで実行するメインの Python ファイルを指定します。このファイルを API プロキシ スコープ(API プロキシ バンドルの /apiproxy/resources/py の下、あるいは API プロキシ エディタのナビゲーション パネルの [スクリプト] セクション)で、あるいは組織または環境スコープで保存して、複数の API プロキシ間で再使用できます。詳しくは、リソース ファイルの説明をご覧ください。コードでは、JavaScript オブジェクト モデルのオブジェクト、メソッド、プロパティを使用できます。

<ResourceURL>py://myscript.py</ResourceURL>
デフォルト: なし
要否: 必須
型: 文字列

<IncludeURL> 要素

<ResourceURL> 要素で指定されたメインの Python ファイルに依存関係として読み込ませる Python ファイルを指定します。このスクリプトは、ポリシーに指定した順番で評価されます。

追加の <IncludeURL> 要素を使用して、複数の Python 依存関係リソースを含めることができます。

<IncludeURL>py://myscript_dependency.py</IncludeURL>
デフォルト: なし
要否: 省略可
型: 文字列

エラーコード

このセクションでは、このポリシーによってエラーがトリガーされたときに返される障害コードとエラー メッセージ、および Apigee によって設定される障害変数について説明します。これは、障害に対処する障害ルールを作成するうえで重要な情報です。詳細については、ポリシーエラーについて知っておくべきこと障害の処理をご覧ください。

ランタイム エラー

このエラーは、ポリシーの実行時に発生することがあります。

障害コード 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>