デフォルトでは、Python 2.7 ランタイムは URL 取得サービスを使用してアウトバウンド HTTP(S) リクエストを処理します。Python ライブラリの urllib
、urllib2
、または httplib
を使用してリクエストを発行する場合も同様です。URL 取得は、明示的に有効にしない限り、requests
ライブラリからのリクエストは処理しません。
Python 3 ランタイムでは、アウトバウンド リクエストを処理するための中間サービスは必要ありません。URL Fetch API の使用から移行後も類似の機能が必要な場合は、これらのリクエストを移行し、requests
ライブラリなどの標準 Python ライブラリを使用する必要があります。
URL 取得と標準の Python ライブラリの主な違い
URL 取得によって処理されるリクエストのサイズの上限と割り当ては、URL 取得によって処理されないリクエストのサイズの上限と割り当てとは異なります。
URL 取得では、アプリが別の App Engine アプリにリクエストを送信すると、
X-Appengine-Inbound-Appid
リクエスト ヘッダーを追加してアプリの ID のアサーションを行います。リクエストを受信したアプリは、この ID を使用して、リクエストを処理するかどうかを決定できます。このヘッダーは、URL 取得を使用するアプリから送信されたリクエストでのみ使用できます。ユーザーまたは第三者がリクエストに追加したヘッダーは、App Engine によって削除されます。
URL 取得を使用せずに ID のアサーションと検証を行う方法については、アプリ ID の OIDC ID トークンへの移行をご覧ください。
App Engine アプリ間でリクエストが送信される際に、リクエスト ヘッダーを使用して呼び出し元アプリの ID を確認する方法については、App Engine から App Engine へのリクエスト サンプルをご覧ください。
URL 取得を使用して、すべてのリクエストに対してデフォルトのタイムアウトを設定できます。
requests
やurllib
などのほとんどの Python 3 ライブラリでは、None
にデフォルトのタイムアウトが設定されているため、タイムアウトを指定するにはコードが行う各リクエストを更新する必要があります。
移行プロセスの概要
アプリで URL 取得 API を使用してリクエストを行う場合は、代わりに標準の Python ライブラリを使用するようにコードを更新します。リクエストごとにタイムアウトを指定することをおすすめします。
ローカルの開発サーバーで送信リクエストをテストします。
App Engine で実行するときに、URL 取得をバイパスするようにアプリを構成します。
アプリをデプロイします。
URL 取得 API を Python ライブラリに置き換える
送信リクエストの発行に標準の Python ライブラリをまだ使用していない場合は、ライブラリを選択して、アプリの依存関係に追加します。
たとえば、リクエスト ライブラリを使用するには、
app.yaml
ファイルと同じフォルダにrequirements.txt
ファイルを作成し、次の行を追加します。requests==2.24.0
Python 2 との互換性を維持するため、
requests
ライブラリをバージョン 2.24.0 に固定することをおすすめします。アプリのデプロイ時に、App Engine はrequirements.txt
ファイル内に定義されているすべての依存関係をダウンロードします。ローカル開発では、venv などの仮想環境に依存関係をインストールすることをおすすめします。
google.appengine.api.urlfetch
モジュールが使用されているコードを検索し、Python ライブラリを使用するようにコードを更新します。
単純な HTTPS リクエストの作成
次の例は、requests
ライブラリを使用して標準の HTTPS リクエストを作成する方法を示しています。
非同期 HTTPS リクエストの作成
次の例は、requests
ライブラリを使用して非同期 HTTPS リクエストを作成する方法を示しています。
ローカルでのテスト
送信リクエストを更新した場合は、ローカルの開発サーバーでアプリを実行し、リクエストが成功したことを確認します。
URL 取得のバイパス
アプリを App Engine にデプロイしたときに URL 取得がリクエストを処理しないようにするには:
app.yaml
ファイルで、GAE_USE_SOCKETS_HTTPLIB
環境変数を任意の値に設定します。任意の値(空の文字列を含む)を指定できます。 例:env_variables: GAE_USE_SOCKETS_HTTPLIB : ''
URL 取得を有効にして
requests
ライブラリから送信されたリクエストを処理する場合は、アプリからリクエストAppEngineAdapter
を削除できます。たとえば、
appengine_config.py
ファイルからrequests_toolbelt.adapters.appengine
を削除し、Python ファイルからrequests_toolbelt.adapters.appengine.monkeypatch()
を削除します。
上記の手順で URL 取得をバイパスした場合でも、アプリは URL Fetch API を直接使用できます。
アプリのデプロイ
アプリをデプロイする準備ができたら、以下を行います。
-
Google Cloud コンソールの App Engine の割り当てページを表示して、アプリで URL Fetch API 呼び出しが行われていないことを確認します。
アプリがエラーなしで実行されている場合、トラフィック分割を使用して、更新したアプリのトラフィックを徐々に増やします。更新したアプリへのトラフィックを増やす前に、問題が発生していないか細かくモニタリングして確認してください。