Private Service Connectを使ってGoogle APIへ安全に接続

記事タイトルとURLをコピーする

G-genの杉村です。

Google Cloud (GCP) をご利用であれば、 Google Compute Engine の VM やオンプレミスのサーバーから様々なサービスを利用すると思います。
アプリケーションのログを Cloud Logging に出力したり、安価なオブジェクトストレージである Cloud Storage にファイルをアップロードしたり、 BigQuery に役立つ情報を投入したり。

" 限定公開の Google アクセス "機能を使うと External IP を持っていない VM やオンプレミスのノードから、様々な Google API 群にアクセスできるようになります。

しかし "限定公開の Google アクセス" 機能だと 199.36.153.4/30 や 199.36.153.8/30 といった RFC 1918 (※) ではない IP アドレスを使う必要がある ため、 Cloud Interconnect や Cloud VPN 経由でオンプレミス環境から利用する際などに、ルーティングが複雑化するなど少し不便な場合がありました。
(※ 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 の範囲内にあるいわゆるプライベート IP アドレス)

限定公開の Google アクセス機能については、以下の解説記事をご参照ください。

blog.g-gen.co.jp

一方で Private Service Connect 機能を利用すれば、 VPC 内に IP アドレスを持つエンドポイントを作成し、このエンドポイント経由で Google API にアクセスできます。
このエンドポイントには任意の IP アドレスを割り当てることができ、 RFC 1918 で定義された IP アドレスでも、そうでなくても構いません。

概念や設定方法がすこし難しいので、解説を見ていきましょう。

概要

前提知識。 Google API とは

まず、前提知識の確認です。

Google Cloud サービスはほとんど全てが Web API により操作され ます (AWS など他のパブリッククラウドでも同様です) 。

VM の起動・停止も、 BigQuery のテーブルへのクエリも、 Cloud Storage のオブジェクトのアップロード/ダウンロードも、 Web API を通じて操作されます。
Web ブラウザでコンソールから操作しても、 gcloud コマンドラインから操作しても、 裏では Web API が HTTPS でコールされている のです。
(その認証・認可に使われるのが Google アカウントと IAM です。)

例えば Cloud Storage の Web API のエンドポイントは https://storage.googleapis.com/ であり BigQuery の API エンドポイントは https://bigquery.googleapis.com/ です。
これらの API エンドポイントはインターネットに公開されています。

なので、 VM から Cloud Storage や BigQuery を利用するときは External IP を使ってアクセスしないといけないし、オンプレミスサイトが例え Cloud Interconnect や Cloud VPN で VPC と接続されていても、 API へのアクセスはインターネット経由で行う必要があるわけですね。

Private Service Connect の概要

Private Service Connect の概要は以下です。

  • IP アドレスを割り当てられた Private Service Connect エンドポイントを作成する
    • オンプレミスのノードや VPC 内の VM はそれ経由で Google API へアクセスできる
  • エンドポイント作成時に以下の種類から選択する
    • 1.all-apis
    • 2.vpc-sc
  • エンドポイントには時間で料金が発生 (月およそ820円程度)

f:id:ggen-sugimura:20211010142006p:plain
イメージ

なお以下は本投稿では詳しく紹介しませんが、 Private Service Connect の機能として存在していますのでご参考までにご紹介します。

  • サービスプロデューサーとして他の Google Cloud 環境に対してサービスを公開できる機能 (詳細)
  • コンシューマ HTTP(S) サービス コントロール機能 (2021年10月現在、プレビュー) (詳細)

Private Service Connect vs Private Google Access

機能の違い

Private Service Connect に似たような機能として 限定公開の Google アクセス (Private Google Access) があります。

Private Service Connect でも 限定公開の Google アクセス 機能を有効化する必要がありますので、 Private Service Connect 機能は 限定公開の Google アクセス 機能の拡張版と考えることもできます。

これら2つの機能は、できることはほぼ同じですが、以下のような違いがあります。

  • 限定公開の Google アクセス機能では API エンドポイントとして利用する仮想 IP として 199.36.153.4/30199.36.153.8/30 といった RFC 1918 定義外の IP アドレスを使う必要がある
  • 限定公開の Google アクセス機能では デフォルトのドメイン名を使う場合に限り DNS の追加設定が不要で手軽に利用できる
    • しかしこのパターンでは 0.0.0.0/0 へのルートと Egress ファイアウォール設定を開ける必要がある
  • 限定公開の Google アクセス機能では料金が発生しない

どちらを使えばよいのか?

Private Service Connect vs 限定公開の Google アクセス ということになりますが、どのように判断したらよいでしょうか。

結論として以下となります。

  • 以下の全てに当てはまる場合は Private Service Connect を選択する
    • オンプレミスからのプライベートネットワーク経由での Google API 利用がある
    • 限定公開の Google アクセスで使われる 199.36.153.4/30 または 199.36.153.8/30 を使うにあたり、経路交換や経路制御で不都合がある
      • 例: オンプレミス側のクライアントによって異なる通信先 VPC や使用する回線を変えるため複数のエンドポイントを使用したい
      • 例: RFC 1918 以外の IP アドレスが広報されてくることが望ましくない
  • それ以外の場合は 限定公開の Google アクセス を選択する

利用する IP アドレスとして 199.36.153.4/30 または 199.36.153.8/30 が許容できる場合は、無償で利用できる限定公開の Google アクセスを選択するのがよいでしょう。

限定公開の Google アクセス機能については、以下の解説記事をご参照ください。

blog.g-gen.co.jp

設計ポイント・考慮点

エンドポイントの種類

エンドポイントの種類によって、アクセス可能な Google API が異なります。

all-apis の場合、 Google Cloud のほとんどのサービスや Google Map, Google 広告など多くのサービスへ接続することができます。

vpc-sc の場合、接続できるのは VPC Service Controls でサポートされているサービスだけです。

VPC Service Controls を使用しておらず将来的に使用する予定も全く無い場合は前者を選択。
VPC Service Controls を使用している / 使用する予定がある場合で、かつ VPC Service Controls がサポートしていないサービスへのアクセスが不要な場合は後者を利用するとよいでしょう。

エンドポイントの IP アドレス

Private Service Connect エンドポイント作成時には、1つの IP アドレスを割り当てます。
RFC 1918 アドレス (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) でもそうでなくても構いませんが、 IPv6 アドレスは使えません。

エンドポイントの IP アドレスは、 サブネットの IP アドレスとは重複できません
また、 VPC とネットワークピアリングや Cloud Interconnect, Cloud VPN 等で接続されているネットワークと重複してもいけません。

将来的な VPC サブネットの拡張などを考慮して、 重複が起きない、かつ IP リソースの無駄使いにならない ような IP アドレスを指定しましょう。

また、もしオンプレミス環境から Cloud Interconnect や Cloud VPN 経由で Private Service Connect エンドポイントを使いたい場合は、 Google Cloud から広報するルートの集約性を考慮して、 VPC サブネットの IP アドレス帯とある程度隣り合った IP アドレスにしたほうがよいでしょう。

DNS 設定

例えば Cloud Storage の Web API のエンドポイントは https://storage.googleapis.com/ であり BigQuery の API エンドポイントは https://bigquery.googleapis.com/ です。
これらの IP アドレスを名前解決すると、パブリック IP が返ってきます。

f:id:ggen-sugimura:20211010112213p:plain
storage.googleapis.comの名前解決の結果

これでは Private Service Connect エンドポイントを作ったとしても、 gcloud コマンドや gsutil コマンドといったクライアントはこれらのパブリック IP を目指してパケットを投げてしまいます。

そこで、以下のいずれかの方法で、クライアントが Private Service Connect エンドポイントを向くようにしてあげます。

  1. クライアント側の設定で Private Service Connect エンドポイントを参照するよう設定する
  2. DNS 設定で一律に Private Service Connect エンドポイントを向くように設定する

1の方法は、クライアント側で向き先のエンドポイントをデフォルトの storage.googleapis.com などから、 VPC 内の Private Service Connect エンドポイントへ変更する方法です。これで DNS 設定を変更することなく Private Service Connect エンドポイントを使うことができます。
手順は 公式ドキュメント を御覧ください。

2の方法は、 VM が参照する DNS のほうで *.googleapis.com に対する CNAME レコードを作成し、それを Private Service Connect エンドポイントの IP アドレスへ解決させることで、クライアント側の設定を変えることなく Private Service Connect エンドポイントを参照させる方法です。こちらは クライアント側の設定やプログラムのコードを変更することなく Private Service Connect エンドポイントを使うことができます。

本投稿では 2 の方法を扱っていきます。

設定手順

設定手順の概要

Private Service Connect の設定手順のおおまかな流れです。

  1. 必要な API を有効化
  2. Private Service Connect エンドポイントを作成 (コンソールリンク)
  3. 対象のサブネットで 限定公開の Google アクセスを有効化 (コンソールリンク)
  4. VPC ファイアウォールで エンドポイント IP アドレスへの 443/TCP の 下り (Egress) 通信が拒否されていない ことを確認 (デフォルト状態では許可) (コンソールリンク)
  5. Cloud DNS に googleapis.com という限定公開 DNS ゾーンを作成 (コンソールリンク)
  6. 同ゾーンに以下を追加
    • DNS名: googleapis.com
    • タイプ: A
    • IPv4アドレス: (エンドポイントの IP アドレス)
  7. 同ゾーンに以下を追加
    • DNS名: *.googleapis.com
    • タイプ: CNAME
    • 正規名: googleapis.com

DNS 設定の意味を解説

最後の DNS 設定について少し解説します。

例えば VM の中で gsutil コマンドを実行して Cloud Storage へのアクセスが発生したとしましょう。
gsutil コマンドは Web API コールをするために storage.googleapis.com へ HTTPS でアクセスしようとします。
すると VM はデフォルトでは Cloud DNS を参照していますから、限定公開ゾーンを優先的に使って名前解決をします。

クライアントの動作の流れを見てみましょう。

  1. VM が storage.googleapis.com を名前解決するため Cloud DNS へ DNS クエリする
  2. これは *.googleapis.com に一致しているので CNAME で googleapis.com へ解決される
  3. googleapis.com は A レコードで エンドポイントの IP アドレス に解決され VM へ返答
  4. gsutil コマンドはエンドポイントの IP アドレスへ Web API コールを実行

参考まで、 Cloud DNS でのレコード追加済みの画面と、実際に VM の中から名前解決を試みた結果を御覧ください。

f:id:ggen-sugimura:20211009181501p:plain
Cloud DNSでレコードが設定されている

f:id:ggen-sugimura:20211009181546p:plain
VMからCloud Storageを名前解決するとエンドポイントURLが返る

オンプレミスから利用する

Cloud Interconnect や Cloud DNS で接続されたオンプレミス環境から Private Service Connect エンドポイントを利用するには、以下の設定が必要です。

  • Private Service Connect エンドポイントの IP アドレスをオンプレミス側に広報する
  • オンプレミスノードが参照する DNS にフォワーダー設定を追加して、 Google API の名前解決を Cloud DNS に転送する

1つ目は Cloud Router の カスタムルート アドバタイズ を使うことで実現可能です。
2つ目は Cloud DNS の 受信サーバー ポリシー で実現可能です。

2つ目については、オンプレミスのクライアントが Private Service Connect エンドポイントに向けば良いので、オンプレミスノードが参照する DNS に直接 Cloud DNS と同じレコードを追加してもよいでしょう。
(ただし二重管理となってしまうため、理由がない限り望ましくありません。)

設定手順は 公式ドキュメント をご参照ください。

詳細な設定手順

本投稿では概念の説明がメインのため、手順は概要のみを説明しました。

より詳細な設定手順は、以下の公式ドキュメントをご参照ください。

cloud.google.com

杉村 勇馬 (記事一覧)

クラウドソリューション部 部長

クラウド管理運用やネットワークに知見あり。AWSの全12資格をコンプリートしたので、次はGoogle Cloudの認定資格を狙っている。現在、Google Cloud認定資格は3冠。

2021年12月現在、ハマっているものはマーベル (遅い)