BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【GCP】プライベートなVPCにあるインスタンスからgcloud CLIコマンドを使う方法

こんにちは!
BFT名古屋支店の佐野です。

最近はGCPと「仲良く」なるために調査と試行を繰り返しています。
前回の記事ではGCEインスタンスをCloudFunctionsを使って起動、停止する方法をお話ししましたが、今回はその続きとも言えるお話です。

なお、前回の記事はこちらからどうぞ!

bftnagoya.hateblo.jp


はじめに:やりたいことと課題

前回はネットワークの通信制御を特に考えず、インターネットからテスト環境に容易にアクセスできる状態になっていました。
実際の環境ではそのような状態は滅多にありません。インターネットからの通信、そしてGCP環境からインターネットに向かう通信も遮断したいというケースが多いです。
そういった環境からCloudFunctionsのキック、あるいは他のインスタンスの起動や停止などCloud APIsを利用した操作を行ないたい場合は以下のような構成になります。

しかしCloud APIsへのアクセスにはHTTPSを使い、インターネットを介する形で行なわれるのが通常です。
この構成ではインターネットへの出口を閉じていますのでCloud APIsへの通信は届かず、先に挙げた操作を行なえません。

では、ここからCloud APIsに向けて通信するにはどうすればよいか。
そういえばこんなシチュエーションがAWSの時もありました。その時は各サービス専用のエンドポイントを用意して、AWS内部のネットワークからAWSサービスとやりとりできるようにしていました。
同じクラウドサービスであるGCPでも、同じようなことができないでしょうか。


PrivateServiceConnectを活用する

VPC内に設置できるプライベートなエンドポイントを作成できるサービスとして、GCPではPrivateServiceConnectが提供されています。
PrivateServiceConnectで作成したエンドポイントを経由すれば、通信をインターネットに出さずGoogle Cloud内のみに留めつつCloud APIsを利用できます。

この構成をするにはもちろんPrivateServiceConnectが必要となりますが、その他PrivateServiceConnectを利用するための設定も行なわなければなりません。
その設定内容を順を追って説明します。

PrivateServiceConnectエンドポイントの作成

まずはCloud APIsへの通信の出口となるPrivateServiceConnectエンドポイントを作成します。
PrivateServiceConnectエンドポイントはネットワークサービスコンソール内、PrivateServiceConnectの「エンドポイントの接続」から作成できます。

作成時にはエンドポイントを経由して接続する先の対象、エンドポイント名、エンドポイントを配置するVPCネットワークとIPアドレスを指定します。
またこの VPC ネットワークでService Directoryリージョンをまだ構成していない場合は、使用するリージョンも選択します。
今回は例として以下の通りに作成しました。

なお新しくIPアドレスを作成したい場合は、このタイミングで「IPアドレスの作成」に入って作成できます。

DNS設定

PrivateServiceConnectエンドポイントを作成したので、これでインターネットに出られなくともCloud APIsへの通信ができる!と思いきやそうはなりません。
そのままだとインスタンスはPrivateServiceConnectエンドポイントへの行き方を知らず、今まで通りインターネットを通じてCloud APIsへ行こうとしてしまいます。
そのため、PrivateServiceConnectエンドポイントを経由するようにDNS設定を行なう必要があります。

DNSの設定はネットワークサービスコンソール内、Cloud DNSから行なえます。

エンドポイントを作成した際に自動で作成されたDNSゾーンもありますが、これとは別に限定公開のDNSゾーンを以下のように作成します。

  1. DNS名:googleapis.comの限定公開のDNSゾーンを作成

  1. 1.で作成したゾーン内にDNS名:.googleapis.comでAレコードを作成

  1. 1.で作成したゾーン内にDNS名:*.googleapis.comでCNAMEレコードを作成

これを作成することで*.googleapis.comに一致するリクエスト先に向けたリクエストがエンドポイントのIPアドレス(今回の場合は10.58.0.1)で解決されるようになり、
APIへエンドポイントを経由して通信できるようになります。


さいごに

今までAWSメインで動いていたため、AWSでは単純にエンドポイントを追加すればよいことが、GCPだとDNS設定で一手間加えなければいけないのが少しハマりどころでした。
またIPに関する制約がないのであれば、PrivateServiceConnectと同様のことが可能で無料なPrivateGoogleAccess(限定公開の Google アクセス)を利用した方が、ハマりどころも少なくよいかもしれません。
ということで今回はここまで。GCPの記事はこれからも続けていきますので、次のお話も楽しみにして頂ければ幸いです。