📝

共有VPC環境でDirect VPC egressを試してみた

2024/01/09に公開

はじめに

こんにちは、クラウドエースの SRE チームに所属している岸本です。
今回は、Direct VPC egress を使用し、Cloud Run から共有 VPC ネットワークにトラフィックを実際に送信してみました。Cloud Run から PostgreSQL 用の AlloyDB に接続するクイックスタートを参考に、Direct VPC egress の設定をしてみました。以下構成例です。

全体構成図
構築では、初めに共有 VPC を作成し、AlloyDB を作成します。その後、Compute Engine を作成し、AlloyDB にデータベースを作成します。
最後に Cloud Run 作成、ロールの付与を行い、動作確認を行います。

サービスの概要

Direct VPC egress とは

Direct VPC egress を Cloud Run サービスで有効にすると、サーバーレス VPC アクセスコネクタなしで VPC ネットワークにトラフィックを送信することができます。しかし、 Cloud NAT が使用できないなどの制約があります。詳しい概要を知りたい人は、以下のリンクから Direct VPC egress の紹介ブログ記事をご覧ください。

共有 VPC とは

共有 VPC(Shared VPC)を用いることで、1 つのプロジェクト内に設定された VPC ネットワークを他の異なるプロジェクトと共有することが可能です。また、VPC を中央集権的に管理することができます。
共有する VPC が所属するプロジェクトをホストプロジェクトと呼び、ホストプロジェクトから VPC を共有されるプロジェクトをサービスプロジェクトと呼びます。
ホストプロジェクト側でサービスプロジェクトへの共有設定を行うことで、ホストプロジェクトにある VPC をサービスプロジェクト側で利用可能になります。
詳しい概要を知りたい人は、以下のリンクから共有 VPC の公式ドキュメントをご覧ください。

AlloyDB とは

AlloyDB for PostgreSQL は、Google Cloud 上で完全に管理されたデータベースサービスです。PostgreSQL と互換性があり、トランザクションと分析クエリの両方に対して高いパフォーマンスを提供します。詳しくは、以下のリンクから AlloyDB の紹介ブログ記事をご覧ください。

構築手順

構築手順は以下の通りです。

  1. 共有 VPC の作成
  2. AlloyDB の作成
  3. Compute Engine を作成し AlloyDB にデータベースを作成
  4. Cloud Run の作成
  5. Cloud Run に共有 VPC にアクセスするロールを付与
  6. 動作確認

以下の環境から構築していきます。
構築の各ステップで構成図が作る範囲を示しています。
def

1. 共有 VPC の作成

初めにホストプロジェクトで共有 VPC を作成します。
その後、サービスプロジェクトと共有 VPC を接続します。
以下を構築します。
1

ホストプロジェクトで VPC を作成

「VPC ネットワークの作成」をクリックし、VPC の設定を行います。
初めに VPC 名を入力し、他は任意で設定します。

VPCネットワークの作成

サブネットの作成

次にサブネットの設定を行います。サブネットはネットワークを分割した小さなネットワークです。またサブネットはリージョンに紐付きます。

サブネットの作成

ファイアウォールルールの設定

最後にファイアウォールの設定を行います。ファイアウォールは、ネットワークとの通信に対してポリシーを設定し、許可または拒否するセキュリティ機能のことです。
下の画像のように選択肢で選ぶことも、後から自分で設定することもできます。
今回使用するのは、VM インスタンスからの SSH 接続と、AlloyDB への接続、のために 22 番ポートと 443 番ポートを開けます。
22 番ポートは選択できますが、443 番ポートは選択肢にありません。そのため、自分で設定します。「編集」をクリックし画像のように設定します。

[赤い枠で囲われた編集をクリック]
ファイアウォールルールの作成

[指定したプロトコルとポートを選択し、TCPにチェックを入れて443を入力]
ファイアウォールルールの作成

[最後に確認する]
ファイアウォールルールの作成

サービスプロジェクトと共有 VPC を接続

VPC ネットワークから共有 VPC を選択し、「共有 VPC を設定」をクリックします。

共有VPCを設定

次の

  • 「ホストプロジェクトを有効にする」
  • 「サブネットの選択」
  • 「権限を付与する」

はデフォルトで設定します。

共有 VPC の「接続されたプロジェクト」から、「プロジェクトを接続」をクリックし、接続したいサービスプロジェクトを選択します。

プロジェクトを接続

サービスプロジェクトを選択し、「共有モード」を「個々のサブネット」に設定し、共有するサブネットを選択します。

共有モード

これで共有 VPC の作成は完了です。

2. AlloyDB の作成

クイックスタートの「Create a cluster and its primary instance」を元に AlloyDB を作成していきます。
ここでは以下まで構築します。
2

初めに AlloyDB のクラスタを作成します。クラスタは、データベース、ログ、その他のメタデータがすべて含まれる集合体のようなものです。
次にプライマリインスタンスを作成します。プライマリインスタンスとは、クラスタの中でデータベースの read と write を処理するインスタンスです。
また、 AlloyDB は Google が所有するネットワーク内に作成されます。 そのため、プライベートサービスアクセスを使用して、Google が所有するネットワークと共有 VPC ネットワークをピアリングする必要あります。これにより、共有 VPC ネットワークから AlloyDB にプライベート接続することが可能になります。
以上のクラスタ、プライベートサービスアクセス、プライマリインスタンス、を順に設定していきます。

クラスタの作成

項目は以下の通りです。

項目
使用するクラスタ構成を選択 高可用性
クラスタ ID my-cluster
パスワード 任意のパスワードを設定
データベースのバージョン PostgreSQL 14 に対応
リージョン asia-northeast1
ネットワーキング 接続を設定

プライベートサービスアクセスがない場合は、以下のような警告が出るので、「接続を設定」をクリックします。
クラスタの作成
この設定画面は プライベートサービスアクセス接続 の設定です。以下のように設定し「続行」、「接続を作成」をクリックします。
クラスタの作成

以上でクラスタとプライベートサービスアクセスの設定は完了です。
次にプライマリインスタンスを作成します。

プライマリインスタンスの構成

項目
インスタンス ID my-primary
マシン 2 vCPU、16 GB

プライマリインスタンスの構成

さらに詳しい作成方法は公式ドキュメントをご覧ください。

以上で AlloyDB の作成は完了です。

3. Compute Engine を作成し AlloyDB にデータベースを作成

Compute Engine を作成し、AlloyDB にデータベースを作成します。
初めに上記で作成した VPC ネットワーク内に Compute Engine を作成します。
その後、Compute Engine に AlloyDB に接続するためのクライアントをインストールし、AlloyDB にデータベースを作成します。

ここでは以下まで作成します。
3

Compute Engine の作成

VM インスタンスのページに移動し、「インスタンスの作成」をクリックします。

項目
名前 高可用性
リージョン asia-northeast1
ゾーン asia-northeast1-a
アクセススコープ すべての Cloud API に対する完全なアクセスを許可
ネットワーク test-vpc
サブネット test-subnet

AlloyDB にデータベースを作成

作成した Compute Engine に SSH 接続します。

作成した Compute Engine に AlloyDB に接続するためのクライアントをインストールします。
SSH 接続したコンソール上で以下を実行します。

sudo apt-get update
sudo apt-get install --yes postgresql-client

クライアントをインストールしたら、AlloyDB に接続します。
接続する際に、AlloyDB のプライベート IP アドレスと、AlloyDB のパスワードを使用します。
コンソール画面から AlloyDB のプライベート IP アドレスを確認しておきます。

AlloyDBのプライベートIPアドレス

以下のコマンドを Compute Engine に SSH 接続したコンソール上で実行します。

// IP_ADDRESSにAlloyDBの内部IPアドレスを入れ替えます。
psql -h IP_ADDRESS -U postgres

// postgres=>のプロンプトが表示されたら以下を実行します。
postgres=> CREATE DATABASE quickstart_db;

以上で AlloyDB にデータベースを作成することができました。

4. Cloud Run の作成

ここからは、アプリケーションを作成します。
サービスプロジェクトに切り替え、サンプルアプリを Cloud Run にデプロイします。
初めに Cloud Run で動かすサンプルアプリをダウンロードし、Container Registry にビルドします。
その後に、Cloud Run を作成します。

次の「5. Cloud Run に共有 VPC にアクセスするロールを付与」も含め、以下まで構築します。
3

サンプルアプリのダウンロード

サンプルアプリは、Cloud Run から AlloyDB に接続し、データベースにアクセスするアプリです。
サンプルアプリのコードは Cloud Shell で以下のコマンドを実行することでダウンロードできます。

cloudshell_open --repo_url \
"https://github.com/GoogleCloudPlatform/alloydb-auth-proxy" \
--dir \
"examples/go" \
--force_new_clone

次に Container Registry にサンプルアプリをビルドします。

// PROJECT_IDにサービスプロジェクトのIDを入れ替えます
gcloud builds submit --tag gcr.io/PROJECT_ID/run-sql --project PROJECT_ID

数分後、DONE と表示されます。
Container Registry のページに移動し、gcr.io/PROJECT_ID/run-sql のイメージが作成されていることを確認します。
Container Registry
Container Registry

これで Container Registry にサンプルアプリがビルドされました。

Cloud Run の作成

Cloud Run のページに移動し、「サービスの作成」をクリックします。

項目
コンテナイメージの URL [1]を参照ください
サービス名 任意の名前を入力
リージョン asia-northeast1
認証 「認証されていない呼び出しを許可する」を選択
コンテナの編集/変数とシークレット [2]を参照ください
ネットワーキング [3]を参照ください

[1] イメージ選択
Cloud Runの作成

[2] データベース接続の設定
環境変数

[3] Direct VPC egressの設定
ネットワーキング

これで Cloud Run の作成は完了です。

Cloud Run の動作確認

しかし、以下のようなエラーが表示されます。
エラー

これは、Cloud Run サービスエージェントに共有 VPC へアクセスするロールを付与する必要があるためです。

5. Cloud Run に共有 VPC にアクセスするロールを付与

サービスエージェントとは、Google 管理のサービス アカウントで別のサービスを呼び出すために使用されます。
これは、「IAM と管理」で確認することができます。「IAM」の「Google 提供のロール付与を含める」をチェックするとサービスエージェントが表示されます。
サービスエージェント表示

今回のサービスエージェントのイメージとしては以下のようになります。
サービスエージェントにサブネットへアクセスするロールを付与

サービスエージェントについての公式ドキュメントはこちらです。
また、サービスエージェントの一覧はこちらです。

Cloud Run サービスエージェントにロールを付与

サービスプロジェクト内の Cloud Run サービスエージェントにホストプロジェクトのサブネットへアクセスするロールを付与します。
付与するロールは以下です。

  • ホストプロジェクトに対する Compute ネットワークユーザー
    • 共有 VPC ネットワークへのアクセスを提供するために必要です。
    • 含まれる権限の詳細はこちらから確認できます。

Cloud Shell を開き、以下のコマンドを実行し Cloud Run サービスエージェントにロールを付与します。

// 共有 VPCホストプロジェクトのCompute ネットワークユーザーのロールを付与
gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member "serviceAccount:service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \
--role "roles/compute.networkUser"

ロール付与の確認

Cloud Run サービスエージェントにロールが付与されていることを確認します。
ホストプロジェクトに移動し、「IAM と管理」のページに移動します。
先ほどと同様、「Google 提供のロール付与を含める」をチェックするとサービスエージェントが表示されます。
サービスプロジェクトのプロジェクト番号が含まれた Cloud Run サービスエージェントがあり Compute ネットワークユーザーのロールが付与されていることを確認します。
サービスエージェントにサブネットへアクセスするロールを付与

以上で Cloud Run サービスエージェントにロールを付与することができました。

6. 動作確認

Cloud Run のページに移動し、作成した Cloud Run サービスを選択します。
「サービスの URL」をクリックし、サンプルアプリのページに移動します。
サービスのURL

これで Cloud Run から AlloyDB に接続することができました。

まとめ

今回は、Direct VPC egress を使用し、Cloud Run から共有 VPC ネットワークにトラフィックを実際に送信してみました。
同じく VPC へアクセスするサービスの、サーバレス VPC アクセスで必要であったコネクタは不要で、数クリックで使用できる Direct VPC Egress はコスト面からも良いと思いました。
Cloud Run から AlloyDB に接続するために、Cloud Run サービスエージェントに共有 VPC のサブネットへアクセスするロールも学べてよかったです。
これらを通して、Direct VPC egress の概要を理解することができました。
ぜひ一度試してみてください。

Discussion