このページは Apigee と Apigee ハイブリッドに適用されます。
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 ポリシーとスクリプト
PythonScript ポリシー
<?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>
次の表に、すべてのポリシーの親要素に共通する属性を示します。
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
name |
ポリシーの内部名。 管理 UI プロキシ エディタで |
なし | 必須 |
continueOnError |
ポリシーが失敗したときにエラーを返す場合は、 ポリシーが失敗した後もフローの実行を続行する場合は、 |
false | 省略可 |
enabled |
ポリシーを適用するには、 ポリシーを無効にするには、 |
true | 省略可 |
async |
この属性は非推奨となりました。 |
false | 非推奨 |
<DisplayName> 要素
管理 UI プロキシ エディタで name
属性と一緒に使用して、ポリシーのラベルに使用する自然言語名を指定します。
<DisplayName>Policy Display Name</DisplayName>
デフォルト |
なし この要素を省略した場合、ポリシーの |
---|---|
要否 | 省略可 |
タイプ | 文字列 |
<ResourceURL> 要素
この要素により、API フローで実行するメインの Python ファイルを指定します。このファイルは、API プロキシ スコープ(API プロキシ バンドルの /apiproxy/resources/py
または API プロキシ エディタの [Navigator] ペインの [Scripts] セクション)か、組織または環境スコープに保存して、複数の 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 エラーをスローします。よくあるエラーとしては、NameError や ZeroDivisionError があります。 | build |
デプロイエラー
以下のエラーは、このポリシーを含むプロキシをデプロイするときに発生することがあります。
エラー名 | 原因 | 修正 |
---|---|---|
InvalidResourceUrlFormat |
PythonScript ポリシーの <ResourceURL> または <IncludeURL> 要素で指定されたリソース URL の形式が無効な場合、API プロキシのデプロイが失敗します。 |
build |
InvalidResourceUrlReference |
<ResourceURL> 要素または <IncludeURL> 要素が存在しない PythonScript ファイルを参照している場合、API プロキシのデプロイが失敗します。参照先のソースファイルが API プロキシ、環境、組織レベルのいずれかに存在している必要があります。 |
build |
障害変数
次の変数は、このポリシーでランタイム エラーが発生したときに設定されます。詳細については、ポリシーエラーについて知っておくべきことをご覧ください。
変数 | 説明 | 例 |
---|---|---|
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>