如何使用 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 区域和记录。具体来说:
google_dns_managed_zone
区域本身
google_dns_record_set
区域内的记录集
这是一个入门的最小示例:
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.
我正在尝试让 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 区域和记录。具体来说:
google_dns_managed_zone
区域本身google_dns_record_set
区域内的记录集
这是一个入门的最小示例:
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.