如何使用 terraform 将来自不同区域 (us-east1) 的 ACM 证书附加到另一个区域的应用程序负载均衡器

问题描述

我在 ap-southeast-1 中使用 terraform 设置了我的 AWS 基础设施,但是,我想链接我的 使用 aws_alb_listener 资源在 us-east1 中为我的负载均衡器创建的 ACM 证书。


resource "aws_alb_listener" "https" {
  load_balancer_arn = aws_lb.main.id
  port              = 443
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-2016-08"
  certificate_arn   = var.acm_certificate_arn
  depends_on        = [aws_alb_target_group.main]

  default_action {
    target_group_arn = aws_alb_target_group.main.arn
    type             = "forward"
  }
}

当我执行 terraform apply 时,它会引发错误

是否可以使用 terraform 将 ACM 证书附加到来自不同区域的 alb?

我的用例是此证书也将在 AWS CloudFront 中用作 CDN。

解决方法

是否可以使用 terraform 将 ACM 证书附加到来自不同区域的 alb?

遗憾的是这是不可能的。 ACM 证书只能在其创建的区域使用,不包括 CloudFront 等全球资源。

对于您的 ALB,您必须在 ALB 的区域中创建新的 ACM 并将其注册到同一个域。来自AWS blog

ACM 证书必须请求或导入到与您的负载均衡器相同的 AWS 区域。 Amazon CloudFront 分配必须在美国东部(弗吉尼亚北部)区域请求证书。

,

您可以使用相同的域名在另一个地区创建另一个证书。

例如,假设您有一个名为 default 的 aws_acm_certificate

# Your default certificate in ap-southeast-1
resource "aws_acm_certificate" "default" {
  domain_name       = aws_route53_record.default.fqdn
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }

  tags = {
    Environment = var.environment
  }
}

“默认”证书正在使用默认提供程序,因此让我们创建另一个具有别名的 aws 提供程序

provider "aws" {
  alias  = "us_east"
  region = "us-east-1"
}

现在我们可以使用这个证明在另一个区域创建“相同”的证书

resource "aws_acm_certificate" "us" {
  domain_name       = aws_route53_record.default.fqdn
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }

  provider = aws.us_east

  tags = {
    Environment = var.environment
  }
}

您的听众现在可以在 us-east-1 中使用这个新证书

resource "aws_alb_listener" "https" {
  load_balancer_arn = aws_lb.main.id
  port              = 443
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-2016-08"
  certificate_arn   = aws_acm_certificate.us.arn
  depends_on        = [aws_alb_target_group.main]

  default_action {
    target_group_arn = aws_alb_target_group.main.arn
    type             = "forward"
  }
}