1. はじめに
最終更新日: 2021 年 5 月 6 日
接続について考える
アプリケーションとフレームワークにはさまざまな種類があります。この Codelab では、Cloud SQL Proxy を使用して、Google Compute Engine のマネージド仮想マシンで実行されているアプリケーションから内部プライベート IP アドレスを介して Cloud SQL に接続する方法について説明します。これは、クラウドでステートフル アプリケーションを実行する非常に安全な方法です。プライベート IP のみを使用するように制限し、SSL 接続を処理する SQL Proxy を使用することで、インターネットへの露出を最小限に抑えることができます。
たとえば、ローカルではなくクラウドで実行するように移行されたオンプレミス アプリケーションなどが、この一般的なユースケースに該当します。
作成するアプリの概要
この Codelab は非常に簡潔です。このアイデアは、アプリケーション自体についてあまり考えずに、接続部分の基本を説明することです。理想的には、Cloud SQL への接続は他の SQL データベースのインスタンスへの接続と同じです。この Codelab で作成したものを、任意の本番環境アプリケーションに適用できるはずです。
手順には、GCP コンソールでの操作のチュートリアルと、CLI または自動化で使用する gcloud コマンドの同等のコマンドの両方が含まれます。
個々の手順は次のとおりです。
- Cloud SQL インスタンスへの接続を有効にする最小限のサービス アカウントを作成する
- Google Compute Engine(GCE)で VM を作成する
- Cloud SQL インスタンスを作成する(このチュートリアルでは Postgres を使用しますが、MySQL または SQL Server でも同様に機能します)
- GCE インスタンスで Cloud SQL Proxy をダウンロードして実行する
必要なもの
- API を有効にしてサービスを作成する権限がある GCP アカウント
2. サービス アカウントを作成する
サービス アカウントは、GCP プロジェクト内のさまざまなサービスを使用する権限を付与するために使用されます。この Codelab では、Cloud SQL インスタンスに接続する権限を Cloud SQL Proxy に付与するために、1 つ必要になります。
コンソールで
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 は、マネージド リレーショナル データベース サービスです。MySQL、PostgreSQL、SQL Server をサポートしています。この Codelab では Postgres データベースを作成しますが、手順は 3 つすべてでほぼ同じです。
コンソールで
[Cloud SQL] ページに移動し、
ボタンをクリックします。
前述のとおり、この Codelab のほとんどは任意の SQL フレーバーに共通ですが、この Codelab では PostgreSQL を選択します。
- インスタンスに ID を指定する
- デフォルト ユーザーのパスワードを入力します(ユーザー名は、選択した DB のデフォルトになります。たとえば、MySQL の場合は
root、PostgreSQL の場合はpostgres)。 - コンピューティング インスタンスのリージョンを変更した場合は、ここでリージョンも変更して一致させる必要があります。
- 下にスクロールして
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 をご覧ください。