AWS API Gateway+Lambda Terraform部署后DNS查询长时间失效求助
问题:Terraform变更后私有VPC内API Gateway端点DNS查询失效,1-2小时才恢复
通过Terraform部署了运行在私有VPC内、仅内网可访问的AWS API Gateway+Lambda服务,每次执行Terraform变更后,服务端点的DNS查询会失效,无需手动操作,1-2小时后才恢复正常,耗时过长。
Terraform apply阶段输出如下:
aws_s3_bucket_object.file_upload: Modifying... [id=api.zip] aws_s3_bucket_object.file_upload: Modifications complete after 2s [id=api.zip] module.lambda["file_1"].aws_lambda_function.function: Modifying... [id=file1] module.lambda["file_2"].aws_lambda_function.function: Modifying... [id=file1] module.lambda["file_1"].aws_lambda_function.function: Modifications complete after 7s [id=file1] module.lambda["file_2"].aws_lambda_function.function: Modifications complete after 8s [id=file1] aws_api_gateway_rest_api.api: Modifying... [id=***********] aws_api_gateway_rest_api.api: Modifications complete after 1s [id=*******] aws_api_gateway_deployment.api_deployment: Creating... aws_api_gateway_deployment.api_deployment: Creation complete after 1s [id=*****] aws_api_gateway_stage.v1: Modifying... [id=*****] aws_api_gateway_stage.v1: Modifications complete after 0s [id=*****] aws_api_gateway_deployment.api_deployment (deposed object *****): Destroying... [id=*****] aws_api_gateway_deployment.api_deployment: Destruction complete after 0s
可能原因与排查思路
1. 私有DNS缓存过期延迟
私有VPC内的API Gateway依赖Route 53 Resolver做私有域名解析,当部署变更后,新部署对应的端点IP会更新,但以下缓存可能导致解析滞后:
- Route 53私有托管区中API Gateway记录的TTL设置过高(默认可能为3600秒/1小时),导致Resolver缓存的旧记录需要很久才会过期。
- VPC内客户端(EC2、Pod等)的本地DNS缓存(如systemd-resolved、dnsmasq)留存了旧解析记录,未及时刷新。
排查/修复:
- 登录Route 53控制台,找到API Gateway对应的私有托管区记录,将TTL调低(比如300秒),减少缓存等待时间。
- 在客户端执行
nslookup <你的API私有域名>,对比Route 53中的最新记录,若不一致,手动刷新客户端DNS缓存(如resolvectl flush-caches或systemctl restart systemd-resolved)验证是否恢复。
2. Terraform部署逻辑导致的部署断档
从apply输出看,每次变更都会创建新的aws_api_gateway_deployment,然后立即销毁旧的部署对象。如果没有配置create_before_destroy或者触发逻辑不合理,可能出现新部署的DNS还未完成同步,旧部署就被销毁的情况,导致解析真空期。
排查/修复:
- 优化
aws_api_gateway_deployment的配置,确保仅在API定义或Lambda代码变更时才触发部署,同时启用create_before_destroy保证新旧部署的无缝切换:
resource "aws_api_gateway_deployment" "api_deployment" { rest_api_id = aws_api_gateway_rest_api.api.id stage_name = "v1" # 仅当API定义或Lambda代码变更时触发重新部署 triggers = { redeployment = sha1(join("", [ aws_api_gateway_rest_api.api.body, module.lambda["file_1"].aws_lambda_function.function.source_code_hash, module.lambda["file_2"].aws_lambda_function.function.source_code_hash ])) } lifecycle { create_before_destroy = true } }
3. VPC端点(VPCE)关联异常
私有API Gateway依赖VPC端点(VPCE)提供内网访问,若Terraform变更时修改了VPCE的关联配置,或VPCE的DNS记录未及时同步到Route 53,会导致解析失败。
排查:
- 登录AWS控制台,查看API Gateway对应的VPC端点状态是否为
available。 - 检查Route 53私有托管区中是否存在VPCE对应的DNS记录,确认记录值与VPCE的内网IP一致。
4. API Gateway部署同步延迟
AWS内部的API Gateway部署同步到VPC内网可能存在延迟,尤其是跨可用区的场景。若新部署的端点还未完成全AZ同步,就会出现部分客户端解析失效的情况。
排查:
- 查看API Gateway控制台的部署状态,确认新部署已在所有关联的可用区生效。
- 检查CloudTrail中关于
CreateDeployment和UpdateStage的事件,确认操作已成功完成,无报错。
内容的提问来源于stack exchange,提问作者Arran Duff
相关产品推荐
相关产品推荐

