プライベート Cloud SQL インスタンス作成時のお作法～実際にハマったポイントを含めて～

# はじめに

本記事は[NI+C Advent Calendar 2021](https://qiita.com/advent-calendar/2021/niandc_teamgcp)の11日目の記事となります。
昨日に引き続き記載させてもらいます。

GCPの好きなところに、直感的にサービスを作成できるところがあります。例えばGCEであれば、画面上のコンポーネントもなんとなく何をするかといったことがわかるため、GCP初めての方にも問題なく作成できると思います。

しかしやっぱりそうはいかないサービスもあります。
今回はプライベート Cloud SQL インスタンスの作成方法に関して記載します。個人的にですが作成時になかかなハマってしまいやらかした経験がありますので、その内容も含めながら手順を記載します。
プライベート Cloud SQL インスタンスを作成したことがない人が同じ轍を踏まないような記事であれば嬉しいです。

# プライベート Cloud SQL インスタンスの作成手順

「普通にCloud SQLのプライベートIPアドレスを設定するだけだがそんなに難しいのか」と思うかもしれませんが、Cloud SQLのプライベートIPアドレスの設定はGCEを作成する場合とは少し違ってきます。

## 参考：GCEとCloud SQLの違い

GCEの場合は作成するリージョンとVPCを指定後、条件にあったサブネットが表示されます。
例えばVPC「default」でasia-northeast1に作成する場合、下記画像のように `10.146.0.0/20` が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/c69171af-b23d-663f-2b09-85c1bce7434b.png)

Cloud SQLの場合は、サブネットワークが表示されず、「プライベート サービス アクセス接続は必須です」といったよう文章が表示されます。またIPアドレスの表記もありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/30875e22-4fde-5921-c491-162ef8cdf23e.png)

GCEとCloud SQLのプライベートIP設定時の表記が違うのは、Cloud SQLがプライベートIPアドレスを指定する際にプライベートサービスアクセスの設定が必要となるからです。
プライベートサービスアクセスに関しては[公式ドキュメント](https://cloud.google.com/vpc/docs/private-services-access)にも記載がありますが、内部NWの設定が必要となります。

>プライベート サービス アクセスには、まず内部 IP アドレス範囲を割り振ってプライベート接続を作成する必要があります。割り当て範囲は、ローカル VPC ネットワークでは使用できない予約済みの CIDR ブロックです。これはサービス プロデューサー用に確保されていて、VPC ネットワークとサービス プロデューサーの VPC ネットワークの重複を防ぎます。プライベート接続を作成するときは、割り当てを指定する必要があります。
>1 つのサービス プロデューサーで複数のサービスを提供する場合でも、必要なプライベート接続は 1 つのみです。プライベート接続を作成するときは、Service Networking API を使用します。ただし、Google Cloud はこの接続を VPC ネットワークとサービス プロデューサーの VPC ネットワーク間の VPC ネットワーク ピアリング接続として実装します。たとえば、VPC ネットワークではこの接続はピアリング接続として表示され、プライベート接続を削除するには、ピアリング接続を削除する必要があります。

イメージとしては下記のような図となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/928eef6b-b8c8-2a9c-21d8-6c36061c8ccd.png)


わかりやすく言うと、プライベートIPアドレスを持つCloud SQLを作成する際には、VPCのサブネットとは別に何かしらのプライベートNWを作成する必要があるということです。
プロジェクト作成時にはこのプライベートサービスアクセスの設定がされていないため、ユーザ自身で設定する必要があります。
ここでやらかしポイントがでてきます。

## やらかしポイント1 : Cloud SQLのプライベートIPアドレスの概要が把握できていなかった

上で記載していた内容を把握できていなかったことがやらかしポイントの1つ目です。
その時の状況は以下の通りです。

- プライベート Cloud SQL インスタンス作成時にはプロジェクト内でプライベートサービスアクセスの設定がされていない
- 作業アカウントのIAMにはCloud SQLの権限しか付与しておらず、Project IAM編集者といったIAM変更権限も持っていない
- 権限付与に関しては依頼が必要となり時間がかかる

作業を行うために権限付与をするか、権限を持っている人に作業をやってもらうかといったこととなり、ここで出鼻をくじかれます。

## 手順1.プライベートサービスアクセスの設定

プライベートサービスアクセスの設定を行います。
まずはAPIとサービスより、 `Service Networking API` を選択し有効化を実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/d6624b0b-14f5-72e1-ab45-981dc766d58f.png)

有効化実施後、Cloud SQLの画面に戻り更新を行うと、表示される画像が変わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/e1599814-ee97-8823-69b1-a1dbf2181489.png)

※IAM権限でネットワーク管理者権限が付与されていないアカウントで確認すると以下のような画面が表示されるため、権限を付与してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/5db4efa2-1ee0-f995-8e08-078347f07a24.png)

Cloud SQLの画面からそのままプライベートサービスアクセスの設定も可能となります。
今回はVPCから設定を行う方法を記載します。Cloud SQLでも画面が少し違いますがやることは一緒です。

※参考：Cloud SQL上での画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/bd944c05-e1f3-399f-d832-614ef2b28079.png)

左上のナビゲーションメニューより、「VPCネットワーク」→「【VPC名】」を選択→詳細画面より「プライベートサービス接続」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/1d466093-9a2d-b31a-d805-3572955b9632.png)

画面上にある「IP範囲の割り当て」を選択すると、次の画像の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/32f54ece-b524-c215-f9d5-c31c7c5319d6.png)

名前は必須事項ですが、IP範囲に関しては変わってきます。
カスタムを指定すると、ユーザが指定したIPアドレス範囲を設定できます。ただし、 `既にサービスで定義しているIPアドレス` の利用はできません。VPCで定義している、他サービスでプライベートIPの作成を行っている場合はIPアドレスがバッティングするため設定できません。

今回はテスト用として、 `192.168.100.0/24` の範囲で作成を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/1942f4e4-1ea4-523a-cdc8-f71a41c2ebc3.png)

割り振りを適用することで作成ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/6f4967cc-7e3d-9f03-7fda-5b5e2feffa88.png)

ここで重要なのが、サービスの接続名に何も表示されていないことです。
今の段階では「プライベートネットワーク接続用のIPアドレスを用意したが、まだ設定されていない」状態です。
IPアドレスを紐付けるために、画像右側のタブにある「サービスへのプライベート接続」を選択し、プライベート接続作成を行います。

画面にある「接続を作成」ボタンを選択するとプライベートサービス接続の作成ウィンドウが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/6d8f9755-405b-eb87-2eb9-a10e05763385.png)

割り当て欄より先ほど作成したIPアドレスの割当が可能となるため選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/5614b762-aa1a-4962-2bcb-371b4c051c0f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/1aba6869-aa24-b5ce-6a20-e635f01f819d.png)

問題ない場合そのまま接続を選択します。作成には5分程度時間がかかりますが、成功すると「プライベート接続を作成しました」と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/74423d5f-2699-d5b8-86e1-86521adb8048.png)

サービスに割り当てられたIP範囲を選択すると、先程空白だった部分に値が入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/8e824ba4-8c37-e55c-b0cb-adb2af043fbd.png)

これでプライベートサービスアクセスの設定が完了しました。

ここでCloud SQLの画面に移動し更新します。
同じようにプライベートIPを選択すると、画面が変更され「プライベートサービスアクセス接続が正常に作成されました」といった表示がされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/36a06a68-b217-ece6-7469-1d03ae65e25f.png)

このまま作成を行ってみます。

## 手順2.プライベート Cloud SQL インスタンスの作成

ここまで来ると通常のCloud SQLと同じように作成が可能となります。
今回はパブリックIPアドレスを付与せずに作成するため、パブリックIPのチェックボックを外しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/0b067613-ed3e-7487-bc7a-3ef31b3a0c8a.png)


それ以外の必要なパラメータを設定後、画面下部にある「インスタンスを作成」を選択して作成します。

作成に10分程度かかりますが、無事作成ができました。プライベートIPも存在しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/c69baf76-b45e-d6e7-ac97-15faefda9217.png)


作成されたCloud SQLを確認すると、プライベートサービスアクセス内のIPアドレスが自動割り当てされています。このプライベートIPアドレスに関してはユーザ自身は設定できないです。[公式ドキュメント](https://cloud.google.com/sql/docs/mysql/private-ip)にも以下の記載があります

>サブネットの IP アドレス範囲は通常、/24 CIDR ブロックです。これはサービスによって選択されるもので、割り振られた IP アドレス範囲から取得されます。

つまり、ユーザ自身はCloud SQLインスタンスを作成するまで、どのIPアドレスが適用されるかが確認できません。またCloud SQLの画面上からは、先程のプライベートサービスアクセス設定でどのような手順を行ったかがわかりません。
ここで2つ目のやらかしポイントが発生します。

## やらかしポイント2 : Cloud SQLのプライベートIPアドレスが想定と違っていた

これ以降は通常のCloud SQL作成と同じ手順となりますが、どのIPアドレスが適用されるかはプライベートサービスアクセスの設定を確認していない場合、作成してからでないとわからないです。

先程のやらかし1の段階で、プライベートサービスアクセス作成依頼を行いました。

その際、IPアドレスの指定の話が抜けており、担当者はIPアドレス割り当てを自動で作成しました。
その結果として全く意図しないIPアドレスが作成されました。ちなみにプライベートサービスアクセスのIPアドレス変更は画面上からできずコマンドベースとなります。

結果として担当者とはメールでやり取りをしていため、日程調整を行い画面共有を行いながらコマンドベースで対応することとなりスケジュールやらなんやらの影響が出てしまいました。

# 最後に

やらかしポイントを交えながらプライベート Cloud SQL インスタンス作成方法を記載しました。
自分と同じやらかしをする人が減ることを祈っております。
アドベントカレンダーは25日まで続きますので、ぜひ他の方の記事も閲覧ください！