Cloud Run の上り(内向き)トラフィックの保護

1. 概要

このラボでは、Cloud Run サービスへのアクセスを制限し、オンプレミスまたはプロジェクトの VPC で実行されているワークロードからのリクエストのみを許可する方法について説明します。使用できるアクセス制御には、上り(内向き)設定と Identity and Access Management(IAM)ポリシーの 2 つのレイヤがあります。

5aed47d10595c878.png

上り(内向き)設定

上り(内向き)設定により、送信元ネットワーク(内部または外部)に基づいてリクエストをフィルタリングできます。デフォルトでは、公共のインターネットからのリクエストを含むすべてのリクエストが通過できます。

IAM ポリシー

IAM ポリシーを使用すると、送信者の ID に基づいてリクエストをフィルタリングできます。これは、サービス間のリクエストの認証によく使用されます。

このラボでは、上り(内向き)設定を使用する方法とタイミングについて学習します。

オンプレミス ホストが VPC を介して接続する

このラボでは、オンプレミス ワークロードをシミュレートします。オンプレミス ホストを Cloud Run に接続するには、 オンプレミス ホスト用の限定公開の Google アクセスを構成します。これには、以下に示すように、VPC ネットワークでの Cloud VPN ゲートウェイの設定が含まれます。

31611f6a2f12fd0c.png

VPC のジャンプ サーバーを使用してオンプレミス ワークロードをシミュレートする

このラボでは、次の図に示すように、VPC の Compute Engine 仮想マシンからリクエストを送信して、オンプレミス ホストからのリクエスト送信をシミュレートします。

aebf22740c7a84f0.png

ジャンプ サーバーとして使用する Compute Engine 仮想マシンは、Cloud VPN ゲートウェイと同じネットワーク送信元であるため、これを使用してオンプレミス ワークロードからのリクエストの送信をシミュレートできます。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この設定はいつでも変更できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

環境設定

  1. 後のコマンドで使用するために、プロジェクト ID の環境変数を設定します。
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. このラボの実行に必要な API を有効にします。
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. サンプルアプリ リポジトリのクローンを作成してディレクトリに移動する
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. Compute Engine と Cloud Run のデフォルトのリージョンとゾーンを設定する
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. サービスをデプロイする

まず、サービスをデプロイして、一般公開されたままにします。ブラウザからリクエストを送信できることを確認したら、サービスをロックダウンし、内部ネットワーク ソースからのリクエストのみを許可します。

次のコマンドを実行する際は、次の手順に沿って操作します。

  • ソースコードの場所(...): partner-registration-service ディレクトリに移動し、Enter キーを押してデフォルトを受け入れることを確認します
  • サービス名(partner-registration-service): Enter キーを押してデフォルトを受け入れます
  • Allow unauthenticated invocations to [partner-registration-service] (y/N)? Y
gcloud run deploy 

このコマンドが完了すると、Cloud Run サービスの URL が一覧表示されます。出力は次のようになります。

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

ブラウザでサービス URL を開きます。以下のような出力が表示されます。

Partner registration service: RUNNING

内部リクエストのみを許可するようにサービスを設定する

次に、Cloud Run サービスの上り(内向き)設定を使用して、内部ソースからのリクエストのみを許可します。内部ソースには、Cloud Run サービスと同じプロジェクト(または VPC Service Controls 境界)内の VPC ネットワークのリソースが含まれます。これは、このユースケースに最適です。

また、他の Google Cloud プロダクトからのリクエストは、VPC の一部でなくても内部とみなされます。これらのプロダクトには、Pub/Sub や Workflows などがあります。

これらのソースからのリクエストは、run.app URL でサービスにアクセスする場合でも、Google ネットワーク内にとどまり、一般公開は禁止されています。

内部リクエストのみを許可するようにサービスを更新します。

gcloud run services update partner-registration-service --ingress=internal

サービス URL を再度開くと、「Error: Forbidden - Access is forbidden」と表示されます。

ブラウザは Google Cloud プロジェクトの内部の送信元ではなく、外部ネットワークの送信元からリクエストを送信するため、これは想定どおりの動作です。サービスがより安全になりました。

4. Compute Engine 仮想マシンを踏み台サーバーとして作成する

次のステップでは、ジャンプ サーバーとして使用する Compute Engine インスタンスを VPC に作成して、Cloud VPN ゲートウェイを介してオンプレミス サーバーからのリクエストをシミュレートします。

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

このコマンドの出力は次のようになります。

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

Compute Engine インスタンスからサービスにリクエストを送信する

次に、仮想マシンでターミナルを開き、VPC ネットワーク内のマシンからリクエストを直接送信します。

次のコマンドで Cloud Shell で SSH を設定するよう求められた場合は、手順に沿って操作します。

gcloud compute ssh jump-server

次のコマンドを使用して、Cloud Run サービスの URL を取得します。

gcloud run services describe partner-registration-service --region us-central1

出力の最初の数行は次のようになります。

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

次に、URL をコピーし、curl を使用して Compute Engine インスタンスからリクエストを送信します。このリクエストは成功します。VM インスタンスはプロジェクトの VPC ネットワークで実行され、内部ソースであるためです。

export SERVICE_URL=https://

curl ${SERVICE_URL}

出力は次のようになります。

Partner registration service: RUNNING

5. IAM ベースのアクセス制御はどうですか?

このラボでは、上り(内向き)設定を使用する方法とタイミングについて説明しました。オンプレミス ワークロードを Cloud Run に接続する場合は、Ingress 設定から始めることをおすすめします。

IAM ベースのアクセス制御は、特にオンプレミス ホストから呼び出す場合に、実装に手間がかかります。

  • IAM では、ホストで有効期間の長いサービス アカウント認証情報を管理する必要があります
  • IAM では、サービス アカウントの認証情報を使用してリクエストに署名するためにコードの変更が必要です。

Google では、多層的なアクセス制御アプローチをおすすめします。上り(内向き)設定を使用してアクセスを内部ホストのみに制限することは、優れた第一歩ですが、そこで止まらないでください。

6. 完了

お疲れさまでした。これでこの Codelab は終了です。

次のステップ:

Cymbal Eats の他の Codelab をご覧ください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

有用な参考資料

Cloud Run の 2 つのレイヤのアクセス制御について詳しく知るのに役立つその他のリソースを次に示します。