以前のバンドル サービス用の Sockets API


ソケットからのトラフィックは送信帯域幅として課金されます。非同期 IO(Python の Twisted など)はサポートされていません。App Engine は、送信ソケットについてのみ、標準の Python ソケット モジュール API をサポートします。次のステートメントを使用して、標準のソケット ライブラリをインポートします。

import socket

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

Python 2 ランタイムはソケットをサポートしていますが、ソケットを使用する際に注意する必要がある制限や動作があります。

ソケット記述子の 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 Public 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 アプリに関連付けられ、移行可能なものではありません(他のアプリでは使用できません)。

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

  • 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 ファイルを構成する必要があります。

URL 取得を無効にしてすべての送信リクエストの処理をできないようにする

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

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

anyvalue は、空の文字列を含む任意の値に置き換えることができます。

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

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