You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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": "*"
        }
    ]
}

诊断与解决方向

  1. 查实例终止的直接原因

    • 去EC2控制台找到已终止的实例,查看「状态转换原因」和「系统日志」。常见触发因素:指定的私有IP已被占用、子网可用IP耗尽、UserData执行失败、实例初始化时权限不足。
    • 先移除PrivateIpAddress参数测试,让AWS自动分配IP,排除IP冲突问题。
  2. 验证角色权限的实际生效情况

    • 在运行代码的EC2实例上执行aws sts get-caller-identity,确认当前使用的角色正确。
    • 检查AWS组织层面的服务控制策略(SCP),即使角色附加了全量权限,SCP也可能限制相关操作。
  3. 修正凭证加载逻辑

    • EC2实例上运行SDK时,会自动从实例元数据获取角色凭证,不需要手动添加WithAssumeRoleCredentialOptions(这个配置是主动假定其他角色时用的),建议移除该配置后重试。
  4. 排查UserData的影响

    • 如果UserData里包含需要权限的操作(比如访问S3),而实例角色没有对应权限,可能导致初始化失败触发终止。可以先清空UserData测试,看实例能否正常启动。

内容的提问来源于stack exchange,提问作者Stephen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:34:53