用于 eu-west-1 中资源的 us-east-1 中的 Terraform AWS ACM 证书

Posted

技术标签:

【中文标题】用于 eu-west-1 中资源的 us-east-1 中的 Terraform AWS ACM 证书【英文标题】:Terraform AWS ACM certificates in us-east-1 for resources in eu-west-1 【发布时间】:2019-01-29 23:42:15 【问题描述】:

我有一个 terraform 模块,主要在 eu-west-1 中提供资源。我需要一个 ACM 证书才能附加到 Cloudfront 发行版。证书必须在 us-east-1 中提供。

我因此配置了两个提供程序:

provider "aws" 
  version = "~> 1.0"
  region = "eu-west-1"


provider "aws" 
  version = "~> 1.0"
  region = "us-east-1"
  alias = "us-east-1"

在我的模块中,我像这样提供证书:

resource "aws_acm_certificate" "cert" 
  provider = "aws.us-east-1"
  domain_name = "$var.domain_name"
  validation_method = "DNS"
  tags = "$var.tags"

  lifecycle 
    create_before_destroy = true
  

问题 #1:我尝试使用以下方法导入现有 ACM 证书:

terraform import module.mymod.aws_acm_certificate.cert arn:aws:acm:us-east-1:xyz:certificate/uuid

这失败了:“找不到带有 id 的证书”。 terraform 是否在错误的区域中寻找?我通过 aws CLI 确认证书确实存在(例如 ARN 中没有拼写错误)。

好的,所以我想我可以创建新证书。这确实有效,我现在有两个证书,但是我遇到了问题 #2:

resource "aws_route53_record" "cert_validation" 
  name = "$aws_acm_certificate.cert.domain_validation_options.0.resource_record_name"
  type = "$aws_acm_certificate.cert.domain_validation_options.0.resource_record_type"
  zone_id = "$data.aws_route53_zone.zone.id"
  records = ["$aws_acm_certificate.cert.domain_validation_options.0.resource_record_value"]
  ttl = 60

这会尝试为 ACM 设置 DNS 验证。托管区域存在于 eu-west-1 中,所以我预计这里会出现问题。但是,这仍然因“找不到证书......”而失败,我假设 terraform 对区域感到困惑。我也尝试将provider = "aws.us-east-1" 添加到此资源中,但仍然以同样的方式失败。

所以,无论我做什么,Terraform 都无法找到我的证书,即使它自己创建了它。我是不是做错了什么?

【问题讨论】:

Route53 托管区域是全球性的,而不是区域性的,所以我认为你在那里混淆了一些东西。看起来您可能有很多事情正在发生使这种情况感到困惑,因此可能值得尝试制作一个最小的复制案例,您只需尝试创建 ACM 证书、R53 记录和验证并编辑您的问题以仅显示代码并提供您遇到的确切错误,以便人们可以跟进。 另外值得注意的是,id 并不总是 arn 并且很少记录。值得尝试其他唯一标识符,例如名称。 【参考方案1】:

原来我的问题是aws_acm_certificate_validation。通过将提供者指定在与证书相同的区域,一切都解决了。

resource "aws_acm_certificate_validation" "cert" 
  provider = "aws.us-east-1" # <== Add this
  certificate_arn = "$aws_acm_certificate.cert.arn"
  validation_record_fqdns = ["$aws_route53_record.cert_validation.fqdn"]

【讨论】:

这个资源的 terraform 文档中怎么没有记录?似乎有点重要的信息... 知道如何从这个错误中恢复吗?如果我现在将提供者放入证书验证中,它仍然会失败。【参考方案2】:

自 Terraform 0.12.14 起,引用的引用已被弃用。 因此,如果您使用的是 >= 0.12.14 或 Terraform 1.x 的版本,那么上面接受的答案应该是这样的

resource "aws_acm_certificate_validation" "cert" 
  provider = aws.us-east-1 # <== Add this without quotes
  certificate_arn = "$aws_acm_certificate.cert.arn"
  validation_record_fqdns = ["$aws_route53_record.cert_validation.fqdn"]

为了避免这样的警告:

警告:引用的引用已弃用

52: 提供者 = "aws.us-east-1"

在这种情况下,引用应该是字面意思而不是引号。 Terraform 0.11 和更早版本需要引用,但引用的引用现在已弃用并将被删除 在未来版本的 Terraform 中。删除此引用周围的引号以消除此警告。

(以及其他地方的另一个类似警告)

有关详细信息,请参阅 hashcorp 的发行说明讨论:https://discuss.hashicorp.com/t/terraform-0-12-14-released/3898

【讨论】:

以上是关于用于 eu-west-1 中资源的 us-east-1 中的 Terraform AWS ACM 证书的主要内容,如果未能解决你的问题,请参考以下文章

模板上的CloudFormation回滚?更改模板中的默认区域时

配置 LogStreaming 时 ElasticBeanstalk 执行过期

在 AWS Lambda 中使用 pymongo 一段时间后发生 AutoReconnect 连接关闭错误

AWS - 配置从 Beanstalk 应用程序对 EC2 实例的访问

在 us-east-1 区域中启动给定的 cloudformation 模板时出错。 (构建 lambda 函数接收错误)

S3:请求的资源上不存在 Access-Control-Allow-Origin 标头