10

我正在尝试将命令发送到正在运行的 ubuntu ec2 实例。我已经配置了适当的角色,并且在 ec2 实例上运行了一个 ssm 代理。使用 boto3 SDK,我能够使用该client.send_command()函数成功发送 shell 命令,并随后能够获取命令 ID。现在的挑战是轮询结果。我正在尝试使用该 client.get_command_invocation()功能,但不断收到InvocationDoesNotExist错误消息。我确信我使用了正确的命令 ID 和实例 ID,因为我已经使用 AWS CLI 对它们进行了测试, aws ssm list-command-invocations --command-id #### --instance-id i-#####并且这很有效。这是我的代码片段:

`ssm_client = boto3.client('ssm')
target_id = "i-####"
response = ssm_client.send_command(
            InstanceIds=[
                target_id 
                    ],
            DocumentName="AWS-RunShellScript",
            Comment="Code to run" ,
            Parameters={
                    "commands": ["ls -l"]
                        }
            )
cmd_id= response['Command']['CommandId']
response = ssm_client.get_command_invocation(CommandId=cmd_id, 
InstanceId=target_id)
print(response)`

这是返回的错误: botocore.errorfactory.InvocationDoesNotExist: An error occurred (InvocationDoesNotExist) when calling the GetCommandInvocation operation

提前致谢。

4

2 回答 2

12

我遇到了同样的问题,我通过在调用 get_command_invocation() 之前添加 time.sleep() 调用来修复它。短暂的延迟就足够了。

于 2018-05-11T00:52:14.010 回答
6

只需添加这 2 行。

import time
time.sleep(2)

然后它会正常工作,一般只需要 0.65 秒,但最好给 2 秒。为了让它更好,你可以在 for 循环中添加一些很酷的东西,比如一些 print 语句,然后在里面睡觉。

于 2020-01-09T20:12:52.870 回答