我正在尝试使用boto3在EC2示例上运行ssh命令。我阅读了以下指南:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-remote-commands.html和我做了他们在那里写的一切,但我一直得到错误消息:
>>>import boto3
>>> ec2 = boto3.client('ssm')
>>> a = ec2.send_command(InstanceIds=['i-0d5e16f6'], DocumentName='AWS-RunShellScript', Comment='abcdabcd', Parameters={"commands":["ifconfig"]})
输出:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 253, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 543, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.errorfactory.InvalidInstanceId: An error occurred (InvalidInstanceId) when calling the SendCommand operation:
如果我尝试使用awscli发送命令,我会遇到同样的问题:
aws ssm send-command --instance-ids "i-0d5e16f6" --document-name "AWS-RunShellScript" --comment "IP config" --parameters commands=ifconfig --output text
An error occurred (InvalidInstanceId) when calling the SendCommand operation:
有人知道怎么解决吗?
3条答案
按热度按时间x6yk4ghg1#
当您尝试访问的示例上没有安装SSM agent时,可能会发生这种情况。有关可以运行SSM命令的示例列表,请运行:
从那里,您可以获取一个示例ID,然后对该示例运行
send_command
命令。ilmyapht2#
如文件here in AWS' troubleshooting guide所述,此错误有一系列可能的原因。
接受的答案
aws ssm describe-instance-information
检查是否有可用的、处于有效状态的示例,并且安装了SSM代理,因此在一行中涵盖了几个故障排除步骤(很好;))。如果你使用的是
boto3
,可以通过以下方式实现:我不确定它是否检查权限,但假设是这样的。如果列表中缺少您的instance_id,您可以按照here一步一步的操作来确保正确的权限。
然而,还有另一个原因(最后,但 * 肯定不是最不重要的 *,因为它不明显):
新创建的示例需要一段时间才会显示在
describe_instance_information
列表中。这是 * 即使在等待 * 示例完成后期创建之后。例如:
将突出这个问题(如果存在-它肯定是为我)。
这 * 可能 * 是由于执行UserData脚本所花费的时间(请参阅this SO post for a possibly-related discussion on waiting for user data to complete),但我不能告诉(没有比我愿意付出更多的努力!)是否是这样,或者只是AWS更新其服务数据库的固有时间。
为了解决这个问题,我编写了一个短waiter(带有一个超时异常来处理其他故障模式),它反复调用describe_instance_information(),直到示例id出现在列表中。
mm9b1k5b3#
我知道这个问题有一个公认的答案,但我认为这是有帮助的广告一个小评论的问题。
在我的例子中,我没有将IAM角色附加到EC2示例。而且,有趣的是,即使在附加了角色之后,它对我也不起作用!
一个有效的技巧是在EC2机器上重新启动SSM代理: