Cloud SQL への接続: Compute Engine、プライベート IP、Cloud SQL Proxy

1. はじめに

最終更新日: 2021 年 5 月 6 日

接続について

世の中には、さまざまな種類のアプリケーションやフレームワークがあります。この Codelab では、Google Compute Engine のマネージド仮想マシンで実行しているアプリケーションから、Cloud SQL Proxy を使用して内部プライベート IP アドレスを経由して Cloud SQL に接続する方法を学習します。これは、クラウドでステートフル アプリケーションを実行する非常に安全な方法です。プライベート IP のみを使用するように制限し、SSL 接続を処理する SQL Proxy を使用することで、インターネットへの露出を最小限に抑えることができます。

一般的なユースケースの 1 つは、たとえば、オンプレミス アプリケーションをローカルではなくクラウドで実行できるようにシフトした場合です。

作成するアプリの概要

この Codelab は非常にシンプルです。接続ピースのナットとボルトについて説明するのが目的です。アプリケーション自体についてあまり深く考えずに、理想としては、Cloud SQL への接続は SQL データベースの他のインスタンスに接続するのと似ているため、この Codelab で作成したものを利用して、あらゆる本番環境アプリケーションに適用できるはずです。

この手順には、GCP コンソールでの作業手順だけでなく、CLI や自動化を使用する場合と同等の gcloud コマンドも含まれています。

個々のステップは次のとおりです。

  • Cloud SQL インスタンスへの接続を有効にする最小限のサービス アカウントを作成する
  • Google Compute Engine(GCE)で VM を作成する
  • Cloud SQL インスタンスを作成する(このチュートリアルでは Postgres を使用しますが、MySQL や SQL Server でも同じように機能します)
  • Cloud SQL Proxy をダウンロードして GCE インスタンスで実行する

必要なもの

  • API を有効にしてサービスを作成する権限を持つ GCP アカウント

2. サービス アカウントを作成する

サービス アカウントは、GCP プロジェクト内のさまざまなサービスを使用する権限を付与するために使用されます。この Codelab では、Cloud SQL インスタンスに接続する権限を Cloud SQL Proxy に付与するために必要です。

コンソール

IAM サービス アカウント ページに移動し、ページの上部にある [f8393a08b37a422c.png] ボタンをクリックします。

サービス アカウントに一意の名前と ID を付けて、[作成] をクリックします。

次のページのプルダウンで [ロール] をクリックします。「Cloud SQL」でフィルタし、Cloud SQL クライアントのロールを選択します。[続行] をクリックします。

[完了] をクリックします。

gcloud の使用

サービス アカウントを作成します。

gcloud iam service-accounts create <SERVICE_ACCOUNT_NAME> --display-name "<SERVICE_ACCOUNT_NAME> service account"

これによりサービス アカウントが作成されますが、この時点ではロールや権限が割り当てられていません。適切なロールを割り当てるには、次のコマンドを実行します。

gcloud projects add-iam-policy-binding <GCP PROJECT ID> --member serviceAccount:<SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com --role roles/cloudsql.client

例:サービス アカウントの作成時に sa-test という名前が付けられ、プロジェクトが my-project-test の場合、コマンドは次のようになります。

gcloud projects add-iam-policy-binding my-project-test --member serviceAccount:sa-test@my-project-test.iam.gserviceaccount.com --role roles/cloudsql.client
gcloud iam service-accounts keys create service-account.json --iam-account <SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com

3. Compute Engine VM の作成

Google Compute Engine は、接続元となるアプリケーションを保持する仮想マシンが実行されるマネージド サービスです。この Codelab ではアプリケーションを構築しませんが、psql を実行して接続を確認します。

コンソール

[Google Compute Engine] ページに移動し、[77c46cd1f51bed5c.png] ボタンをクリックします。

多くのオプションがありますが、その中で必要な作業は次のとおりです。

  1. インスタンスに名前を付ける
  2. Machine typef1-micro に変更します。
  3. [ID と API へのアクセス] で、[Service account] のプルダウンを [Default compute service account] から [前の手順で作成したもの] に変更します。
  4. ページの下部にある [作成] をクリックします。

gcloud の使用

サービス アカウントは、前に作成したサービス アカウントのフルネームになるため、<NAME>@<PROJECT>.iam.gserviceaccount.com という形式になります。

gcloud compute instances create <INSTANCE NAME> --machine-type=f1-micro --zone=us-central1-b --service-account=<SERVICE ACCOUNT FULL NAME>
gcloud compute zones list

4. Cloud SQL インスタンスの作成

Cloud SQL は、Google のマネージド リレーショナル データベース サービスです。MySQL、PostgreSQL、SQL Server をサポートしています。この Codelab では Postgres データベースを作成しますが、手順はどれもほぼ同じです。

コンソール

[Cloud SQL] ページに移動し、[241836b315e11bf5.png] ボタンをクリックします。

前述のように、この Codelab のほとんどはどの SQL フレーバーでも汎用的ですが、この Codelab では PostgreSQL を選択します。

  1. インスタンスに ID を付与する
  2. デフォルト ユーザーのパスワードを入力します(選択した DB のデフォルトがユーザー名になります。例: MySQL の場合は root、PostgreSQL の場合は postgres
  3. Compute インスタンスのリージョンを変更した場合は、それに合わせてリージョンも変更する必要があります。
  4. 下にスクロールして [show configuration options] をクリックします
  5. Connectivity セクションを開く
  6. Public IP のオプションをオフにし、Private IP チェックボックスをオンにします。
  7. プライベート IP をオンにしたときに表示されるプルダウンで default が選択されていることを確認します。
  8. 下にスクロールして [作成] をクリックします。

通常、インスタンスが起動するまでには数分かかります。

gcloud の使用

ここでは API を有効にするためのプロンプトはないため、手動で行う必要があります。

gcloud services enable servicenetworking.googleapis.com

次に、デフォルトの VPC ネットワークでプライベート サービス接続を有効にする必要があります。そのための最初のステップは、インスタンスに使用する名前付き IP アドレス範囲を割り振ることです。

gcloud compute addresses create sql-codelab-allocation --global --purpose=VPC_PEERING --prefix-length=24 --network=default

次は、その IP 範囲を内部サービスに割り当てます(これには 1 分ほどかかります)。

gcloud services vpc-peerings update --service=servicenetworking.googleapis.com  --network=default     --project=<PROJECT ID> --ranges=sql-codelab-allocation --force

最後に、インスタンス自体を作成できるのは、現時点ではベータ版です。--no-assign-ip--network=default を組み合わせることで、プライベート IP 接続が可能になります。現時点では、プライベート IP とパブリック IP の両方を同時に有効にする方法はありません。公開アクセスが必要な場合は、インスタンスの作成後に編集する必要があります。こちらは、完了するまでに数分かかります。

gcloud beta sql instances create test-sql-codelab-00 --no-assign-ip --database-version=POSTGRES_11 --tier=db-f1-micro --region=us-central1 --network=default --root-password=<PASSWORD>

5. Cloud SQL Proxy を設定して実行する

VM に接続したら、インスタンス接続文字列が必要になります。まずこれを取得してから、SSH で VM 自体に接続します。これらの手順については、コンソールと gcloud のそれぞれのセクションに記載しています。残りは、それぞれ別のセクションで VM 上のシェルから実行されるコマンドです。

コンソール

こちらにアクセスし、Cloud SQL インスタンスの名前をクリックします。

少し下にスクロールし、後で使用できるように Connection name をコピーします。

Google Compute Engine のインスタンスの一覧ページに移動して、該当する VM の行を探します。

[Connect] 列で [SSH] ボタンをクリックすると、仮想マシンに安全に接続する別のウィンドウが開きます。

どちらの手順も同様であるため、以降の手順は Using gcloud セクションを先に進めます。

gcloud の使用

<INSTANCE NAME> は、Cloud SQL インスタンスの名前に置き換えます。

gcloud sql instances describe <INSTANCE NAME> | grep connectionName

後で使用できるように、インスタンス接続名を保存します。

<ZONE> は、インスタンスの作成時に使用したゾーンに置き換える必要があります。変更しない場合は、us-central1-b に設定されています。<INSTANCE_NAME> も先ほど指定したものがそのまま使用されます。

gcloud compute ssh --zone <ZONE> <INSTANCE_NAME>

VM に接続後

まず、プロキシをダウンロードする必要があります。オペレーティング システムによって異なります。VM 作成時に OS を変更していない場合は Linux になり、次のコマンドを使用できます。

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy

オペレーティング システムを切り替えた場合は、こちらで OS のプロキシを取得する適切なコマンドを確認できます。

プロキシを実行するには、Cloud SQL インスタンスの詳細からコピーしたインスタンス接続名をコピーして、<INSTANCE_CONNECTION_NAME> と置き換えます。また、Postgres データベースを使用していない場合や、データベースがリッスンしているデフォルト ポートを変更した場合も、TCP ポート番号が変わる可能性があります。

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

6. 接続と終了をテストする

前述したように、GCE インスタンスでアプリケーションを起動してテストする場合も、もちろんそれで十分です。この Codelab では、psql をインストールし、そのクライアントを使用してデータベースに接続できることを確認します。

VM の SSH セッションから、次のコマンドを実行します。

sudo apt-get install postgresql-client
psql "host=127.0.0.1 port=5432 sslmode=disable user=postgres"

次に、Cloud SQL インスタンスの作成時に設定したデフォルト ユーザーのパスワードを指定します。

これで、問題がなければ、Postgres プロンプトが表示され、データベースに対してコマンドを実行できます。

次のステップ

以下の Codelab をご覧ください。

リファレンス ドキュメント