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 サービス アカウント ページに移動し、ページの上部にある [] ボタンをクリックします。
サービス アカウントに一意の名前と 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] ページに移動し、[] ボタンをクリックします。
多くのオプションがありますが、その中で必要な作業は次のとおりです。
- インスタンスに名前を付ける
Machine type
をf1-micro
に変更します。- [ID と API へのアクセス] で、[
Service account
] のプルダウンを [Default compute service account
] から [前の手順で作成したもの] に変更します。 - ページの下部にある [作成] をクリックします。
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] ページに移動し、[] ボタンをクリックします。
前述のように、この Codelab のほとんどはどの SQL フレーバーでも汎用的ですが、この Codelab では PostgreSQL を選択します。
- インスタンスに ID を付与する
- デフォルト ユーザーのパスワードを入力します(選択した DB のデフォルトがユーザー名になります。例: MySQL の場合は
root
、PostgreSQL の場合はpostgres
) - Compute インスタンスのリージョンを変更した場合は、それに合わせてリージョンも変更する必要があります。
- 下にスクロールして [
show configuration options
] をクリックします Connectivity
セクションを開くPublic IP
のオプションをオフにし、Private IP
チェックボックスをオンにします。- プライベート IP をオンにしたときに表示されるプルダウンで
default
が選択されていることを確認します。 - 下にスクロールして [作成] をクリックします。
通常、インスタンスが起動するまでには数分かかります。
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 をご覧ください。