このページでは、NGINX をアプリケーション コンテナのフロントエンド プロキシとして使用する方法について説明します。これは、リクエストやレスポンスを処理する場合に便利です。アプリケーション コンテナが HTTP/1 のみをサポートしており、パフォーマンス上の理由でエンドツーエンドで HTTP/2 を使用する必要がある場合は、gzip 圧縮を追加するか、HTTP/2 を HTTP/1 に変換できます。
このページの例では、Nginx コンテナがすべての Cloud Run インスタンス上で、メインのサービング コンテナとして実行され、アプリケーション コンテナにリクエストを転送するように構成されています。この図のように、サイドカー コンテナとして動作します。
Cloud Run でフロントエンド プロキシを効果的に行うためには、Nginx サーバー プロキシ サーバー コンテナとウェブアプリ コンテナを単一の Cloud Run サービスとしてデプロイします。
この単一の Cloud Run サービスは、リクエストを受け入れ、Ingress(サービング)コンテナ(この場合はプロキシ サーバー)に配信します。次に、プロキシ サーバーは、localhost
ネットワーク インターフェースを介してウェブアプリにリクエストを送信します。これにより、外部ネットワークを回避できます。
単一の Cloud Run サービスとしてデプロイすることでレイテンシとサービス管理のオーバーヘッドが削減され、外部ネットワークへの露出がなくなります。なお、Cloud Run は、サービスの開始時または停止時にサイドカー コンテナを起動または停止する場合を除き、サイドカー コンテナを直接操作しません。
ウェブアプリ コンテナやすべてのサイドカー コンテナは、さまざまなプログラミング言語で記述できます。PHP で記述されたサンプルについては、GitHub の PHP nginx サンプルをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run and Secret Manager APIs.
- gcloud CLI をインストールして初期化します。
gcloud components update
で Google Cloud CLI を更新します。gcloud init
で Google Cloud CLI を構成します。gcloud auth login
を使用して Google Cloud CLI で認証を行います。
デプロイに必要な権限
次のいずれかが必要です。
- Cloud Run 管理者ロールとサービス アカウント ユーザー ロールの両方
- この権限のリストを含むカスタムロール
構成の概要
以下の手順では事前にビルドされたコンテナ イメージを使用するため、フロントエンド プロキシに必要な作業はコンテナとサービス自体の構成だけです。
Nginx Ingress コンテナを構成する
コンテナ イメージは nginx
で、Docker Hub で入手できます。ほぼそのままで使用できますが、プロキシ サービスとして実行するように構成し、サイドカー コンテナが localhost
でリッスンするポートにプロキシ リクエストを配信する必要があります。このページの例では、リクエストとレスポンスで gzip 圧縮も有効になっています。
この構成は、/etc/nginx/conf.d/nginx.conf
にマウントされたテキスト ファイルを使用して提供されます。コンテナ内のファイルは直接編集できないため、構成ファイルを含む /etc/nginx/conf.d/
にボリュームをマウントする必要があります。Cloud Run で実行されているコンテナ内の特定の場所にファイルをマウントする方法の 1 つは、ファイルの内容を Secret Manager のシークレットに保存し、そのシークレットを必要な場所にマウントすることです。ボリュームはランタイム時に読み込まれます。
ローカルマシンの現在のディレクトリにある nginx.conf
という名前のファイルに次の内容をコピーします。
構成で、次の操作を行います。
localhost
にある同じ Cloud Run デフォルト ポート8080
をリッスンするようにnginx
を割り当てます。- gzip 圧縮を適用してパフォーマンスを高めます。
- この Ingress コンテナへのリクエストをウェブアプリ サイドカー コンテナ(localhost ポート
8888
)に配信するようproxy_pass
に指示します。
nginx.conf
ファイルの内容に基づいてシークレットを作成します。
コンソール
Google Cloud コンソールの [Secret Manager] ページに移動します。
[シークレットを作成] をクリックします。
name
フォーム フィールドに「nginx_config」と入力します。multi-container/hello-nginx-sample/nginx.conf
にあるnginx.conf
ファイルをシークレット値としてアップロードします。デフォルト(
Google-managed encryption key, etc
)のままにします。[シークレットを作成] をクリックします。
プロジェクトのコンピューティング サービス アカウントに、この新しいシークレットへのアクセス権を付与します。これを行うには、Google Cloud コンソールの [IAM] ページに移動します。
Compute Engine default service account
という名前のプリンシパル サービス アカウントを見つけて、[プリンシパルの編集] をクリックします。[別のロールを追加] をクリックし、[Secret Manager のシークレット アクセサー] を選択します。
[保存] をクリックします。
gcloud
ターミナルで次のコマンドを使用して、Secret Manager に新しい
nginx_config
シークレットを作成します。gcloud secrets create nginx_config --replication-policy='automatic' --data-file='./nginx.conf'
次のコマンドを使用して、プロジェクトのコンピューティング サービス アカウントにこの新しいシークレットへのアクセス権を付与します。
export PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)') gcloud secrets add-iam-policy-binding nginx_config --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com --role='roles/secretmanager.secretAccessor'
gcloud secrets list
を実行して、シークレットが作成されたことを確認します。
ウェブアプリ サイドカーのサンプル イメージについて
以下の手順では、us-docker.pkg.dev/cloudrun/container/hello
にあるサンプル コンテナ イメージを使用します。次のセクションで説明するように、サイドカー コンテナの構成を指定するの説明に従って、コンテナがリッスンするポート番号を指定し、ホストとして localhost
を指定する必要があります。
マルチコンテナ サービスを構成する
Google Cloud コンソールまたは Cloud Run YAML ファイルを使用して、複数のコンテナを含む Cloud Run サービスを構成できます。
サービス構成では、Nginx プロキシ サーバーを Ingress(サービング)コンテナとして指定し、リッスンするポート、HTTP 1 リクエストまたは HTTP 2 リクエストを受け入れるかどうか、コンテナの開始順序を指定します。Ingress コンテナ(プロキシ サーバー)はウェブアプリ サイドカーに依存するため、ウェブアプリ サイドカーを最初に開始する必要があります。
これらの構成について、以降のセクションで説明します。
YAML メタデータを追加する
コンソール
コンソールの詳細な手順については、サービスをデプロイするをご覧ください。
YAML
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
service.yaml
に以下を追加します。
このセクションではサービスのリビジョンについて説明しており、リビジョンごとに異なる可能性のあるプロパティも含まれています。
コンテナの起動順序を指定する
コンソール
コンソールの詳細な手順については、サービスをデプロイするをご覧ください。
YAML
service.yaml
に以下を追加します。
container-dependencies
アノテーションが、nginx コンテナを起動する前に hello コンテナの起動を待つように Cloud Run に指示している点に注意してください。これを行わずに nginx コンテナが最初に起動した場合、準備ができていないウェブアプリ コンテナにウェブ リクエストをプロキシしようとし、ウェブエラー レスポンスが生成されます。
各コンテナには、他のディレクティブでも参照できる name プロパティを任意で定義できます。サービング コンテナは nginx
というプロキシ サーバーを実行します。このコンテナは、Cloud Run による受信リクエストの配信先になります。そのため、これらを配信する先の HTTP
のバージョンとコンテナポートを指定する必要があります。
サービング コンテナの構成を指定する
コンソール
コンソールの詳細な手順については、サービスをデプロイするをご覧ください。
YAML
service.yaml
ファイルに以下を追加します。
nginx
サーバーでは、/etc/nginx/conf.d/
ディレクトリに構成ファイルが存在する必要があります。その場所にファイルを含むボリュームをマウントします。volumeMount
セクションでは、そこに配置する configuration
というボリュームを指定します。ボリューム自体は、ファイルの後のセクションで独自に定義します。
サイドカー コンテナの構成を指定する
コンソール
コンソールの詳細な手順については、サービスをデプロイするをご覧ください。
YAML
service.yaml
に以下を追加します。
hello
アプリケーションには構成情報も必要です。PORT
環境変数に指定されたポートで受信リクエストをリッスンします。名前と値は env
セクションで指定されています。
シークレット ボリュームを指定する
コンソール
コンソールの詳細な手順については、サービスをデプロイするをご覧ください。
YAML
service.yaml
ファイルに以下を追加します。
volumeMount
セクションに、マウントされた構成 volume
を指定します。これには nginx.conf
という単一のファイルが含まれており、その内容は nginx-conf-secret
という名前のシークレットの値として定義されています。
サービスをデプロイする
コンソール
Google Cloud コンソールの [Cloud Run] ページに移動します。
[コンテナをデプロイ] をクリックし、[サービス] を選択して、[サービスの作成] フォームを表示します。
- [既存のコンテナ イメージから 1 つのリビジョンをデプロイする] を選択し、[コンテナ イメージの URL] に「
nginx
」と入力します。 - [サービス名] フィールドに、サービスの名前(例:
hello-mc
)を入力します。 - [リージョン] リストから、デプロイ先のロケーション(
us-west1
など)を選択します。 - [認証] で [
Allow unauthenticated invocations
] を選択します。
- [既存のコンテナ イメージから 1 つのリビジョンをデプロイする] を選択し、[コンテナ イメージの URL] に「
[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックして、構成フォームを開きます。
- [ボリューム] タブをクリックします。
- [ボリュームを追加] をクリックします。
- [ボリュームのタイプ] リストから、[シークレット] を選択します。
- [ボリューム名] フィールドに「
nginx-conf-secret
」と入力します。 - [シークレット] フィールドに「nginx_config」と入力します。
- [シークレット バージョンに指定されているパス] で、パスとして default.conf を指定し、バージョンとして latest を指定します。
- [作成] をクリックして、シークレット ボリュームを作成します。
[コンテナ] タブをクリックして、[コンテナの編集] フォームを表示します。
- [設定] をクリックし、[リソース] でメモリを 256MiB に、CPU を 1 CPU に変更します。
- [ボリュームのマウント] をクリックします。
- [ボリュームをマウント] をクリックします。
- 名前のリストから nginx-conf-secret を選択します。
- [マウントパス] に「etc/nginx/conf.d」と入力します。
- [完了] をクリックして、最初のコンテナの構成を完了します。
[コンテナを追加] をクリックしてサイドカー コンテナを追加し、[新しいコンテナ] フォームを表示します。
- デフォルトのコンテナ イメージ URL us-docker.pkg.dev/cloudrun/container/hello を選択します。
- [設定] タブをクリックし、[リソース] で、メモリを 256MiB に、CPU を 1 CPU に変更します。
- [変数とシークレット] をクリックします。
- [変数を追加] をクリックします。
- 新しい環境変数名として「PORT」と入力し、値として「8888」と入力します。
- [完了] をクリックします。
最初のコンテナ(
nginx
)の [コンテナの編集] フォームに移動します。- [設定] タブをクリックします。
- [コンテナの起動順序] で、[以下のコンテナに依存] リストから
nginx
を選択します。nginx
コンテナは、hello
コンテナが正常に起動した後にのみ起動します。 - [作成] をクリックし、サービスがデプロイされるのを待ちます。
gcloud
プロキシ サーバー コンテナとウェブアプリ コンテナを単一のサービスとしてデプロイするには、以下を行います。
gcloud run services replace service.yaml
デプロイされたサービスを確認する
gcloud
デプロイが成功したことを確認するには、生成された Cloud Run URL をコピーしてブラウザで開くか、次のコマンドを使用して認証済みリクエストを送信します。
curl --header "Authorization: Bearer $(gcloud auth print-identity-token)"
レスポンス ステータスに、200
の hello サイドカー コンテナに正常に移行された nginx プロキシが示されます。
試してみる
このチュートリアルの手順は次のとおりです。
gcloud
ターミナルで、ローカルマシンにサンプルアプリ リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
Cloud Run のサンプルコードが含まれているディレクトリに移動します。
cd cloud-run-samples/multi-container/hello-nginx-sample/
次のステップ
Cloud Run サービスでサイドカーを使用する方法の詳細については、以下をご覧ください。