EC2上Terraform配置AWS无凭证报错,求IAM角色解决方案
问题解决步骤
1. 修复EC2实例元数据服务(IMDS)访问问题
报错中的proxyconnect tcp: dial tcp ... i/o timeout说明Terraform无法通过IMDS获取实例关联的IAM角色凭证,核心原因是IMDS请求受阻,可按以下步骤排查:
检查并清理代理配置
执行命令查看当前系统代理环境变量:
echo $HTTP_PROXY $HTTPS_PROXY
如果存在代理变量,需临时取消或添加IMDS地址例外:
# 临时清空代理 unset HTTP_PROXY HTTPS_PROXY # 或设置不代理IMDS地址 export NO_PROXY=169.254.169.254
验证IMDS连通性
执行curl命令测试能否获取IAM角色信息:
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
若返回关联的IAM角色名称,说明IMDS访问正常;若仍超时,需检查:
- 实例安全组是否允许出站访问
169.254.169.254的TCP 80端口 - 子网网络ACL是否允许入站/出站的TCP 80流量指向
169.254.169.254
2. 正确配置Terraform AWS Provider的角色假设
你直接在provider块添加role_arn报错,是因为AWS Provider 4.x版本中,角色ARN需放在assume_role嵌套块内,而非直接作为provider参数。修改main.tf的provider配置:
provider "aws" { region = var.aws_region assume_role { role_arn = var.aws_role_arn } }
同时确保变量文件(如variables.tf)中已声明aws_role_arn:
variable "aws_role_arn" { type = string description = "ARN of the IAM role to assume" }
3. 验证IAM角色配置
确认EC2关联的IAM角色已附加AmazonEC2FullAccess策略,且信任关系允许EC2服务扮演该角色(默认EC2角色的信任关系符合要求,示例如下):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
4. 重新执行Terraform命令
完成上述配置后,重新初始化并执行计划:
terraform init terraform plan
内容的提问来源于stack exchange,提问作者akshay naidu
相关产品推荐
相关产品推荐

