AWS Lambda调用boto3的ec2.run_instances未授权问题排查
问题原因及解决办法
1. iam:PassRole权限的资源配置不精准
虽然你添加了iam:PassRole权限,但这个权限要求必须指定具体的实例角色ARN作为资源,仅用通配符*可能因为IAM的隐性限制不生效。Lambda执行角色的策略里,需要明确写你要传递的实例角色ARN,示例如下:
{ "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::123456789012:role/your-ec2-instance-role" }
同时要确认这个实例角色的信任关系允许EC2服务扮演它,信任策略需包含:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
2. 标签操作所需权限缺失
使用TagSpecifications时,Lambda执行角色需要明确的ec2:CreateTags权限——哪怕你配置了ec2:*,部分场景下通配符无法覆盖标签创建的上下文。建议在策略中单独添加该权限,同时确保RunInstances的资源覆盖EC2实例、卷、网卡等关联资源(创建实例时会自动生成这些资源,标签会同步应用):
{ "Effect": "Allow", "Action": [ "ec2:RunInstances", "ec2:CreateTags", "iam:PassRole" ], "Resource": [ "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:volume/*", "arn:aws:ec2:*:*:network-interface/*", "arn:aws:iam::123456789012:role/your-ec2-instance-role" ] }
3. Lambda执行角色的权限边界限制
如果你的Lambda执行角色设置了权限边界,即使附加了全量权限策略,权限边界也会限制实际可用权限。检查角色的权限边界配置,确保它包含iam:PassRole、ec2:CreateTags及对应资源的访问权限。
4. 启动模板的资源权限(若使用启动模板)
如果代码基于启动模板创建实例,Lambda执行角色的ec2:RunInstances权限需要包含启动模板的ARN作为资源:
arn:aws:ec2:*:*:launch-template/lt-xxxxxxxxxxxxxxxxx
快速验证步骤
- 单独测试仅添加
IamInstanceProfile参数,定位是否是该参数导致的权限问题 - 用IAM Access Analyzer或Lambda角色的权限模拟工具,验证
iam:PassRole和ec2:CreateTags操作是否被允许 - 查看CloudTrail中的
RunInstances调用日志,里面会显示具体的未授权细节(比如缺失的权限、不匹配的资源)
内容的提问来源于stack exchange,提问作者ashraf minhaj
相关产品推荐
相关产品推荐

