このページでは、VPC ネットワークでプライベート サービス アクセスを構成する方法について説明します。
プライベート サービス アクセスは、お客様の VPC ネットワークと基盤となる Google Cloud の VPC ネットワーク(Cloud SQL インスタンスが存在するネットワーク)との間の VPC ピアリング接続として実装されます。プライベート接続を使用すると、VPC ネットワーク内の VM インスタンスとアクセスするサービスで、内部 IP アドレスを使用して排他的に通信できるようになります。VM インスタンスは、インターネット アクセスまたは外部 IP アドレスがなくても、プライベート サービス アクセスを介してサービスにアクセスできます。
準備
Cloud SQL では、プライベート IP 接続に使用される各 VPC ネットワークにプライベート サービス アクセスが必要です。プライベート サービス アクセス接続を管理するには、ユーザーに次の IAM 権限が必要です。
compute.networks.list
compute.addresses.create
compute.addresses.list
servicenetworking.services.addPeering
これらの権限がない場合、権限不足のエラーになる可能性があります。
また、共有 VPC ネットワークを使用している場合は、次のことを行う必要があります。
- ユーザーをホスト プロジェクトに追加します。
- ホスト プロジェクトで、そのユーザーに同じ 4 つの権限を割り当てます。
- ユーザーに
compute.globalAddresses.list
IAM 権限を付与します。
Cloud SQL 用にプライベート サービス アクセスを構成する
プライベート サービス アクセスの構成プロセスは、2 つの部分で構成されています。
- 既存の IP アドレス範囲の選択、または新しい IP アドレス範囲の割り振り。
範囲の割り振りを Google に任せることもできます。この場合、Google は自動的に接頭辞長 /20 の IP 範囲を割り振り、default-ip-range という名前を使用します。
複数のリージョンまたは別のデータベース タイプでインスタンスを作成する場合、各リージョンまたはデータベース タイプで使用可能な少なくとも /24 の IP アドレス範囲が必要です。これには、Filestore や Memorystore などの他のアプリケーションが含まれます。新しいリージョンまたはデータベース タイプの場合、Cloud SQL には未使用の /24 範囲が必要です。
- VPC ネットワークから基盤となるサービス プロデューサー ネットワークへのプライベート接続を作成する。
IP アドレス範囲を割り振る
Console
-
Google Cloud コンソールの [VPC ネットワーク] ページに移動します。
- 使用する VPC ネットワークを選択します。
- [
プライベート サービス接続 ] タブを選択します。 - [
サービスに割り当てられた IP 範囲 ] を選択します。 - [
IP 範囲の割り当て ] をクリックします。 - 割り当てられた範囲の [
名前 ] にはgoogle-managed-services-VPC_NETWORK_NAME
を指定します。ここで、VPC_NETWORK_NAME
は、接続する VPC ネットワークの名前です(google-managed-services-default
など)。[説明 ] は任意です。 - [
カスタム ] オプションを選択し、割り振る IP アドレス範囲を CIDR 表記で入力します。 - [
割り当て ] をクリックして、割り振る範囲を作成します。
gcloud
次のいずれかを行います。
- アドレス範囲とプレフィックスの長さ(サブネット マスク)を指定するには、
addresses
フラグとprefix-length
フラグを使用します。たとえば、CIDR ブロック192.168.0.0/16
を割り振るには、アドレスに192.168.0.0
、プレフィックスの長さに16
を指定します。 - プレフィックスの長さ(サブネット マスク)だけを指定するには、
prefix-length
フラグを使用します。アドレス範囲を省略すると、VPC ネットワークで使用されていないアドレス範囲が、Google Cloud によって自動的に選択されます。次の例では、16
ビットのプレフィックス長を使用して、未使用の IP アドレス範囲を選択しています。
gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \ --global \ --purpose=VPC_PEERING \ --addresses=192.168.0.0 \ --prefix-length=16 \ --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \ --global \ --purpose=VPC_PEERING \ --prefix-length=16 \ --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
VPC_NETWORK_NAME
は、使用する VPC ネットワークの名前(my-vpc-network
など)に置き換えます。
次の例では、VPC ネットワーク my-vpc-network
のリソースがプライベート IP を使用して Cloud SQL インスタンスに接続できるようにする IP 範囲を割り当てています。
gcloud compute addresses create google-managed-services-my-vpc-network \ --global \ --purpose=VPC_PEERING \ --prefix-length=16 \ --network=projects/myprojectid/global/networks/myvpcnetwork \ --project=my-project
Terraform
IP アドレス範囲を割り振るには、Terraform リソースを使用します。
変更を適用する
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tf
にする必要があります(例:main.tf
)。このチュートリアルでは、このファイルをmain.tf
とします。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tf
にサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行う必要があります。
terraform init
必要に応じて、最新バージョンの Google プロバイダを使用する場合は、
-upgrade
オプションを使用します。terraform init -upgrade
変更を適用する
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行し、プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」のメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
変更を削除する
次のコマンドを実行して、プロンプトに yes
を入力し、以前に Terraform 構成で適用されたリソースを削除します。
terraform destroy
プライベート接続の作成
Console
-
Google Cloud コンソールの [VPC ネットワーク] ページに移動します。
- 使用する VPC ネットワークを選択します。
- [プライベート サービス接続] タブを選択します。
- [サービスへのプライベート接続] タブを選択します。
- ネットワークとサービス プロデューサーとの間にプライベート接続を作成するには、[接続の作成] をクリックします。
- [割り当て] で、他のサービス プロデューサーによって使用されていない 1 つ以上の既存の割り当て範囲を選択します。
- [接続] をクリックして接続を作成します。
gcloud
プライベート接続を作成します。
gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=google-managed-services-VPC_NETWORK_NAME \ --network=VPC_NETWORK_NAME \ --project=PROJECT_ID
このコマンドは、長時間実行されている Cloud SQL インスタンス オペレーションを開始し、オペレーション ID を戻します。
オペレーションが成功したかどうかを確認します。
gcloud services vpc-peerings operations describe \ --name=OPERATION_ID
プライベート接続を作成するときに、複数の割り当て範囲を指定できます。たとえば、範囲が不足している場合は、割り振り範囲を追加で指定できます。サービスは指定されたすべての範囲内の IP アドレスを、指定された順序で使用します。
Terraform
プライベート接続を作成するには、Terraform リソースを使用します。
プライベート接続の作成中にはアカウントがジャストインタイムでプロビジョニングされるため、service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com
形式のサービス アカウントには servicenetworking.serviceAgent
ロールが付与されます。
プロジェクトの compute.globalAddresses.list
権限または compute.projects.get
権限に関するエラーが表示された場合は、次の gcloud
コマンドを実行します。
gcloud projects add-iam-policy-binding HOST_PROJECT_NAME \ --member=serviceAccount:service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com \ --role=roles/servicenetworking.serviceAgent
プライベート サービス アクセス構成を変更する
プライベート サービス接続の割り振りアドレス範囲は、既存の Cloud SQL インスタンスを変更せずに変更できます。既存の Cloud SQL インスタンスのプライベート IP アドレスを変更するには、こちらの手順に従ってください。
割り振られたアドレス範囲を変更するには:
Console
-
Google Cloud コンソールの [VPC ネットワーク] ページに移動します。
- 使用する VPC ネットワークを選択します。
- [プライベート サービス接続] タブを選択します。
- [サービスに割り当てられた IP 範囲] を選択します。
削除する範囲の名前を選択します。
[リリース] をクリックします。
[IP 範囲の割り当て] をクリックします。
同じ名前と新しい範囲で新しい範囲を作成します
プライベート接続はすでにそのアドレス名を使用して確立されているため、同じ名前を使用することが重要です。
gcloud services vpc-peerings update \ --network=VPC_NETWORK_NAME \ --ranges=ALLOCATED_RANGES \ --service=servicenetworking.googleapis.com \ --force
既存の Cloud SQL インスタンスのプライベート IP アドレスを変更する
既存の Cloud SQL インスタンスのプライベート IP アドレスを変更するには、インスタンスを元のネットワークから一時的な VPC ネットワークに移動します。次に、インスタンスの元のネットワークのプライベート サービス アクセス構成を変更し、Cloud SQL インスタンスを元のネットワークに戻します。
別の VPC ネットワークに移動するには、次の手順の最後の手順(インスタンスの移動)以外のすべての手順を行います。この場合、TEMPORARY_VPC_NETWORK_NAME
は新しい VPC ネットワークです。また、古いプライベート接続を削除します。削除したプライベート接続が Google Cloud コンソールに表示されなくなるまでに数日かかることがあります。
Cloud SQL インスタンスが共有 VPC ネットワークでホストされている場合、次の手順で使用する VPC_NETWORK_NAME
変数は、ホスト プロジェクトの VPC ネットワーク名にする必要があります。共有 VPC ネットワークを使用するネットワークを指定するには、ネットワークの完全な URL(例: projects/HOST_PROJECT/global/networks/NETWORK_NAME
)を使用します。
Console
-
Google Cloud コンソールの [VPC ネットワーク] ページに移動します。
- 一時的な VPC ネットワークを作成します。
- 一時的な VPC ネットワークに IP 割り振りを作成します。
- 一時的な VPC ネットワークにプライベート接続を作成します。
Cloud SQL インスタンスを一時的な VPC ネットワークに移動します。
gcloud beta sql instances patch INSTANCE_ID \ --project=PROJECT_ID \ --network=projects/PROJECT_ID/global/networks/TEMPORARY_VPC_NETWORK_NAME \ --no-assign-ip
元のネットワークのプライベート サービス アクセス構成を変更して、新しい割り振り範囲を追加するか、既存の割り振り範囲を削除します。
Cloud SQL インスタンスを元の VPC ネットワークに戻します。
gcloud beta sql instances patch INSTANCE_ID \ --project=PROJECT_ID \ --network=projects/PROJECT_ID/global/networks/ORIGINAL_VPC_NETWORK_NAME \ --no-assign-ip