このページでは、Private Service Connect で DNS を構成する方法について説明します。
概要
Private Service Connect が有効になっているインスタンスに接続するには、DNS を使用することをおすすめします。DNS 名を使用すると、異なるネットワークが同じインスタンスに接続できます。各ネットワークの Private Service Connect エンドポイントは異なる IP アドレスを持つ可能性があります。また、Cloud SQL Auth Proxy と言語コネクタがこれらのインスタンスに接続するには、DNS 名が必要です。
Private Service Connect が有効になっている Cloud SQL インスタンスには、次の 2 種類の DNS 名があります。
インスタンスごとの DNS 名。これは、Cloud SQL のすべてのエディションのインスタンスで使用できます。プライマリ インスタンスと各レプリカ インスタンスには、インスタンスごとの異なる DNS 名があります。
グローバル書き込みエンドポイント DNS 名。これは、Cloud SQL Enterprise Plus エディションのインスタンスで使用でき、高度な障害復旧(ADR)に役立ちます。書き込みエンドポイントは、現在のプライマリ インスタンスの 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またはfalse。trueの場合は、enable-psc-auto-dnsもtrueにする必要があります。
DNS 名を表示する
インスタンスのインスタンスごとの DNS 名と、プロジェクトのグローバル書き込みエンドポイントの DNS 名は、describe コマンドを使用して確認できます。
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 レコードを作成する必要があります。
| 名前 | TYPE | TTL | 価値 |
|---|---|---|---|
sample-db.mycompany.example.com |
CNAME | 600 | abcdef123456.987654321fedcb.us-central1.sql-psc.goog |
DNS を手動で構成する
手動 DNS 構成は以前のオプションであるため、DNS 自動化を使用することをおすすめします。必要に応じて、インスタンスのインスタンスごとの DNS レコードを手動で構成できます。DNS 名を使用すると、認証プロキシまたは言語コネクタを使用して、異なるネットワークから一貫した方法で接続できます。インスタンス ルックアップ 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"
}