ソケットからのトラフィックは送信帯域幅として課金されます。非同期 IO(Python の Twisted など)はサポートされていません。App Engine は、送信ソケットについてのみ、標準の Python ソケット モジュール API をサポートします。次のステートメントを使用して、標準のソケット ライブラリをインポートします。
import socket
socket
をインポートするライブラリ(poplib
、nntplib
など)が以下の制限事項に違反していない場合は、変更しなくても正常に動作します。
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 はサポートされません。
- デフォルトでは、
httplib
は urlfetch api を使用するように構成されています。ただし、socket
を使用して urlfetch の制限を回避する必要がある場合は、httplib
がソケットを使用するようにこのデフォルト設定を変更してください。詳細については、httplib
がソケットを使用するようにするをご覧ください。 - 使用できるのは TCP と UDP だけで、任意のプロトコルを使用できるわけではありません。
- 特定の IP アドレスまたはポートにバインドすることはできません。
- ポート 25(SMTP)はブロックされます。送信ポート 587 の認証済みの SMTP は使用できます。
以下に示すものを除いて、プライベート、ブロードキャスト、マルチキャスト、Google の IP 範囲はブロックされます。
- Google Public DNS:
8.8.8.8
、8.8.4.4
、2001:4860:4860::8888
、2001:4860:4860::8844
のポート 53 - Gmail SMTPS:
smtp.gmail.com
ポート 465 とポート 587 - Gmail POP3S:
pop.gmail.com
ポート 995 - Gmail IMAPS:
imap.gmail.com
ポート 993
- Google Public DNS:
ソケット記述子は作成元の 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 のソケット デモアプリをご覧ください。