使用IAM假定角色调用EC2 RunInstance时实例异常终止问题
问题:使用EC2实例IAM角色启动EC2实例后立即终止
使用Golang版AWS SDK v2启动EC2实例时,用个人AWS凭证调用RunInstances完全正常;但切换为EC2实例IAM角色的假定角色调用时,调用本身无报错,可实例刚离开pending状态就立刻进入shutting-down/terminated状态。CloudTrail日志显示两种场景仅userIdentity字段不同,调整多种IAM策略后仍未解决,求进一步诊断思路。
配置加载方式
未设置默认VPC,角色已正确假定。基础加载代码:
cfg, err := awsconfig.LoadDefaultConfig(ctx, awsconfig.WithDefaultRegion(region))
尝试添加config.WithAssumeRoleCredentialOptions无任何效果(比如设置会话名称不生效):
awsconfig.LoadDefaultConfig(ctx, awsconfig.WithDefaultRegion(region), config.WithAssumeRoleCredentialOptions( func(aro *stscreds.AssumeRoleOptions) { aro.RoleSessionName = "session-name" }))
RunInstance输入参数
传入的核心参数如下:
extraDisk := types.BlockDeviceMapping{ DeviceName: aws.String("/dev/sda1"), Ebs: &types.EbsBlockDevice{ DeleteOnTermination: aws.Bool(true), VolumeSize: aws.Int32(diskSize), VolumeType: types.VolumeTypeStandard, }, } ec2.RunInstancesInput{ KeyName: aws.String(key), ImageId: aws.String(image), InstanceType: types.InstanceType("t2.medium"), MinCount: aws.Int32(1), MaxCount: aws.Int32(1), SecurityGroupIds: []string{secGroupID}, InstanceInitiatedShutdownBehavior: types.ShutdownBehaviorTerminate, BlockDeviceMappings: []types.BlockDeviceMapping{extraDisk}, TagSpecifications: tags, SubnetId: aws.String(subnet), UserData: aws.String(encodedJobData), PrivateIpAddress: aws.String(ipReserved), }
信任关系
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
附加策略
为调试已设置最宽松权限,CloudTrail显示仅调用EC2相关资源:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:DescribeLogStreams", "logs:DescribeLogGroups", "logs:CreateLogStream", "logs:CreateLogGroup", "ec2:*" ], "Resource": "*" } ] }
诊断与解决方向
查实例终止的直接原因
- 去EC2控制台找到已终止的实例,查看「状态转换原因」和「系统日志」。常见触发因素:指定的私有IP已被占用、子网可用IP耗尽、UserData执行失败、实例初始化时权限不足。
- 先移除
PrivateIpAddress参数测试,让AWS自动分配IP,排除IP冲突问题。
验证角色权限的实际生效情况
- 在运行代码的EC2实例上执行
aws sts get-caller-identity,确认当前使用的角色正确。 - 检查AWS组织层面的服务控制策略(SCP),即使角色附加了全量权限,SCP也可能限制相关操作。
- 在运行代码的EC2实例上执行
修正凭证加载逻辑
- EC2实例上运行SDK时,会自动从实例元数据获取角色凭证,不需要手动添加
WithAssumeRoleCredentialOptions(这个配置是主动假定其他角色时用的),建议移除该配置后重试。
- EC2实例上运行SDK时,会自动从实例元数据获取角色凭证,不需要手动添加
排查UserData的影响
- 如果UserData里包含需要权限的操作(比如访问S3),而实例角色没有对应权限,可能导致初始化失败触发终止。可以先清空UserData测试,看实例能否正常启动。
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

