Cloud SQLでのSQLServerの接続方法【GCPコンソール】

メモ :bookmark_tabs:

## 実行環境
- Windows10
- コマンドプロンプト

## 1. インスタンスの作成
請求先アカウントを設定後、[インスタンスを作成]をクリック

<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/fe608d62-d4e5-e152-ca86-f6b51d10f325.png">

[SQLServerを選択]をクリック

<img width="700px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/2ec3b3ae-2af5-28a1-5871-2f2a5ca8395c.png">

`Compute Engine API`が有効になっていない場合、[APIを有効にする]をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/2cef13c8-2b50-ab19-25be-c0abf76bab33.png)

インスタンスの情報を入力

:::note info
インスタンスIDは、小文字、数字、ハイフンのみ使用できます
:::

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/b1c9b904-5bfc-6c16-d581-6315a63a5f21.png">

最初に使用する構成の選択には、今回はテストなので「開発環境」を選択

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/7bcabf52-b787-7b14-6dcc-2c0e2bd8b85f.png">

リージョンとゾーンの可用性の選択
リージョンは変更できないので使用する地域に近い場所に設定する

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/52f757c0-59e2-ca6a-72f8-ed11b77dcd48.png">

インタンスのカスタマイズ

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/433ec510-fe81-656f-0351-348829631e95.png">

インスタンスのカスタマイズを完了後、[インスタンスを作成]をクリック

<img width="200px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/7060deb8-5f71-cdce-a8d6-babf277a14f8.png">

インスタンス作成には時間が掛かるので、ここで一息
:tea:

インスタンスの作成が完了すると、以下のようにインスタンスの画面が確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/0a368e4c-fe91-f914-78ce-a52c27b8db82.png)

## 2. インスタンスに接続する

- `Cloud SQL Auth Proxy`は、`IAM`権限を用いて接続を認証するため、最も安全な接続方法
- 受信接続をリッスンして`SSL/TLS`でラップし、`Cloud SQL`インスタンスに渡す中間サーバーとして機能する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/807e26a2-2fdb-ea82-4db6-f5e9f05099ad.png)
[Cloud SQL Auth Proxy について](https://cloud.google.com/sql/docs/sqlserver/sql-proxy?hl=ja)より引用

https://cloud.google.com/sql/docs/sqlserver/sql-proxy?hl=ja

`Cloud SQL Auth Proxy`を利用するには、`Cloud SQL Admin API`を有効にする必要がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/e478b1ea-c69e-14fe-4dac-5ea471a5b58b.png)

ここから`Gcloud CLI`を使用するため、インストール

https://cloud.google.com/sdk/gcloud?hl=ja

インストール後に確認
```bash
gcloud --version

Google Cloud SDK 467.0.0
bq 2.0.101
core 2024.02.29
gcloud-crc32c 1.0.0
gsutil 5.27
```

`GCP`の操作には、ログイン後、プロジェクトの選択が必要となる
```bash
gcloud auth login

gcloud config set project PROJECT_ID
```


`gcloud components list`コマンドでインストールされているツールを確認する
```
gcloud components list

Your current Google Cloud CLI version is: 467.0.0
The latest available version is: 467.0.0

┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                                    Components                                                   │
├───────────────┬──────────────────────────────────────────────────────┬──────────────────────────────┬───────────┤
│     Status    │                         Name                         │              ID              │    Size   │
├───────────────┼──────────────────────────────────────────────────────┼──────────────────────────────┼───────────┤
│ Not Installed │ App Engine Go Extensions                             │ app-engine-go                │   4.8 MiB │
│ Not Installed │ Appctl                                               │ appctl                       │  18.7 MiB │
│ Not Installed │ Artifact Registry Go Module Package Helper           │ package-go-module            │   < 1 MiB │
│ Not Installed │ Cloud Bigtable Command Line Tool                     │ cbt                          │  16.6 MiB │
│ Not Installed │ Cloud Bigtable Emulator                              │ bigtable                     │   7.1 MiB │
│ Not Installed │ Cloud Datastore Emulator                             │ cloud-datastore-emulator     │  36.2 MiB │
│ Not Installed │ Cloud Firestore Emulator                             │ cloud-firestore-emulator     │  44.4 MiB │
│ Not Installed │ Cloud Pub/Sub Emulator                               │ pubsub-emulator              │  63.3 MiB │
│ Not Installed │ Cloud Run Proxy                                      │ cloud-run-proxy              │  11.9 MiB │
│ Not Installed │ Cloud SQL Proxy                                      │ cloud_sql_proxy              │   7.4 MiB │
│ Not Installed │ Google Container Registry's Docker credential helper │ docker-credential-gcr        │   1.8 MiB │
│ Not Installed │ Log Streaming                                        │ log-streaming                │  12.4 MiB │
│ Not Installed │ Minikube                                             │ minikube                     │  35.5 MiB │
│ Not Installed │ Skaffold                                             │ skaffold                     │  23.9 MiB │
│ Not Installed │ Terraform Tools                                      │ terraform-tools              │  66.2 MiB │
│ Not Installed │ anthos-auth                                          │ anthos-auth                  │  22.0 MiB │
│ Not Installed │ config-connector                                     │ config-connector             │  56.9 MiB │
│ Not Installed │ enterprise-certificate-proxy                         │ enterprise-certificate-proxy │   6.5 MiB │
│ Not Installed │ gcloud Alpha Commands                                │ alpha                        │   < 1 MiB │
│ Not Installed │ gcloud Beta Commands                                 │ beta                         │   < 1 MiB │
│ Not Installed │ gcloud app Java Extensions                           │ app-engine-java              │ 125.9 MiB │
│ Not Installed │ gcloud app PHP Extensions                            │ app-engine-php               │  19.1 MiB │
│ Not Installed │ gcloud app Python Extensions                         │ app-engine-python            │   8.4 MiB │
│ Not Installed │ gcloud app Python Extensions (Extra Libraries)       │ app-engine-python-extras     │  31.5 MiB │
│ Not Installed │ gke-gcloud-auth-plugin                               │ gke-gcloud-auth-plugin       │   8.1 MiB │
│ Not Installed │ kubectl                                              │ kubectl                      │   < 1 MiB │
│ Not Installed │ kubectl-oidc                                         │ kubectl-oidc                 │  22.0 MiB │
│ Not Installed │ pkg                                                  │ pkg                          │           │
│ Installed     │ BigQuery Command Line Tool                           │ bq                           │   1.6 MiB │
│ Installed     │ Cloud Storage Command Line Tool                      │ gsutil                       │  11.3 MiB │
│ Installed     │ Google Cloud CLI Core Libraries                      │ core                         │  22.8 MiB │
│ Installed     │ Google Cloud CRC32C Hash Tool                        │ gcloud-crc32c                │   1.3 MiB │
└───────────────┴──────────────────────────────────────────────────────┴──────────────────────────────┴───────────┘
To install or remove components at your current SDK version [467.0.0], run:
  $ gcloud components install COMPONENT_ID
  $ gcloud components remove COMPONENT_ID

To update your SDK installation to the latest version [467.0.0], run:
  $ gcloud components update
```

`Cloud SQL Proxy `がインストールされていなければ、
`gcloud components install {components_name}`を実行
```bash
gcloud components install cloud_sql_proxy
```

インストール完了
```
Your current Google Cloud CLI version is: 467.0.0
Installing components from version: 467.0.0

┌─────────────────────────────────────────────────────────────────────────┐
│                   These components will be installed.                   │
├─────────────────────────────┬─────────────────────┬─────────────────────┤
│             Name            │       Version       │         Size        │
├─────────────────────────────┼─────────────────────┼─────────────────────┤
│ Cloud SQL Proxy             │              1.27.0 │             7.4 MiB │
└─────────────────────────────┴─────────────────────┴─────────────────────┘

For the latest full release notes, please visit:
  https://cloud.google.com/sdk/release_notes

Do you want to continue (Y/n)?  y

╔════════════════════════════════════════════════════════════╗
╠═ Creating update staging area                             ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud SQL Proxy                              ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud SQL Proxy                              ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Creating backup and activating new installation          ═╣
╚════════════════════════════════════════════════════════════╝

Performing post processing steps...done.

Update done!
```

インストール後に確認
```bash
cloud_sql_proxy --version

Cloud SQL Auth proxy: 1.27.0+windows.amd64
```

接続名を指定して`cloud-sql-proxy`を実行
```powershell
.\cloud-sql-proxy.exe INSTANCE_CONNECTION_NAME
```

<details>
<summary>躓きポイント :ghost:</summary>
公式ドキュメントの`.\cloud-sql-proxy.exe`はLinuxベースの環境での方法なので実行できない :skull:
実行ファイルを直接指定するか、環境変数などを利用する

```bash
"C:\Users\xxx\AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\cloud_sql_proxy.exe" -instances=trans-run-277920:asia-northeast1:gcp-express2022=tcp:3306
```

指定したポートが間違っている場合、以下のようなエラーとなった :skull:
```bash
"C:\Users\xxx\AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\cloud_sql_proxy.exe" -instances=trans-run-277920:asia-northeast1:gcp-express2022=tcp:1433

2024/03/08 06:03:47 listen tcp 127.0.0.1:1433: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
```

インスタンス名の指定方法が間違っている場合、以下のようなエラーとなった :skull:

```bash
"C:\Users\xxx\AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\cloud_sql_proxy.exe" -instances=trans-run-277920:asia-northeast1:gcp-express2022

2024/03/08 06:00:09 errors parsing config:
        invalid "trans-run-277920:asia-northeast1:gcp-express2022": unsupported network: unix
```
</details>

接続に成功すると、以下のようなメッセージが表示される
```bash
2024/03/08 06:04:37 Listening on 127.0.0.1:3306 for trans-run-277920:asia-northeast1:gcp-express2022
2024/03/08 06:04:37 Ready for new connections
2024/03/08 06:04:38 Generated RSA key in 131.2661ms
```
SQLServer Management Stduio からも接続できました :wink:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/8f99a573-d5a0-9910-b641-1bbee6c42064.png)


## Reference
- [Cloud SQL for SQL Server](https://cloud.google.com/sql/sqlserver?hl=ja)
- [接続オプションについて](https://cloud.google.com/sql/docs/sqlserver/connect-overview?hl=ja)
- [Cloud SQL Auth Proxy について](https://cloud.google.com/sql/docs/sqlserver/sql-proxy?hl=ja)
- [Google Cloud CLIをインストールする](https://cloud.google.com/sdk/docs/install-sdk?hl=ja)