使用自定义策略的用户执行Terraform plan失败,排查缺失的EC2权限
解决Terraform Plan所需的最小EC2权限问题
我懂你的顾虑——不想给过于宽泛的ec2:*权限,但又卡在找不到Terraform刷新EC2实例状态需要的具体操作上。既然实例本身已经在运行,只是迁移代码,那核心就是找出Terraform刷新EC2资源状态时必须的EC2权限,而非全量权限。
首先,terraform plan执行时会先刷新现有资源状态,对于aws_instance资源,这个过程主要涉及以下几类操作:
1. 实例核心只读权限
这些是获取实例当前状态的基础权限:
ec2:DescribeInstances:最核心的权限,Terraform需要查询所有EC2实例的详细信息,匹配代码中定义的aws_instance.master资源ec2:DescribeInstanceStatus:如果代码涉及实例健康状态相关配置,这个权限也需要
2. 关联资源的只读权限
EC2实例通常绑定其他资源,Terraform也需要查询这些关联资源的状态来完成刷新:
ec2:DescribeSubnets:验证实例所在子网的信息ec2:DescribeVpcs:查询对应VPC的配置信息ec2:DescribeSecurityGroups:获取实例绑定的安全组详情ec2:DescribeKeyPairs:如果代码指定了密钥对,需要确认密钥对存在ec2:DescribeNetworkInterfaces:查询实例关联的网卡信息
3. 最小权限策略示例
你可以把这些权限整理成一个自定义策略,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeInstanceStatus", "ec2:DescribeSubnets", "ec2:DescribeVpcs", "ec2:DescribeSecurityGroups", "ec2:DescribeKeyPairs", "ec2:DescribeNetworkInterfaces" ], "Resource": "*" } ] }
注意:这类Describe类操作大多不支持资源级权限控制,AWS本身要求对这类操作指定
*作为资源范围。
4. 精准排查剩余权限问题
如果添加以上权限后仍报错,建议开启Terraform调试日志定位具体缺失的权限:
TF_LOG=DEBUG terraform plan
在日志里搜索UnauthorizedOperation或AccessDenied,就能找到被拒绝的具体EC2操作,再把对应的权限补充到策略里即可。
内容的提问来源于stack exchange,提问作者user_01_02
相关产品推荐
相关产品推荐

