リクエストの処理方法

このドキュメントでは、App Engine アプリケーションでリクエストを受信してレスポンスを送信する方法について説明します。詳細については、リクエスト ヘッダーのリファレンスをご覧ください。

アプリケーションでサービスを使用している場合は、リクエストの送信先を特定のサービスまたはそのサービスの特定のバージョンに指定できます。サービスのアドレス指定の方法について詳しくは、リクエストのルーティング方法をご覧ください。

リクエストの処理

アプリケーションは、ウェブサーバーの起動とリクエストの処理を行う役割を果たします。使用する開発言語に対応している任意のウェブ フレームワークを使用できます。

App Engine はアプリケーションの複数のインスタンスを実行します。各インスタンスには、リクエストを処理するウェブサーバーがそれぞれ割り当てられます。リクエストがルーティングされるインスタンスは任意に決まるため、同じユーザーから連続して送信されたリクエストが同じインスタンスに届くとは限りません。インスタンスは、複数のリクエストを同時に処理できます。インスタンスの数は、トラフィック量の変化に応じて自動的に調整されます。また、app.yaml ファイルの max_concurrent_requests 要素を設定することで、インスタンスが同時に処理できるリクエストの数を変更できます。

App Engine 用の Go ランタイムでは、Go プログラムと App Engine サーバー間のインターフェースとして、標準の http パッケージが使用されます。App Engine はアプリケーションへのウェブ リクエストを受け取ると、リクエストされた URL に関連付けられた http.Handler を呼び出します。

次の例は、ハードコードされた HTML 文字列をユーザーに対して出力する完全な Go アプリケーションを示しています。

package hello

import (
	"fmt"
	"net/http"
)

func init() {
	http.HandleFunc("/", hello)
}

func hello(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "<h1>Hello, world</h1>")
}

割り当てと制限

App Engine は、トラフィックが増加すると、自動的にアプリケーションにリソースを割り当てます。ただし、次のような制限があります。

  • App Engine は、1 秒未満でリクエストに応答するレイテンシが短いアプリケーション向けに、自動スケーリングのための容量を予約しています。レイテンシが長いアプリケーション(1 件あたり 1 秒を超えるリクエストが多いなど)で、スループットを高くするには、シルバー、ゴールド、プラチナのいずれかのサポートが必要です。これらのレベルのサポートを契約済みの場合は、サポート担当者に連絡してスループットの上限を引き上げることができます。

  • また、CPU の制約を大きく受けるアプリケーションでも、同じサーバー上の他のアプリケーションとリソースを効率的に共有するために、追加のレイテンシが生じる場合があります。静的ファイルへのリクエストには、このようなレイテンシの制限がありません。

アプリケーションが受信する各リクエストは、[リクエスト数] の制限対象としてカウントされます。リクエストへのレスポンスとして送信されるデータは、[送信帯域幅(課金対象)] の制限対象としてカウントされます。

HTTP リクエストと HTTPS(セキュア)リクエストのどちらにも、リクエスト数受信帯域幅(課金対象)送信帯域幅(課金対象)の制限が適用されます。GCP Console の [割り当ての詳細] ページには、参考のために [安全なリクエスト数]、[安全な受信帯域幅]、[安全な送信帯域幅] もそれぞれ報告されます。これらの値としてカウントされるのは、HTTPS リクエストのみです。詳細については、[割り当て] ページをご覧ください。

リクエスト ハンドラの使用には、特別に次の制限が適用されます。

リクエストに関する制限

  • リクエスト ヘッダー内では最大 15 KB のサイズが許可されます。
  • リクエストの合計サイズは 32 MB までに制限されます。
  • すべての HTTP/2 リクエストは、アプリケーション サーバーに転送される際に HTTP/1.1 リクエストに変換されます。
  • SSL 接続はロードバランサで終了されます。ロードバランサからのトラフィックは暗号化されたチャネルを介してインスタンスに送信されてから、HTTP でアプリケーション サーバーに転送されます。X-Forwarded-Proto ヘッダーを確認すると、元のリクエストが HTTP であったか HTTPS であったかがわかります。

レスポンスに関する制限事項

  • レスポンスは 64k ブロック単位でバッファリングされます。
  • レスポンス サイズに制限はありません。
  • レスポンス時間の制限は 1 時間です。

サポートされていない HTTP リクエスト

次に示す機能は、App Engine フレキシブル環境ではサポートされません。

  • バックエンド サービスへの HTTP/2 トラフィック
  • WebSocket
  • インスタンスに直接アクセスする HTTP リクエスト

リクエスト ヘッダー

着信した HTTP リクエストには、クライアントから送信された HTTP ヘッダーが含まれています。セキュリティ上の理由から、一部のヘッダーは、アプリケーションに到達する前に中間プロキシによってサニタイズ(リスクのある部分などを削除)または修正されます。

詳細については、リクエスト ヘッダーのリファレンスをご覧ください。

リクエストに対するレスポンス

App Engine は RequestResponseWriter を使用してハンドラを呼び出した後、ハンドラが ResponseWriter に書き込んで戻るのを待機します。ハンドラが戻ると、ResponseWriter の内部バッファに格納されたデータがユーザーに送信されます。

これは実質的に、http パッケージを使用する通常の Go プログラムを記述する場合と同じです。

生成するレスポンスには制限があり、レスポンスがクライアントに返される前に、制限に基づいてレスポンスが変更されることがあります。

バッファリングの無効化

App Engine からのすべてのレスポンスは、デフォルトでは 64k ブロック単位でバッファリングされます。場合によっては、バッファリングを無効にして、クライアントにバイトを直接ストリーミングする方が合理的なことがあります。一般的に、ハンギング GET または Server Sent Event(SSE)を使用しているときはこの方法が推奨されます。バッファリングを無効にするには、X-Accel-Buffering レスポンス ヘッダーを no に設定します。

X-Accel-Buffering: no

HTTPS 接続の強制

セキュリティ上の理由から、すべてのアプリケーションは、https で接続するようクライアントに促すべきです。以下の例のように、Strict-Transport-Security ヘッダーを使用すると、特定のページまたはドメイン全体で http よりも https を優先するようブラウザに指示できます。

Strict-Transport-Security: max-age=31536000; includeSubDomains
このページは役立ちましたか?評価をお願いいたします。

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

Go の App Engine フレキシブル環境