如何使用 Terraform 在 GCP 中添加 DNS 记录?

How to add a DNS record in GCP using Terraform?

我正在尝试让 terraform 将 "A" 记录添加到我在 GCP 中的 dns 区域。这样做会导致错误:"update server is not set"。描述了一个类似的错误 here。因此,我从那里的评论中了解到,我需要在我的 DNS 提供商中进行更新。我尽职尽责地尝试提供。

provider "dns" {
  update {
    server = "xxx.xxx.x.x"
  }
}

除了我不知道那里有什么 IP,我的第一次尝试都失败了。

我需要其他设置吗?

我注意到in the documentation以下格式...

provider "dns" {
  update {
    server        = "192.168.0.1"
    key_name      = "example.com."
    key_algorithm = "hmac-md5"
    key_secret    = "3VwZXJzZWNyZXQ="
  }
}

我不明白这些设置是从哪里来的。

更新:
Martin 的建议(下面接受的答案)非常有效。

对于下一个遇到这个问题的人来说,诀窍是使用 google_dns_record_set 而不是 dns_a_record_set

dns 提供商正在实施 RFC 2136: Dynamic Updates in the Domain Name System, which tends to be implemented by self-hosted DNS server software like BIND 中定义的标准 DNS 更新协议。在这种情况下,凭据将由 BIND 操作员在服务器端配置,然后您依次将给定的凭据传递给提供者。

不幸的是,由于 DNS 已趋向于成为各种供应商为您提供的托管服务,因此这些供应商中的大多数选择忽略 RFC 2136 并改为实施他们自己的专有 API。因此,Terraform 的 dns 提供商的管理功能与大多数托管 DNS 产品不兼容。

相反,我们使用供应商特定的提供商来管理这些。在您的情况下,由于您显然正在使用 Google Cloud DNS,因此您将使用来自 google Terraform 提供商的资源类型来管理您的 DNS 区域和记录。具体来说:

这是一个入门的最小示例:

resource "google_dns_managed_zone" "example" {
  name     = "example"
  dns_name = "example.com."
}

resource "google_dns_record_set" "example" {
  managed_zone = google_dns_managed_zone.example.name

  name    = "www.${google_dns_managed_zone.example.dns_name}"
  type    = "A"
  rrdatas = ["10.1.2.1", "10.1.2.2"]
  ttl     = 300
}

这些供应商使用特定于供应商的 API 的一个关键优势是管理操作与用于其其余 API 的身份验证机制相集成,因此只要您的 Google 云平台提供商具有凭据拥有足够的权限来管理这些对象,您不需要为此进行任何额外的提供程序配置。

Terraform 为许多不同的托管 DNS 供应商提供支持,因此不使用 Google Cloud DNS 的人将希望通过浏览 the available providers.