You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Terraform与Route 53配置域名指向Nginx负载均衡器遇阻求助

问题解决方案

一、解决域名无法指向负载均衡器IP的问题

  • 修正Terraform A记录配置:你的aws_route53_record资源中records字段使用了占位符"this.is.my.serverip",必须替换为Nginx Ingress负载均衡器的实际公网IP。同时建议调低TTL值,加快解析生效速度:
resource "aws_route53_record" "www" {
  allow_overwrite = true
  zone_id = aws_route53_zone.fancydomain_zone.zone_id
  name    = var.domain_name
  type    = "A"
  ttl     = 60  # 缩短TTL,便于测试时快速生效

  records = ["1.2.3.4"]  # 替换为你的负载均衡器真实IP
}
  • 验证解析生效:执行terraform apply更新记录后,等待TTL时长(如上述设置的60秒),通过nslookup fancydomain.com或dig fancydomain.com检查返回IP是否与负载均衡器IP一致。若仍不一致:
    • 确认注册域名的名称服务器与Route53托管区的NS完全匹配(可通过aws route53 get-hosted-zone --id <托管区ID>查看托管区NS,对比域名注册商的NS设置)
    • 检查是否存在冲突的旧DNS记录(如遗留的CNAME或A记录)

二、集成AWS ACM证书到Nginx Ingress Controller

ACM证书默认无法直接在非AWS环境的Nginx中使用,需通过导出证书文件并导入到Kubernetes集群的方式实现:

步骤1:切换ACM证书为DNS验证(自动化友好)

修改ACM证书资源,改用DNS验证,可自动创建验证记录无需手动处理邮件:

resource "aws_acm_certificate" "fancydomain_certificate" {
  domain_name       = var.domain_name
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}

# 自动生成DNS验证记录
resource "aws_route53_record" "fancydomain_cert_validation" {
  for_each = {
    for dvo in aws_acm_certificate.fancydomain_certificate.domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      record = dvo.resource_record_value
      type   = dvo.resource_record_type
    }
  }

  allow_overwrite = true
  name            = each.value.name
  records         = [each.value.record]
  ttl             = 60
  type            = each.value.type
  zone_id         = aws_route53_zone.fancydomain_zone.zone_id
}

# 等待证书验证完成
resource "aws_acm_certificate_validation" "fancydomain" {
  certificate_arn         = aws_acm_certificate.fancydomain_certificate.arn
  validation_record_fqdns = [for record in aws_route53_record.fancydomain_cert_validation : record.fqdn]
}

步骤2:导出ACM证书及私钥

ACM不允许直接下载私钥,若通过Terraform创建证书,需改用自定义私钥生成并导入ACM,以便获取私钥:

# 生成RSA私钥
resource "tls_private_key" "fancydomain" {
  algorithm = "RSA"
  rsa_bits  = 2048
}

# 生成证书签名请求(CSR)
resource "tls_cert_request" "fancydomain" {
  private_key_pem = tls_private_key.fancydomain.private_key_pem

  subject {
    common_name  = var.domain_name
    organization = "你的组织名称"
  }
}

# 将证书导入ACM(需提前通过CA签署CSR获取证书链,或使用AWS ACM的证书颁发)
resource "aws_acm_certificate" "fancydomain_certificate" {
  private_key      = tls_private_key.fancydomain.private_key_pem
  certificate_body = "<CA签署后的证书内容>"
  certificate_chain = "<CA提供的证书链内容>"

  lifecycle {
    create_before_destroy = true
  }
}

通过上述配置,你可以从tls_private_key.fancydomain.private_key_pem获取私钥,保存为private_key.pem;同时通过AWS CLI导出证书主体和链:

# 导出证书主体
aws acm get-certificate --certificate-arn <你的证书ARN> --query 'Certificate' --output text > certificate.pem

# 导出证书链
aws acm get-certificate --certificate-arn <你的证书ARN> --query 'CertificateChain' --output text > certificate_chain.pem

步骤3:在Kubernetes中创建TLS Secret

使用导出的证书文件创建Kubernetes Secret:

kubectl create secret tls fancydomain-tls --cert=certificate.pem --key=private_key.pem

步骤4:配置Nginx Ingress使用该Secret

修改Ingress资源,指定tls字段引用创建的Secret:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: fancydomain-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - fancydomain.com
    secretName: fancydomain-tls
  rules:
  - host: fancydomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: 你的服务名称
            port:
              number: 80

内容的提问来源于stack exchange,提问作者JPFrancoia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:33:15