GCP for DevOps — Cloud DNS
Cloud DNS
Cloud DNS is a scalable, reliable DNS service that publishes domain names to the global DNS. It supports public zones (internet-facing) and private zones (VPC-internal), DNSSEC, and DNS forwarding.
Public Zones
# Create a public DNS zone
$ gcloud dns managed-zones create my-zone \
--dns-name="example.com." \
--description="Production DNS zone" \
--visibility=public
# List zones
$ gcloud dns managed-zones list
# Output:
# NAME DNS_NAME VISIBILITY
# my-zone example.com. public
DNS Records
# Add an A record
$ gcloud dns record-sets create www.example.com. \
--zone=my-zone \
--type=A \
--ttl=300 \
--rrdatas="35.201.100.50"
# Add a CNAME record
$ gcloud dns record-sets create app.example.com. \
--zone=my-zone \
--type=CNAME \
--ttl=300 \
--rrdatas="my-app-abc123.a.run.app."
# Add an MX record
$ gcloud dns record-sets create example.com. \
--zone=my-zone \
--type=MX \
--ttl=3600 \
--rrdatas="10 mail.example.com."
# Add a TXT record (SPF)
$ gcloud dns record-sets create example.com. \
--zone=my-zone \
--type=TXT \
--ttl=300 \
--rrdatas='"v=spf1 include:_spf.google.com ~all"'
# List records
$ gcloud dns record-sets list --zone=my-zone
# Update a record
$ gcloud dns record-sets update www.example.com. \
--zone=my-zone \
--type=A \
--ttl=600 \
--rrdatas="35.201.100.51"
# Delete a record
$ gcloud dns record-sets delete www.example.com. \
--zone=my-zone \
--type=A
Private Zones
Private DNS zones are only visible within specified VPCs:
# Create a private DNS zone
$ gcloud dns managed-zones create internal-zone \
--dns-name="internal.example.com." \
--description="Internal DNS" \
--visibility=private \
--networks=my-vpc
# Add internal records
$ gcloud dns record-sets create db.internal.example.com. \
--zone=internal-zone \
--type=A \
--ttl=60 \
--rrdatas="10.0.1.100"
$ gcloud dns record-sets create cache.internal.example.com. \
--zone=internal-zone \
--type=A \
--ttl=60 \
--rrdatas="10.0.1.200"
DNSSEC
# Enable DNSSEC on a zone
$ gcloud dns managed-zones update my-zone --dnssec-state=on
# Get DS records (to configure at registrar)
$ gcloud dns dns-keys list --zone=my-zone --filter="type=keySigning"
DNS Forwarding
Forward DNS queries to on-premises resolvers:
# Create a forwarding zone
$ gcloud dns managed-zones create onprem-zone \
--dns-name="corp.internal." \
--description="Forward to on-prem DNS" \
--visibility=private \
--networks=my-vpc \
--forwarding-targets="10.100.0.53,10.100.0.54"
DNS Peering
Share DNS zones between VPC networks:
# Create a peering zone
$ gcloud dns managed-zones create peer-zone \
--dns-name="shared.example.com." \
--description="DNS peering to shared-vpc" \
--visibility=private \
--networks=my-vpc \
--target-network=shared-vpc \
--target-project=shared-project
Common Mistakes
| Mistake | Why It’s Wrong | Fix |
|---|---|---|
| Missing trailing dot | DNS names require trailing dot | Always add . to DNS names |
| TTL too high for dynamic | Slow DNS propagation | Use 60–300s for dynamic records |
| No DNSSEC | Vulnerable to DNS spoofing | Enable DNSSEC on public zones |
| Wrong VPC for private zone | Records not resolvable | Verify network bindings |
| Not using private zones | Internal DNS over public | Use private zones for internal services |
Quick Reference
| Command | Description |
|---|---|
gcloud dns managed-zones create |
Create DNS zone |
gcloud dns record-sets create |
Add DNS record |
gcloud dns record-sets update |
Update record |
gcloud dns record-sets delete |
Delete record |
gcloud dns record-sets list |
List records |
Next → Cloud CDN