调用Boto3 start_instances后EC2实例未实际启动的问题排查
问题描述
我在一台实例上运行Python代码,尝试通过Boto3的start_instances方法启动EC2实例。代码执行后返回如下响应:
Response: {'StartingInstances': [{'CurrentState': {'Code': 0, 'Name': 'pending'}, 'InstanceId': 'i-<id>', 'PreviousState': {'Code': 80, 'Name': 'stopped'}}], [..]
但在AWS控制台UI中,该实例既未启动也未处于pending状态。重复执行代码7次,结果一致。测试发现,通过UI启动实例后调用stop_instances方法可成功执行。当前权限配置包含:
"ec2:StartInstances", "ec2:StopInstances"
可能的原因及排查方向
- 区域不匹配:Boto3客户端默认使用的区域与你在控制台查看的区域不一致。检查代码中EC2客户端的初始化是否指定了正确的
region_name(比如boto3.client('ec2', region_name='us-west-2')),确保和控制台切换的区域完全一致。 - 实例ID错误:代码中传入的
InstanceId可能与你在控制台查看的实例ID不符(比如字符输入错误、混淆了相似实例的ID)。可通过调用Boto3的describe_instances方法,传入代码中的实例ID,查看该实例的实际状态,确认是否操作了错误的实例。 - 账户或实例受限:AWS账户存在额度限制、欠费,或实例因违规被限制启动。此时API会返回成功响应,但实际无法执行启动操作。检查账户是否有AWS发送的限制通知,或调用
describe_instance_status获取实例的详细状态信息,查看是否存在启动失败的错误提示。 - IAM策略的隐性限制:虽然权限包含
ec2:StartInstances,但策略可能添加了资源范围限制(如仅允许启动特定实例)或条件限制(如仅允许特定IP发起请求)。检查IAM策略的Resource字段是否包含目标实例ID或*,以及是否存在Condition字段限制了请求来源。
内容的提问来源于stack exchange,提问作者Luis Felipe
相关产品推荐
相关产品推荐

