Azureからインターネットを通さずにBigQueryにリクエストを投げたくてVPNトンネル経由でGCPのエンドポイントを叩ける環境を構築した。
(PSC:Private Service Connect)
AWSのDirect Connect、GCPのCloud Interconnect,Azure Express Routeに代表される閉域網でも同様の構成を実現可能だ。
試したこと
- Azureからインターネットを通さずVPN経由でBigQueryにアクセスする
- AzureからCloud DNSでGCP PSCエンドポイントのゾーンを解決する
Azure vNetからの名前解決
PSCを作成すると、*.p.googleapis.comに対応するプライベートゾーンがCloud DNSに作成される。このゾーンはPSCに紐づけるサービスディレクトリにより管理され、PSCに対応するGCPサービスのサブドメインとPSCエンドポイント名を結合したレコードセットが自動的に登録される。平たく言うとstorage-psc.p.googleapis.comだったり、bigquery-psc.p.gogleapis.comといったサブドメインがゾーンに自動作成され、VPC外のホストはその名前をPSCの内部IPアドレスに解決することでインターネットに出ずにGCPのマネージドサービスを使える仕組みだ。
また、新しいサービスがGCPに追加されたときもプライベートゾーンへ対応するサブドメインが自動追加され、ユーザーはなにもせずともプライベートサービスコネクト経由で新しいサービスにアクセスできるようになる。
PSCエンドポイント名前解決の流れ
- Azure vNetのアプリケーションからBigQueryにリクエスト(REST API)を実行
- アプリケーションからAzure vNetに構成されたDNSサーバーへbigquery-psc.p.googleapis.comの名前を問い合わせ
- DNSサーバーは自身のForwarding Ruleに基づきCloud DNSの受信ポリシーエンドポイント(10.128.0.3)にDNSクエリを転送
- GCP上のCloud DNSの受信ポリシーエンドポイント(10.128.0.3)がバックエンドの*.googleapis.comゾーンのレコードセットを参照
- bigquery-psc.p.googleapis.comに対応するPSCエンドポイントのIPアドレス(10.128.0.2)をAzure上のIaaS DNSサーバーに回答
- Azure上のIaaS DNSサーバーがアプリケーションにPSCエンドポイントのIPアドレス(10.128.0.2)を回答
- アプリケーションがPSCエンドポイント(10.128.0.2)経由でBigQueryにリクエストを送信
*.p.googleapis.comゾーンの自動更新
新しいGCPサービスがリリースされたり、既存のサービスがリタイアした場合でも利用者が明示的に*.p.googleapis.comゾーンに対応するDNSレコードセットをメンテナンスする必要はない。
- Google Cloud Platformにサービスのアップデートが発生(例えば新サービスのリリース)
- Service DirectoryがGCPからアップデートを受け取る
- Service Directoryの紐づくCloud DNSプライベートゾーン(*.p.googleapis.com)に新サービスのエントリが自動で追加される
プライベートDNSゾーン自動構成に必要となるAPI
PSCエンドポイント作成の前にCloud DNS APIを先に有効化しておく必要がある。有効化よりも前にPSCを作成するとプライベートDNSゾーンは構成されなかった
BigQueryとアプリケーション間の通信
この構成ではBigQueryへのアクセスはPSCエンドポイントを通じてインターネットに出ずに完結する。
データアクセスパス
- アプリケーションがBigQueryに対応するPSCエンドポイント(bigquery-psc.p.googleapis.com)のIPを得る
- アプリケーションがPSCエンドポイントにREST APIを投げる
- REST APIがPSCでアドレス変換(NAT)されBigQueryに到達する
PSCエンドポイント経由のBigQueryアクセス
AzureでBQコマンドの実行
Azure VMからBigQueryの編集者ロールを持つサービスアカウントでクエリを実行するとPSCエンドポイント経由でデータセットからレコードが得られた。
$ bq --api https://bigquery-psc.p.googleapis.com query --nouse_legacy_sql "SELECT timestamp,vacancy from cloudibledotjp.test.room_vacancy"
+---------------------+---------+
| timestamp | vacancy |
+---------------------+---------+
| 2019-05-02 12:48:35 | true |
| 2019-05-03 12:49:31 | true |
+---------------------+---------+
BigQueryのログ
GCPのCloud Loggingを確認すると、たしかにAzure vNetの範囲からBigQueryへアクセスがあったことがわかる。
送信元 | クエリ |
---|---|
"callerIp": "172.16.0.2" | "query": "SELECT timestamp,vacancy from cloudibledotjp.test.room_vacancy" |
{
//リクエスト ぺイロード
"requestMetadata": {
"callerIp": "172.16.0.2",
"callerSuppliedUserAgent": "(gzip),gzip(gfe)",
//////////////
"jobConfiguration": {
"query": {
"query": "SELECT timestamp,vacancy from cloudibledotjp.test.room_vacancy",
//////////////
}
あとがき
GCPではPSCエンドポイントを名前解決するためのCloud DNS受信エンドポイントをIaaS不要で構成できるので気軽に別のクラウドやオンプレミスサイトからプライベートにGCPのマネージドサービスへアクセスさせることができる。
なお、PSCエンドポイントはグローバルリソースであり、VPC上のすべてのリージョンから共有できるメリットがありつつも、AzureやAWSと異なりエンドポイントを既存VPCサブネットの範囲に収めることができずはみ出てしまう点については従来の感覚でIPを割り当てる組織では知っておいて損はないだろう。