【问题标题】:"no matching Route53Zone found": Terraform's Route53 data source is not recognizing the hosted zone name“找不到匹配的 Route53Zone”:Terraform 的 Route53 数据源无法识别托管区域名称
【发布时间】:2017-01-13 10:06:26
【问题描述】:

假设我有一个公共托管区域名称example.com.。我使用以下 Terraform 代码根据 the docs 的名称动态获取托管区域 ID。

data "aws_route53_zone" "main" {
  name = "example.com." # Notice the dot!!!
  private_zone = false
}

terraform plan 期间出现此错误:

Error refreshing state: 1 error(s) occurred:

* data.aws_route53_zone.main: no matching Route53Zone found

是否有我应该报告的错误或我遗漏了什么?

【问题讨论】:

  • 您实际上不需要点,如果它不存在,数据源会添加它。您可以使用 aws route53 list-hosted-zones-by-name --query 'HostedZones[*].{Name:Name,PrivateZone:Config.PrivateZone}' 之类的信息和 Terraform 使用的凭据检查该区域吗?
  • 此外,尽管在上面的示例中您没有指定 vpc_id 参数,但请注意,如果您这样做了,那么即使您设置了 private_zone = false,数据源也会隐式假定您想要一个私有区域。我最近提出了一个拉取请求来改变这种行为here
  • 哦,我尝试设置的所有基础设施都在 VPC 中!但是托管区域是公共的。它会产生冲突吗?
  • 要么,要么您实际上没有该帐户中的域。假设它在那里,那么是的,这听起来像是缺乏特权。
  • 您的 cmets 让我找到了解决方案...实际上,我试图将来自另一个帐户的托管区域用作数据源,同时考虑到 Route53 作为资源是全球性的。

标签: amazon-route53 terraform


【解决方案1】:

aws_route53_zone data source 将列出 Terraform 有权查看的帐户中的所有托管区域。

如果您尝试引用另一个帐户中的区域,则可以通过在该帐户中创建一个角色/用户来执行此操作,该区域具有列出所有区域 (route53:ListHostedZones*,route53:GetHostedZone*) 的权限,然后拥有第二个 " provider" 用于此数据源。

所以你可能有这样的事情:

provider "aws" {
    # ... access keys etc/assume role block
}

# DNS account
provider "aws" {
    alias = "dns_zones"
    # ... access keys etc/assume role block
}

data "aws_route53_zone" "main" {
  provider = "aws.dns_zones"
  name = "example.com." # Notice the dot!!!
  private_zone = false
}

resource "aws_route53_record" "www" {
  zone_id = "${data.aws_route53_zone.main.zone_id}"
  name = "www.${data.aws_route53_zone.main.name}"
  ...
}

【讨论】:

  • 我在第一个帐户中创建了一个对 R53 具有完全访问权限的跨帐户角色。我已经使用第二个帐户的用户手动测试了它(添加内联策略后),一切正常。我可以担任这个角色并管理 R53。我也做了你发布的更改。我需要在两个提供程序块中的任何一个中添加一个假设角色参数吗??
  • 只要这对你有用,那就没关系。我们前段时间尝试过,但无法让 Terraform 正确承担跨账户角色,尽管这可能已经被使用实例角色来承担跨账户角色。
  • 这不起作用,我无法通过名称查询公共区域,私有=false,只有 zone_id 有效...
  • 您是否收到错误消息?是因为您有多个同名的私有区域吗?如果您遇到问题,您应该考虑提出一个单独的问题,显示您尝试过的内容以及遇到的错误。如果有用,请链接回这个问题。
  • @ydaetskcoR Oh duuuuuuuuuude 现在是凌晨 3 点 40 分,我在排队 Bette Middler,因为你知道你是我的英雄吗......(如果不是因为 Notice the dot!!! 评论.. ........现在是早上 6 点 40 分,我仍然会在这里)
【解决方案2】:

使用zone_id 代替name 为我做到了。

data "aws_route53_zone" "api2" {
  # name = "example.com."
  zone_id = "REPLACEWITHYOURID"
  vpc_id = "${var.vpc_id}"
}

【讨论】:

  • 这对我也有用,不需要vpc_id
  • 这对我也有用,不需要 vpc_id
【解决方案3】:

当它被放置在一个模块中时,这似乎不起作用。只需将其移至在根级别调用模块的清单。

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 2021-01-06
    • 2017-07-25
    • 2020-06-16
    • 2019-10-13
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多