使用Boto3创建EC2实例并执行Linux命令时遇InvalidInstanceId错误
问题解决:SSM SendCommand提示实例状态无效
错误原因分析
你遇到的InvalidInstanceId错误,核心原因是EC2实例没有权限与AWS Systems Manager(SSM)服务通信,或者实例无法连接到SSM服务端点,导致SSM无法识别实例的有效状态。即使控制台状态检查通过,也不代表实例满足SSM的使用条件。
具体修复步骤
1. 给EC2实例添加SSM权限的IAM角色
SSM需要实例具备特定权限才能接收命令,你需要先创建一个带有AmazonEC2RoleforSSM托管策略的IAM角色(对应实例配置文件),然后修改创建实例的脚本,关联该角色:
import boto3 ec2 = boto3.resource('ec2') # 替换为你的IAM实例配置文件名称 instance_profile_name = 'AmazonEC2RoleforSSM' instance = ec2.create_instances( ImageId='ami-0b828c1c5ac3f13ee', MinCount=1, MaxCount=1, InstanceType='t2.micro', IamInstanceProfile={'Name': instance_profile_name} ) print(f"实例ID: {instance[0].id}")
2. 确保实例能连接到SSM服务
- 若实例在公有子网:确认实例已分配公网IP,且安全组允许**出站HTTPS(443)**流量到互联网。
- 若实例在私有子网:需配置NAT网关,确保实例能通过NAT访问SSM服务端点。
3. 修正SendCommand脚本的细节
你的命令里echo前有多余空格,会导致执行异常,去掉后脚本如下:
import boto3 commands = ['echo "hello world"'] ssm_client = boto3.client('ssm') output = ssm_client.send_command( InstanceIds=['你的实例ID'], DocumentName='AWS-RunShellScript', Parameters={'commands': commands} ) print(output)
4. 验证SSM Agent状态(可选)
Amazon Linux 2默认预装SSM Agent,可通过控制台连接实例后执行以下命令检查运行状态:
sudo systemctl status amazon-ssm-agent
若未运行,启动服务:
sudo systemctl start amazon-ssm-agent
完成以上步骤后,等待2-3分钟让实例与SSM服务建立连接,再执行SendCommand即可成功。
内容的提问来源于stack exchange,提问作者rare77
相关产品推荐
相关产品推荐

