使用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记录)
- 确认注册域名的名称服务器与Route53托管区的NS完全匹配(可通过
二、集成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
相关产品推荐
相关产品推荐

