Terraform调用AWS服务时返回‘i/o timeout’错误,求解决方案
问题:Terraform AWS Provider 无法假定IAM角色,DNS解析超时
执行任何需要Terraform与AWS服务交互的操作时,均触发以下错误:
Error: error configuring Terraform AWS Provider: IAM Role (arn:aws:iam::12345678910:role/terraform-role) cannot be assumed. │ │ There are a number of possible causes of this - the most common are: │ * The credentials used in order to assume the role are invalid │ * The credentials do not have appropriate permission to assume the role │ * The role ARN is not valid │ │ Error: operation error STS: AssumeRole, https response error StatusCode: 0, RequestID: , request send failed, Post "https://sts.us-east-1.amazonaws.com/": dial tcp: lookup sts.us-east-1.amazonaws.com on 1.1.1.1:53: read udp 192.168.1.246:0->1.1.1.1:53: i/o timeout │ │ │ with provider["registry.terraform.io/hashicorp/aws"], │ on main.tf line 13, in provider "aws": │ 13: provider "aws" {
已完成的排查步骤
- 同一网络下同款软件版本的另一台MacBook可正常运行
- 切换至其他网络后问题依旧
- 尝试ISP DNS(192.168.1.1)、Google DNS(8.8.8.8)、CloudFlare DNS(1.1.1.1),均无改善
- 执行命令
dig @1.1.1.1 sts.us-east-2.amazonaws.com可正常返回解析结果 - AWS CLI可正常与STS服务通信
- 容器内运行Terraform并挂载AWS凭证卷可正常工作,仅本地终端运行时出错
- 测试Terraform 1.2.5、1.0.0、1.0.3版本,问题均未解决
环境信息
macOS Monterey, version 12.5 Terraform v1.2.5 aws-cli/2.0.30 Python/3.7.4 Darwin/21.6.0 botocore/2.0.0dev34 Go runtime version: go1.18.1
可能的解决方案
1. 清除终端代理环境变量
Terraform基于Go开发,Go程序会优先读取系统代理变量,即使未手动设置,也可能存在残留配置。执行以下命令查看并清除:
# 查看当前代理变量 echo $HTTP_PROXY $HTTPS_PROXY $NO_PROXY # 清除代理变量 unset HTTP_PROXY HTTPS_PROXY NO_PROXY
之后重新运行Terraform命令测试。
2. 强制Terraform跳过DNS解析
在AWS Provider配置中直接指定STS服务端点IP(可通过dig sts.us-east-1.amazonaws.com获取),绕过DNS解析步骤:
provider "aws" { region = "us-east-1" assume_role { role_arn = "arn:aws:iam::12345678910:role/terraform-role" } # 替换为实际解析到的STS服务IP sts_endpoint = "https://<STS_IP_ADDRESS>" skip_region_validation = true skip_metadata_api_check = true }
3. 刷新MacOS DNS缓存
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
刷新后重新运行Terraform测试。
4. 检查终端网络权限
- 打开「系统设置」→「隐私与安全性」→「网络」
- 确保当前使用的终端(Terminal/iTerm2等)处于勾选状态,拥有网络访问权限
5. 临时禁用IPv6
部分网络环境下IPv6解析会导致超时:
- 打开「系统设置」→「网络」→ 选中当前网络 →「高级」→「TCP/IP」
- 将「配置IPv6」设置为「仅链接本地」或手动删除所有IPv6地址
- 重启终端后测试
6. 强制Go使用系统DNS解析方式
设置环境变量让Go遵循系统DNS解析逻辑:
export GODEBUG=netdns=cgo
在当前终端运行Terraform命令测试。
内容的提问来源于stack exchange,提问作者jumpy
相关产品推荐
相关产品推荐

