このページでは、Private Service Connect で DNS を構成する方法について説明します。
概要
DNS は、Private Service Connect が有効になっているインスタンスに接続する場合におすすめの方法です。DNS 名を使用すると、異なるネットワークが同じインスタンスに接続できます。各ネットワークの Private Service Connect エンドポイントが異なる IP アドレスを持つ可能性があります。また、Cloud SQL Auth Proxy と言語コネクタがこれらのインスタンスに接続するには、DNS 名が必要です。
Private Service Connect が有効になっている Cloud SQL インスタンスには、次の 2 種類の DNS 名があります。
インスタンスごとの DNS 名 。これは、Cloud SQL のすべてのエディションのインスタンスで使用できます。プライマリ インスタンスと各レプリカ インスタンスには、インスタンスごとに異なる DNS 名が割り当てられます。
グローバル書き込みエンドポイント DNS 名 。これは、高度な障害復旧(ADR)をサポートするために、Cloud SQL Enterprise Plus エディションのインスタンスで使用できます。 高度な障害復旧(ADR)をサポートするために、Cloud SQL Enterprise Plus エディションのインスタンスで使用できます。 書き込みエンドポイントは、現在のプライマリ インスタンスの IP アドレスに自動的に解決されるグローバル DNS 名です。レプリカのフェイルオーバーまたはスイッチオーバー オペレーションの場合、この書き込みエンドポイントは受信接続を新しいプライマリ インスタンスに自動的にリダイレクトします。書き込みエンドポイントを使用すると、リージョンの停止復旧または障害復旧演習のためにレプリカのフェイルオーバーまたはスイッチオーバーのオペレーションを実行するときに、アプリケーション接続を変更する必要がなくなります。
Private Service Connect の DNS 自動化
インスタンスごとの DNS 名を作成するには、Cloud SQL DNS 自動化機能を使用して、DNS レコードと名前を設定します。DNS 自動化を有効にすると、Cloud SQL は、承認されたコンシューマー VPC ネットワーク内のインスタンスごとの DNS 名の DNS レコードを自動的にプロビジョニングして管理します。
Cloud SQL Enterprise Plus エディションのインスタンスで DNS 自動化を有効にすると、現在のプライマリ インスタンスの IP アドレスに常に自動的に解決されるグローバル書き込みエンドポイント DNS 名を有効にすることもできます。
必要に応じて、インスタンスのインスタンスごとの DNS レコードを手動で構成できます(DNS を手動で構成するを参照)。ただし、DNS 自動化を使用することをおすすめします。手動 DNS 構成はレガシー オプションです。
DNS 自動化を有効にするための前提条件
- DNS 自動化またはグローバル書き込みエンドポイント DNS 名を使用するには、 Cloud DNS API を有効にする必要があります。
- DNS 自動化は、Private Service Connect
が有効になっている場合にのみ有効にできます(
--enable-private-service-connectパラメータを使用)。 - DNS 自動化は、1 つ以上の
Private Service Connect 自動接続が指定されている場合にのみ有効にできます(
--psc-auto-connections=networkを使用)。 - グローバル書き込みエンドポイント DNS 名は、DNS 自動化が有効になっている Cloud SQL Enterprise Plus エディションのインスタンス でのみ有効にできます。
DNS 自動化の構成
Cloud SQL インスタンスを作成する で説明されているように、Private Service Connect が有効になっている新しいインスタンスを作成するときに、DNS 自動化とグローバル書き込みエンドポイント DNS 名を有効にできます。
既存のインスタンスで DNS 自動化を有効または無効にすることもできます。その場合、Cloud SQL は、それぞれのネットワークで関連する DNS レコードを自動的にプロビジョニングまたはクリーンアップします。
gcloud
gcloud sql instances patch INSTANCE_NAME \ --enable-psc-auto-dns=DNS_ENABLEMENT \ --enable-psc-write-endpoint-dns=GLOBAL_DNS_ENABLEMENT \
REST
HTTP メソッドと URL: は次のようになります。
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instancesJSON リクエスト本文は次のようになります。
{ "name": "INSTANCE_NAME", "project": "PROJECT_ID", "region": "REGION_NAME", "databaseVersion": "DATABASE_VERSION", "kind": "sql#instance", "settings": { "availabilityType": "AVAILABILITY_TYPE", "ipConfiguration": { "ipv4Enabled": false, "pscConfig": { "allowedConsumerProjects": [ "ALLOWED_PROJECTS" ], "pscAutoConnections": [ { "consumerProject":"CONSUMER_PROJECT", "consumerNetwork":"projects/PARENT_PROJECT/global/networks/CONSUMER_NETWORK" } ], "pscEnabled": true, "pscAutoDnsEnabled": DNS_ENABLEMENT, "pscWriteEndpointDnsEnabled": GLOBAL_DNS_ENABLEMENT, } }, "kind": "sql#settings", "pricingPlan": "PER_USE", "replicationType": "SYNCHRONOUS", "tier": "MACHINE_TYPE" } }
次のように置き換えます。
- DNS_ENABLEMENT: DNS 自動化を有効にするか無効にするかに応じて、
trueまたはfalse。 - GLOBAL_DNS_ENABLEMENT:グローバル書き込みエンドポイント DNS 名を有効にするか無効にするかに応じて、
trueまたはfalsetrueの場合は、enable-psc-auto-dnsもtrueにする必要があります。
DNS 名を表示する
describe コマンドを使用すると、インスタンスのインスタンスごとの DNS 名とプロジェクトのグローバル書き込みエンドポイント DNS 名の両方を確認できます。
gcloud
インスタンスごとの DNS 名
DNS 自動化を使用して作成されたインスタンスごとの DNS 名を確認するには、次のように
gcloud sql instances describe
コマンドを使用します。
gcloud sql instances describe INSTANCE_NAME \ --project=PROJECT_ID \ --flatten="dnsNames[]" \ --format="csv[no-heading](dnsNames.dnsScope, dnsNames.recordManager, dnsNames.name)" \ | grep "INSTANCE,CLOUD_SQL_AUTOMATION"
出力は次のようになります(DNS_NAME は インスタンスのインスタンスごとの DNS 名です)。
INSTANCE,CLOUD_SQL_AUTOMATION,DNS_NAME
DNS 名は、インスタンスのリージョン名の後に
.sql-psc-goog が付いた形式になります。
INSTANCE,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.us-central1.sql-psc.goog。
装飾されていない DNS 名のみを返すには、コマンドの末尾に | cut -d, -f3 を追加します。
グローバル書き込みエンドポイント DNS 名
同様に、describe コマンドを使用して、レプリケーション クラスタのグローバル書き込みエンドポイント DNS 名を確認できます。
gcloud sql instances describe INSTANCE_NAME \ --project=INSTANCE_NAME \ --flatten="dnsNames[]" \ --format="csv[no-heading](dnsNames.dnsScope, dnsNames.recordManager, dnsNames.name)" \ | grep "CLUSTER,CLOUD_SQL_AUTOMATION"
出力は次のようになります(GLOBAL_DNS_NAME はレプリケーション クラスタのグローバル書き込みエンドポイント DNS 名です)。
CLUSTER,CLOUD_SQL_AUTOMATION,GLOBAL_DNS_NAME
グローバル書き込みエンドポイント DNS 名は、
.global.sql-psc-goog で終わります。
CLUSTER,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.global.sql-psc.goog。
装飾されていない DNS 名のみを返すには、コマンドの末尾に | cut -d, -f3 を
追加します。
REST
HTTP メソッドと URL: は次のようになります。
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instancesインスタンスごとの DNS 名とグローバル書き込みエンドポイント DNS 名は、レスポンスの
dnsNames フィールドに次のように返されます。
{ "dnsNames": [ { "connectionType": "PRIVATE_SERVICE_CONNECT", "dnsScope": "INSTANCE", "name": "31f5395197d0.3e0v7ztul56ph.us-central1.sql.goog.", "recordManager": "CUSTOMER" }, { "connectionType": "PRIVATE_SERVICE_CONNECT", "dnsScope": "INSTANCE", "name": "31f5395197d0.3e0v7ztul56ph.us-central1.sql-psc.goog", "recordManager": "CLOUD_SQL_AUTOMATION" }, { "connectionType": "PRIVATE_SERVICE_CONNECT", "dnsScope": "CLUSTER", "name": "3lbvojtu2fo6q.3e0v7ztul56ph.global.sql-psc.goog", "recordManager": "CLOUD_SQL_AUTOMATION" } ], }
グローバル書き込みエンドポイント DNS 名またはインスタンスごとの DNS 名を使用して、インスタンスに接続できます。 DNS レコードを使用して接続するをご覧ください。
DNS 自動化ステータス フィールド
インスタンスとレプリケーション クラスタの DNS のステータスは、次の 2 つの出力フィールドで確認できます。
instanceAutoDnsStatus: インスタンスごとの DNS のステータスを表示します。writeEndpointAutoDnsStatus: グローバル書き込みエンドポイント DNS のステータスを表示します。
どちらのフィールドにも次の値を指定できます。
AUTO_DNS_STATUS_UNSPECIFIEDAUTO_DNS_OKAUTO_DNS_FAILEDAUTO_DNS_UNKNOWN
これらのフィールドは、pscAutoConnections 出力フィールド内に表示されます。
"pscAutoConnections": [ { "consumerNetwork": "projects/my-psc-project/global/networks/psc-dns-net2", "consumerNetworkStatus": "VALID", "consumerProject": "my-psc-project", "instanceAutoDnsStatus": "AUTO_DNS_OK", "ipAddress": "10.0.2.4", "status": "ACTIVE", "writeEndpointAutoDnsStatus": "AUTO_DNS_OK" } ]
DNS 自動化のトラブルシューティング
Cloud DNS API が有効になっていない場合、Private Service Connect 接続ポリシーがない場合、または DNS レコードの作成中にバックエンド エラーが発生した場合、DNS 自動化でインスタンスごとの DNS レコードまたはグローバル書き込みエンドポイント DNS 名を作成できないことがあります。
DNS 自動化が正しくプロビジョニングされていない状況が発生した場合は、update/patch API または
gcloud CLI で次の 2 つのフラグを使用できます。
--reconcile-psc-networking(boolean): 設定すると、Cloud SQL は機能していない DNS 自動化の部分を復元しようとします。 このフラグを使用してもダウンタイムは発生しません。--reconcile-psc-networking-force(boolean):reconcile-psc-networkingと同様ですが、設定すると、Cloud SQL は、機能している既存の PSC DNS 自動化部分で短時間のダウンタイムが発生する代わりに、すべての DNS 自動化を完全に 復元しようとします。reconcile-psc-networkingでは解決しない場合でも、この方法で解決できることがあります。
カスタム DNS 名を割り当てる
Private Service Connect Cloud SQL インスタンスのカスタム DNS 名を構成できます。Private Service Connect インスタンスの DNS 名を値として使用して、CNAME レコードを作成します。たとえば、
データベース DNS 名
sample-db.mycompany.example.com を使用してアプリケーションを構成し、
Private Service Connect DNS 名
abcdef123456.987654321fedcb.us-central1.sql-psc.goog のデータベース インスタンスを参照する場合は、まず
カスタム DNS 名でインスタンスを構成し、DNS プロバイダを使用して DNS CNAME レコードを作成する必要があります。
| NAME | TYPE | TTL | 価値 |
|---|---|---|---|
sample-db.mycompany.example.com |
CNAME | 600 | abcdef123456.987654321fedcb.us-central1.sql-psc.goog |
DNS を手動で構成する
手動 DNS 構成はレガシー オプションであるため、DNS 自動化を使用することをおすすめします。必要に応じて、インスタンスのインスタンスごとの DNS レコードを手動で構成できます。DNS 名を使用すると、Auth Proxy または言語コネクタを使用して、異なるネットワークから一貫した方法で接続できます。インスタンス ルックアップ API レスポンスには、対応する VPC ネットワークの プライベート DNS ゾーンに DNS レコードを作成するために使用できる推奨 DNS 名が用意されています。
gcloud
Cloud SQL インスタンスの概要情報(インスタンスの DNS 名など)を表示するには、
gcloud sql instances describeコマンドを使用します。gcloud sql instances describe INSTANCE_NAME \ --project=PROJECT_ID
次のように置き換えます。
- INSTANCE_NAME: Cloud SQL インスタンスの名前
- PROJECT_ID: インスタンスが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号
レスポンスに DNS 名が表示されていることを確認します。この名前には、次のようなパターンがあります:
INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.. 例:1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.。このセクションで事前に定義済みの DNS 名を使用するのではなく、カスタム DNS 名を使用して Cloud SQL インスタンスに接続する場合は、インスタンスの作成時にカスタム サブジェクト代替名(SAN)設定を構成します。カスタム SAN 設定に挿入したカスタム DNS 名は、インスタンスのサーバー証明書の SAN フィールドに追加されます。これにより、ホスト名の検証でカスタム DNS 名を 安全に使用できます。
カスタム SAN 設定の構成について詳しくは、 インスタンスを作成するをご覧ください。
-
プライベート DNS ゾーンを作成するには、
gcloud dns managed-zones createコマンドを使用します。このゾーンは、Private Service Connect エンドポイントを介して Cloud SQL インスタンスに接続するために使用される VPC ネットワークに関連付けられています。gcloud dns managed-zones create ZONE_NAME \ --project=PROJECT_ID \ --description="DESCRIPTION" \ --dns-name=DNS_NAME \ --networks=NETWORK_NAME \ --visibility=private
次のように置き換えます。
- ZONE_NAME: DNS ゾーンの名前
- PROJECT_ID: ゾーンが含まれている Google Cloud プロジェクトの ID または プロジェクト 番号
- DESCRIPTION: ゾーンの説明(たとえば、Cloud SQL インスタンスの DNS ゾーン)
- DNS_NAME: ゾーンの DNS サフィックスの名前。例:
REGION_NAME.sql.goog.(REGION_NAME はゾーンのリージョン名) - NETWORK_NAME: VPC ネットワークの名前
Private Service Connect エンドポイントを作成した後、ゾーンに DNS レコードを作成するには、
gcloud dns record-sets createコマンドを使用します。gcloud dns record-sets create DNS_RECORD \ --project=PROJECT_ID \ --type=RRSET_TYPE \ --rrdatas=RR_DATA \ --zone=ZONE_NAME
次のように置き換えます。
- DNS_RECORD: DNS レコードの名前。このレコードは、この手順の前半で Cloud SQL インスタンスから取得した DNS 名に設定します(例:
1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.)。 - RRSET_TYPE: DNS レコードセットのリソース レコードタイプ。
Private Service Connect エンドポイント用に予約した内部 IP アドレスが IPv4 アドレスの場合は、このパラメータに
Aを指定します。それ以外の場合で、 エンドポイントの IP アドレスが IPv6 アドレスの場合は、AAAAを指定します。 - RR_DATA:Private Service Connect エンドポイントに割り振られた IP アドレス(例:
198.51.100.5)。rrdata1 rrdata2 rrdata3などの複数の値を入力することもできます(例:
10.1.2.3 10.2.3.4 10.3. 4.5)。
- DNS_RECORD: DNS レコードの名前。このレコードは、この手順の前半で Cloud SQL インスタンスから取得した DNS 名に設定します(例:
REST
- Cloud SQL インスタンスの DNS 名を取得します。
- PROJECT_ID: インスタンスが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号
- INSTANCE_NAME: インスタンスの名前
- 限定公開 DNS ゾーンを作成します。このゾーンは、Private Service Connect エンドポイントを介して Cloud SQL インスタンスに接続するために使用される VPC ネットワークに関連付けられています。
- PROJECT_ID: DNS ゾーンが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号
- ZONE_NAME: ゾーンの名前
- DESCRIPTION: ゾーンの説明(Cloud SQL インスタンスの DNS ゾーンなど)
- DNS_NAME: ゾーンの DNS サフィックスの名前。例:
REGION_NAME.sql.goog.(REGION_NAME はゾーンのリージョン名) - NETWORK_NAME: VPC ネットワークの名前
- Private Service Connect エンドポイントを作成 した後、ゾーンに DNS レコードを 作成します。
- PROJECT_ID: DNS ゾーンが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号。
- ZONE_NAME: ゾーンの名前。
- DNS_RECORD: DNS レコードの名前。このレコードは、この手順の前半で Cloud SQL インスタンスから取得した DNS 名に設定します(例:
1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.)。 - RRSET_TYPE: DNS レコードセットのリソース レコードタイプ。Private Service Connect エンドポイント用に予約した内部 IP アドレスが IPv4 の場合は、このパラメータに
Aを指定します。それ以外の場合で、エンドポイントの IP アドレスが IPv6 の場合は、AAAAを指定します。 - TTL: レコードセットの有効期間(TTL)の秒数(例:
300)。 - RR_DATA: Private Service Connect エンドポイントに割り振られた IP アドレス(例:
198.51.100.5)。rrdata1 rrdata2 rrdata3などの複数の値を入力することもできます(例:10.1.2.3 10.2.3.4 10.3.4.5)。
リクエストのデータを使用する前に、 次のように置き換えます。
HTTP メソッドと URL:
GET https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_NAME
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{
...
"dnsName": "INSTANCE_ID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog."
}
dnsName フィールドには、Cloud SQL インスタンスの DNS 名が表示されます。DNS 名の末尾は常にピリオド(.)です。
リクエストのデータを使用する前に、 次のように置き換えます。
HTTP メソッドと URL:
POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones
リクエスト JSON 本文:
{
"name": "ZONE_NAME",
"description": "DESCRIPTION",
"dnsName": "DNS_NAME",
"visibility": "private",
"privateVisibilityConfig": {
"kind": "dns#managedZonePrivateVisibilityConfig",
"networks": [
{
"kind": "dns#managedZonePrivateVisibilityConfigNetwork",
"networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME"
}
]
}
}
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{
"name": "ZONE_NAME",
"dnsName": "DNS_NAME",
"description": "DESCRIPTION",
"id": "ID",
"nameServers": [
"ns-gcp-private.googledomains.com."
],
"creationTime": "2024-05-10T17:05:34.607Z",
"visibility": "private",
"privateVisibilityConfig": {
"networks": [
{
"networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME",
"kind": "dns#managedZonePrivateVisibilityConfigNetwork"
}
],
"gkeClusters": [],
"kind": "dns#managedZonePrivateVisibilityConfig"
},
"cloudLoggingConfig": {
"kind": "dns#managedZoneCloudLoggingConfig"
},
"kind": "dns#managedZone"
}
リクエストのデータを使用する前に、 次のように置き換えます。
HTTP メソッドと URL:
POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/ZONE_NAME
リクエスト JSON 本文:
{
"deletions": []
"additions": [
{
"name": "DNS_RECORD",
"type": "RRSET_TYPE",
"ttl": TTL,
"rrdatas": [
"RR_DATA"
]
}
]
}
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{
"additions": [
{
"name": "DNS_RECORD",
"type": "RRSET_TYPE",
"ttl": TTL,
"rrdatas": [
"RR_DATA"
],
"signatureRrdatas": [],
"kind": "dns#resourceRecordSet"
}
],
"deletions": [],
"startTime": "2024-05-10T17:29:44.375Z",
"id": "CHANGE_ID",
"status": "pending",
"kind": "dns#change"
}