首页 > 解决方案 > 告诉 Terraform 忽略不同工作区中的 Route53 资源

问题描述

我目前在 Terraform 中有 2 个工作区,一个用于 Prod,一个用于 Dev。

在 prod 中,我的 Terraform 代码创建了一个 Route53 条目,然后将证书作为 CNAME 添加到 Route53 托管区域,然后将证书附加到我的负载均衡器。

resource "aws_acm_certificate" "default" {
  domain_name = "www.test.uk"
  validation_method = "DNS"
}

resource "aws_route53_record" "validation" {
  name = aws_acm_certificate.default.domain_validation_options[0].resource_record_name
  type = aws_acm_certificate.default.domain_validation_options[0].resource_record_type
  zone_id = "Z0725470IF9R8J77LPTU"
  records = [
    aws_acm_certificate.default.domain_validation_options[0].resource_record_value]
  ttl = "60"
}

resource "aws_acm_certificate_validation" "default" {
  certificate_arn = aws_acm_certificate.default.arn
  validation_record_fqdns = [
    aws_route53_record.validation.fqdn,
  ]
}

当我将工作区切换到 dev 并运行 terraform apply 时,它会尝试再次创建此 Route53 条目并出现错误。有没有办法告诉 Terraform 忽略这一点?

我尝试添加计数 0 但它给了我这个错误

错误:缺少资源实例键

在 alb.tf 第 12 行,在资源“aws_route53_record”“验证”中:
12:type = aws_acm_certificate.default.domain_validation_options[0].resource_record_type

因为 aws_acm_certificate.default 设置了“计数”,所以必须在特定实例上访问其属性。

例如,要与引用资源的索引相关联,请使用:aws_acm_certificate.default[count.index]

错误:缺少资源实例键

在 alb.tf 第 15 行,在资源“aws_route53_record”“验证”中:
15:
aws_acm_certificate.default.domain_validation_options[0].resource_record_value]

因为 aws_acm_certificate.default 设置了“计数”,所以必须在特定实例上访问其属性。

例如,要与引用资源的索引相关联,请使用:aws_acm_certificate.default[count.index]

我想出的最佳解决方案是在登台工作区中运行 terraform apply 时注释掉 Route53 的内容,这显然不是一个理想的解决方案。

标签: amazon-web-servicesterraform

解决方案


下面未经测试,但我认为您可以使用条件(基于您的工作区名称)并使用 count 来创建(或不创建)资源。

locals {
  create_me = terraform.workspace == "dev" ? 0 : 1
}

resource "aws_acm_certificate" "default" {
  count = local.create_me
  domain_name = "www.test.uk"
  validation_method = "DNS"
}

resource "aws_route53_record" "validation" {
  count = local.create_me
  name = aws_acm_certificate.default.domain_validation_options[count.index].resource_record_name
  type = aws_acm_certificate.default.domain_validation_options[count.index].resource_record_type
  zone_id = "Z0725470IF9R8J77LPTU"
  records = [
    aws_acm_certificate.default.domain_validation_options[count.index].resource_record_value]
  ttl = "60"
}

resource "aws_acm_certificate_validation" "default" {
  count = local.create_me
  certificate_arn = aws_acm_certificate.default[count.index].arn
  validation_record_fqdns = [
    aws_route53_record.validation[count.index].fqdn,
  ]
}

推荐阅读