SSM 向 EC2 实例发送命令失败
SSM send command to EC2 instance Failed
我正在尝试在 EC2 实例上使用 boto3 来 运行 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:
有人知道怎么解决吗?
如果您没有在您尝试访问的实例上安装 SSM agent,就会发生这种情况。有关您可以 运行 SSM 命令的实例列表,运行:
aws ssm describe-instance-information --output text
从那里,您可以获取一个实例 ID,然后 运行 使用该实例的 send_command
命令。
如文档所述here in AWS' troubleshooting guide有多种可能导致此错误的原因。
已接受的答案 aws ssm describe-instance-information
检查可用的实例,处于有效状态并安装了 SSM 代理,以便在一行中涵盖多个故障排除步骤(很好;))。
如果您使用 boto3
,同样可以通过以下方式实现:
ssm.client.describe_instance_information()
我不确定它是否检查权限,但我假设是这样。如果您的 instance_id 不在列表中,您可以按照 here.
的步骤确保正确的权限
然而,还有另一个原因(最后但绝对不是最不重要的,因为它并不明显):
新创建的实例需要一些时间才能显示在 describe_instance_information
列表中。
这 即使在等待 实例完成 post 创建之后。例如做:
# Key names are the same as the keyword arguments required by boto
params = {
'ImageId': image_id_to_use,
'InstanceType': instance_type_to_launch,
'MinCount': 1,
'MaxCount': 1,
'UserData': user_data_script,
'SecurityGroups': ['your groups'],
'KeyName': 'yourkeyname',
}
# Run the instance and wait for it to start
reservation = ec2.client.run_instances(**params)
instance = ec2.resource.Instance(reservation['Instances'][0]['InstanceId'])
instance.wait_until_running()
# Also wait status checks to complete
waiter = ec2.client.get_waiter('instance_status_ok')
waiter.wait(InstanceIds=[instance.id])
# Apply the IAM roles required (this instance will need access to, e.g., S3)
response = ec2.client.associate_iam_instance_profile(
IamInstanceProfile={
'Arn': 'your_arn',
'Name': 'ApplicableRoleEGAdministratorAccess'
},
InstanceId=instance.id
)
print('Instance id just created:', instance.id)
print('Instances in the SSM instances list right now:')
print(ssm.client.describe_instance_information()['InstanceInformationList'])
将突出显示此问题(如果存在 - 它肯定是为我准备的)。
这可能是由于执行 UserData 脚本所花费的时间(参见 ),但我不能说(没有比我更努力的)我愿意接受!)无论是那个,还是只是 AWS 更新其服务数据库所固有的时间。
为了解决这个问题,我写了一个简短的等待程序(带有超时异常来处理其他失败模式),它反复调用 describe_instance_information() 直到实例 ID 出现在列表中。
我正在尝试在 EC2 实例上使用 boto3 来 运行 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:
有人知道怎么解决吗?
如果您没有在您尝试访问的实例上安装 SSM agent,就会发生这种情况。有关您可以 运行 SSM 命令的实例列表,运行:
aws ssm describe-instance-information --output text
从那里,您可以获取一个实例 ID,然后 运行 使用该实例的 send_command
命令。
如文档所述here in AWS' troubleshooting guide有多种可能导致此错误的原因。
已接受的答案 aws ssm describe-instance-information
检查可用的实例,处于有效状态并安装了 SSM 代理,以便在一行中涵盖多个故障排除步骤(很好;))。
如果您使用 boto3
,同样可以通过以下方式实现:
ssm.client.describe_instance_information()
我不确定它是否检查权限,但我假设是这样。如果您的 instance_id 不在列表中,您可以按照 here.
的步骤确保正确的权限然而,还有另一个原因(最后但绝对不是最不重要的,因为它并不明显):
新创建的实例需要一些时间才能显示在 describe_instance_information
列表中。
这 即使在等待 实例完成 post 创建之后。例如做:
# Key names are the same as the keyword arguments required by boto
params = {
'ImageId': image_id_to_use,
'InstanceType': instance_type_to_launch,
'MinCount': 1,
'MaxCount': 1,
'UserData': user_data_script,
'SecurityGroups': ['your groups'],
'KeyName': 'yourkeyname',
}
# Run the instance and wait for it to start
reservation = ec2.client.run_instances(**params)
instance = ec2.resource.Instance(reservation['Instances'][0]['InstanceId'])
instance.wait_until_running()
# Also wait status checks to complete
waiter = ec2.client.get_waiter('instance_status_ok')
waiter.wait(InstanceIds=[instance.id])
# Apply the IAM roles required (this instance will need access to, e.g., S3)
response = ec2.client.associate_iam_instance_profile(
IamInstanceProfile={
'Arn': 'your_arn',
'Name': 'ApplicableRoleEGAdministratorAccess'
},
InstanceId=instance.id
)
print('Instance id just created:', instance.id)
print('Instances in the SSM instances list right now:')
print(ssm.client.describe_instance_information()['InstanceInformationList'])
将突出显示此问题(如果存在 - 它肯定是为我准备的)。
这可能是由于执行 UserData 脚本所花费的时间(参见
为了解决这个问题,我写了一个简短的等待程序(带有超时异常来处理其他失败模式),它反复调用 describe_instance_information() 直到实例 ID 出现在列表中。