如何在Terraform脚本中调用gcloud命令迁移Azure DNS记录到GCP Cloud DNS
实现方案
Terraform可通过null_resource搭配local-exec预置器执行本地gcloud命令,完成Azure NS记录到GCP Cloud DNS的同步,具体实现如下:
前提条件
- 执行Terraform的环境已安装gcloud、Azure CLI
- 已完成gcloud账号认证,且账号具备GCP Cloud DNS编辑权限
- 已完成Azure CLI认证,且账号具备Azure DNS区域读取权限
完整代码示例
# 原有Azure DNS资源定义 resource "azurerm_resource_group" "dns_management" { name = "dns-managment" location = "West US" } resource "azurerm_dns_zone" "mydomaincom" { name = "mdomain.com" resource_group_name = azurerm_resource_group.dns_management.name } resource "azurerm_dns_a_record" "projectmydomain" { name = "project" zone_name = azurerm_dns_zone.mydomaincom.name resource_group_name = azurerm_resource_group.dns_management.name ttl = 300 records = ["127.0.0.1"] } # 同步Azure NS记录到GCP Cloud DNS resource "null_resource" "sync_ns_to_gcp" { # Azure NS记录变更时自动触发同步 triggers = { azure_ns_list = join(",", azurerm_dns_zone.mydomaincom.name_servers) } provisioner "local-exec" { command = <<EOT # 若GCP无对应托管区则先创建 gcloud dns managed-zones create mydomaincom \ --dns-name=mdomain.com. \ --description="Synced from Azure DNS" \ --project=替换为你的GCP项目ID || echo "托管区已存在,跳过创建" # 构造NS记录配置文件 cat > azure_ns.yaml << EOF kind: dns#resourceRecordSet name: mdomain.com. rrdatas: ${join("\n", formatlist("- %s", azurerm_dns_zone.mydomaincom.name_servers))} ttl: 300 type: NS EOF # 导入NS记录到GCP Cloud DNS gcloud dns record-sets import azure_ns.yaml \ --zone=mydomaincom \ --project=替换为你的GCP项目ID rm -f azure_ns.yaml EOT } }
注意事项
- 代码中的
替换为你的GCP项目ID需要修改为你实际使用的GCP项目ID - 不需要覆盖GCP侧已有NS记录的场景,可在import命令中去掉
--delete-all-existing参数 - 如果需要同步所有DNS记录而非仅NS记录,可在命令中增加
az network dns record-set list导出Azure全量记录,再批量导入GCP即可
内容的提问来源于stack exchange,提问作者Hans
相关产品推荐
相关产品推荐

