Python 2 用 Sockets API の概要


ソケットは有料アプリでのみ使用でき、ソケットからのトラフィックは送信帯域幅として課金されます。また、ソケットには日単位の割り当てと分単位(バースト)の割り当ての制限が適用されます。非同期 IO(Python の Twisted など)はサポートされていません。App Engine は、送信ソケットについてのみ、標準の Python ソケット モジュール API をサポートします。次のステートメントを使用して、標準のソケット ライブラリをインポートします。

import socket

socket をインポートするライブラリ(poplibnntplib など)が下記の制限事項に違反していない場合は、変更しなくても正常に動作します。

App Engine ではソケットがサポートされますが、一定の制限や動作に注意が必要です。ソケットを使用する際は次の点に注意してください。

ソケット記述子の pickle を実行し、それを App Engine のインスタンス間で(たとえば、タスク ペイロードの一部として)受け渡すことができます。このシナリオでは、フロントエンドのインスタンス上でソケットを開き、それをバックエンド インスタンスに渡して、そのインスタンスで使用できます。

1.8.1 より前のバージョンの SDK では、ソケットに対して get / set オプションを呼び出すことができませんでした(これらのオプションを呼び出すと、「実装されていません」という例外が出されていました)。現在の Sockets API ではこれが可能になっています。

サポートされているオプションに関しては、getsockopt を呼び出すとモック値が返され、setsockopt の呼び出しは通知なく無視されます。サポートされていないオプションの場合は、引き続きエラーが発生します。

次のオプションを使用できます。

  • SO_KEEPALIVE
  • SO_DEBUG
  • TCP_NODELAY
  • SO_LINGER
  • SO_OOBINLINE
  • SO_SNDBUF
  • SO_RCVBUF
  • SO_REUSEADDR

制限事項

App Engine のソケット サポートには次の制限があります。

  • ソケットは有料アプリでのみ使用できます。
  • リッスン ソケットは作成できません。作成できるのはアウトバウンド ソケットだけです。
  • FTP はサポートされません。
  • デフォルトでは、httpliburlfetch api を使用するように構成されています。ただし socket を使用して urlfetch の制限を回避する必要がある場合は、httplib が代わりにソケットを使用するようにこのデフォルト設定を変更してください。詳細については、httplib がソケットを使用するようにするをご覧ください。
  • 使用できるのは TCP と UDP だけで、任意のプロトコルを使用できるわけではありません。
  • 特定の IP アドレスまたはポートにバインドすることはできません。
  • ポート 25(SMTP)はブロックされます。送信ポート 587 の認証済みの SMTP は使用できます。
  • 下記のホワイトリストに登録されていないプライベート、ブロードキャスト、マルチキャスト、Google の IP 範囲はブロックされます。

    • Google パブリック DNS: 8.8.8.88.8.4.42001:4860:4860::88882001:4860:4860::8844 のポート 53
    • Gmail SMTPS: smtp.gmail.com のポート 465 と 587
    • Gmail POP3S: pop.gmail.com のポート 995
    • Gmail IMAPS: imap.gmail.com のポート 993
  • ソケット記述子は作成元の App Engine アプリに関連付けられ、移行可能なものではありません(他のアプリでは使用できません)。

  • ソケットはアクティブでない状態が 2 分続くと回収されます。ソケットが維持される時間は、なんらかのオペレーションが行われると 2 分延長されます。

  • socket.gethostbyaddr() は現在、Python では実装されていません。接続を開くには、引き続き Python SMTP 標準ライブラリ(smtplib)を使用します。

    # Open a connection to my mail server
    s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
    

開発用サーバーでソケットを使用する

ソケットを使用したコードは、開発用サーバーでそのまま実行してテストできます。特別なコマンドライン パラメータは必要ありません。

OpenSSL でソケットを使用する

App Engine は、Python 2.7 ランタイムのネイティブ Python OpenSSL をサポートしています。OpenSSL サポートで説明されているように、SSL ライブラリが読み込まれるように app.yaml ファイルを構成する必要があります。

httplib がソケットを使用するようにする

httplib をインポートすると、デフォルトでは urlfetch api が使用されます。httplib がソケットを使用するように変更するには、プロジェクトの app.yaml ファイルに環境変数を追加します。

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

任意の値(空の文字列を含む)を指定できます。この変数を指定しない場合、httplib では引き続き URLFetch が使用されます。

ソケットを使用する App Engine のサンプル

ソケットを使用したサンプルについては、Google Cloud Platform GitHub のソケット デモアプリをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Python 2 の App Engine スタンダード環境