初めての Private Service Connect #2 PSC for Google APIs 編

Takao Setaka
google-cloud-jp
Published in
15 min readFeb 8, 2022

これは3回シリーズで Private Service Connect について解説する Blog の第2回となります。前回の Blog をまだお読みでない方は是非そちらから御覧ください。

前回は、Private Service Connect (PSC) の概要やメリットについてまとめましたが、第2回となる今回は PSC 利用パターンの1つ目として、PSC for Google APIs 構成について、実際に構成手順を含めて解説していきたいと思います。PSC for Google APIs を構成することで、 VPC 範囲内の VM インスタンス等からプライベート通信のみで「Cloud Storage や Cloud Run などのVPC 内に内部 IP アドレスで配置することはできない様々な Google API を利用するサービス」の利用が可能となります。

Google API への PSC を用いた接続

以下の手順を進める前に API の有効化など必要となる前提要件があります。詳細はこちらを参照ください

Google API に対する接続に PSC を用いる場合には、Consumer 側の構成のみ、つまりは PSC Endpoint の構成のみを行います。紐付けることができる Google API は、ほぼ全ての Google API (all-apis、private.googleapis.com ※と同じ) もしくは VPC Service Controls がサポートする範囲の Google API (vpc-sc、restricted.googleapis.com ※と同じ) のいずれかを選択することができます。

※ private.googleapis.com および restrict.googleapis.com の詳細については、こちらのドメインオプションについてのガイドを参照ください。

PSC for Google APIs 概略図

PSC Endpoint の構成は、Cloud Console や gcloud コマンドなどでおこなうことができます(構成を行うアカウントに必要なロールについてはこちらを参照してください)。以下では、Google API に紐付ける PSC Endpoint 用の IP アドレスとして、192.168.200.1 を指定した場合の例となります(psc-demo という名前で 192.168.200.1 を予約しています)。なお、PSC for Google APIs 構成のための Endpoint に対しては、VPC 範囲で構成済みの Subnet 範囲外の IP アドレスを割り当てる必要があります。

PSC for Google APIs 構成例

[エンドポイントの追加] をクリックすると、PSC for Google APIs 用のエンドポイントが指定されたパラメータに基づいて作成されます。

作成された PSC for Google APIs 用エンドポイントの例

PSC 作成の前提となる事項についてはこちらを参照してください。特に、PSC Endpoint を通じて Google API に接続する「外部IPアドレスを持たない」インスタンスは限定公開の Google アクセスが有効となっているサブネットへの接続が必要になる点に注意してください。

PSC for Google APIs の構成は以上で完了です!…ですが、クライアントがここで作成した PSC Endpoint を通じて Google API のサービスを利用するようにするためには、各種クライアントが Google API に対する接続先として作成された PSC Endpoint を利用するように DNS 構成を変更する必要があります。そのための方法としては以下の二種類があります。

  1. 新しい API エンドポイント名(*.p.googleapis.com)へアクセスするよう設定する
  2. 既定の API エンドポイント名が PSC Endpoint へ向くように変更する

ここからは、それぞれの方法の構成例について解説します。

1. 新しい API エンドポイント名(*.p.googleapis.com)を利用する構成例

作成した PSC Endpoint は自動的に Service Directory に登録されます(これにより、自動的に p.googleapis.com 限定公開ゾーンが Cloud DNS に構成されます)。既定で *.googleapis.com の URL で提供されている API に対しては、”SERVICE-ENDPOINT.p.googleapis.com” 形式の DNS レコードが作成されます。gcloud コマンドや各種ライブラリを用いて PSC Endpoint で割り当てられた URL を使用して API にアクセスしたい場合には、各ガイドを参照してください(gcloud コマンドの場合、gcloud config set api_endpoint_overrides を使用します)。

今回の構成例では、Cloud Storage の API に対するアクセスに対しては、”storage-pscendpoint.p.googleapis.com” が構成されており、紐づく IP アドレスとしては Endpoint として構成した 192.168.200.1 となっていることを確認します。

~ $ nslookup storage-pscendpoint.p.googleapis.com
Server: 169.254.169.254
Address: 169.254.169.254#53
Non-authoritative answer:
Name: storage-pscendpoint.p.googleapis.com
Address: 192.168.200.1

~ $

以下は、gcloud コマンドで storage.googleapis.com に対する接続先 API サービスエンドポイントを PSC Endpoint に紐づく storage-pscendpoint.p.googleapis.com に修正した上で Cloud Storage に対して接続してみた例となります。

gcloud storage コマンドは 2022 年 2 月時点ではアルファリリース段階です。今後の仕様変更の可能性や、利用に際してのサポートは提供されないなどの制限がありますので、本番環境に対しての利用は推奨しません。

~ $ gcloud config set api_endpoint_overrides/storage https://storage-pscendpoint.p.googleapis.com/storage/v1/
Updated property [api_endpoint_overrides/storage].
~ $
~ $ gcloud alpha storage ls -l gs://setaka-psc-demo-bucket1
132907 2022–01–20T05:12:17Z gs://setaka-psc-demo-bucket1/kitten.png
TOTAL: 1 objects, 132907 bytes (129.79kiB)
~ $

このように、クライアント側で Google API に紐づく URL 情報を上書きで更新することにより、PSC Endpoint を通じた Google API へのアクセスが可能です。

2. 既定の API エンドポイント名が PSC Endpoint へ向くように変更する構成例

API アクセスのエンドポイントとして p.googleapis.com を使用できない場合や googleapis.com 以外の API を利用したい場合などでは、オプションとして Cloud DNS を構成することで既定の DNS 名での PSC Endpoint を通じた Google API アクセスを構成することも可能です。この場合には、Cloud DNS に対して既定の API URL に紐づく限定公開ゾーンを作成(googleapis.com や gcr.io など)頂いた上で、PSC Endpoint に紐づく A レコードを作成し、さらにアスタリスクを用いた CNAME で全てのゾーン内ホスト名に対する名前解決が PSC Endpoint に紐づく A レコードに結びつくように構成します。

以下は googleapis.com 限定公開ゾーンを作成し、PSC Endpoint に紐づく A レコードと全てのホスト名に紐付ける CNAME レコードを作成した例です。

Cloud DNS における googleapis.com ゾーンの構成例
Cloud DNS — googleapis.com に対する Aレコードは PSC Endpoint の IP アドレスに解決する
Cloud DNS — CNAME レコードで全ての *.googleapis.com 宛通信を PSC Endpoint に紐付ける

この様に構成することで、例えば gsutil を用いた Cloud Storage に対する操作を、PSC Endpoint を通じて行うことが可能となるなど、クライアント側の構成に手を入れることなく、PSC Endpoint を通じた Google API への接続が利用できるようになります。

まずインスタンスから、nslookup コマンド等で storage.googleapis.com の名前解決が PSC Endpoint に向けられていることを確認します。

~ $ nslookup googleapis.com
Server: 169.254.169.254
Address: 169.254.169.254#53
Non-authoritative answer:
Name: googleapis.com
Address: 192.168.200.1
~ $ nslookup storage.googleapis.com
Server: 169.254.169.254
Address: 169.254.169.254#53
Non-authoritative answer:
storage.googleapis.com canonical name = googleapis.com.
Name: googleapis.com
Address: 192.168.200.1
~ $

後は普通に gsutil コマンドを使用するだけです。

~ $ gsutil ls -l gs://setaka-psc-demo-bucket1
132907 2022–01–20T05:08:59Z gs://setaka-psc-demo-bucket1/kitten.png
TOTAL: 1 objects, 132907 bytes (129.79 KiB)
~ $
~ $ gsutil rm gs://setaka-psc-demo-bucket1/kitten.png
Removing gs://setaka-psc-demo-bucket1/kitten.png…
/ [1 objects]
Operation completed over 1 objects.
~ $
~ $ gsutil ls -l gs://setaka-psc-demo-bucket1
~ $
~ $ gsutil cp kitten.png gs://setaka-psc-demo-bucket1
Copying file://kitten.png [Content-Type=image/png]…
/ [1 files][129.8 KiB/129.8 KiB]
Operation completed over 1 objects/129.8 KiB.
~ $
~ $ gsutil ls -l gs://setaka-psc-demo-bucket1
132907 2022–01–20T05:12:17Z gs://setaka-psc-demo-bucket1/kitten.png
TOTAL: 1 objects, 132907 bytes (129.79 KiB)
~ $

Cloud Console からも状態を確認できます。

Cloud Storage の状態

念の為、gsutil コマンドを叩いている裏で tcpdump を用いて通信を確認してみましたが、問題なく PSC Endpoint を通じて storage.googleapis.com と通信している状況を確認することができました(以下、一部のみ抜粋、一部マスクあり)。

~$ sudo tcpdump dst port 443
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens4, link-type EN10MB (Ethernet), capture size 262144 bytes
09:13:17.931046 IP takao-ubuntu1.asia-northeast1-b.c.psc-demo-xxxxxx.internal.51566 > 192.168.200.1.https: Flags [.], ack 2454128337, win 501, options [nop,nop,TS val 1338980456 ecr 1430400521], length 0
09:13:18.699023 IP

Cloud VPN もしくは Cloud Interconnect を用いて接続されたオンプレミス側から PSC Endpoint を使用したい場合には、Cloud Router を通じて PSC Endpoint に対する経路を広報するためのカスタムルートのアドバタイズ構成が必要となります。構成手順の詳細についてはこちらを参照してください。

PSC for Google APIs では、PSC Endpoint を通じて利用可能な Google API の URL の中には Cloud Run のデフォルトドメインである *.run.app も含まれています。そのため、PSC を使って Cloud Run をプライベートな接続範囲のみで利用する環境を簡単に構成できます。こちらの構成手順については zenn のこちらの Blog 記事『オンプレから Cloud Run にプライベートな経路でアクセスする』を参考ください。

第2回のまとめ

今回の Blog で解説したように、セキュリティや様々な理由で VM インスタンス等に外部 IP アドレスを紐付けておらず、かつ Cloud NAT などを用いた外部接続を構成していない場合であっても、PSC for Google APIs の仕組みを利用することでこれらのクライアントからも Google API を通じて利用する数多くのサービスをプライベートな接続を通じて利用頂けるようになります。

PSC for Google APIs の場合はリージョンの制約などはありませんので、Consumer 側における PSC Endpoint を全世界で一つ作れば、どこからでも接続が可能です。また、Cloud VPN や Cloud Interconnect を通じて VPC に接続したオンプレミス環境からも経路情報を適切に構成頂くことでアクセスが可能です。ただし、複数のリージョンに紐づくオンプレミスからの接続がある場合には、適切な経路制御が必要です。

なお、PSC Endpoint に対する通信は、VPC の範囲を超えて利用することはできません。つまり、VPC ピアリング構成を併用している場合、異なる VPC から PSC Endpoint に対してアクセスすることはできませんのでご注意ください。しかし VPC ピアリングを構成している場合には、それぞれの VPC において PSC Endpoint を作成すれば良いだけですので、(VPC 毎に構成が必要となる手間以外には)この点が問題となることはあまりないでしょう。

次回、最終回となる第3回は、PSC for ILB 構成についての解説と全体のまとめとなります。お楽しみに!!

--

--

Takao Setaka
google-cloud-jp

Customer Engineer (Infrastructure Modernization) @GoogleCloud. All of my opinions are my own.