所以首先,我四处寻找关于我面临的问题的现有线程,但我没有找到任何东西。我也在AWS 论坛上发布了这个,但没有得到任何答复。如果这里已经有一个现有的线程,我很抱歉。此外,我将为即将发布的相对较长的帖子道歉。
现在,我要做的是使用AWS-RunShellScript 文档运行同一个应用程序的多个(阻塞)进程。问题是,我不能使用这种方法启动超过5 个进程。如果我通过 SSH 甚至手动启动它们,我可以毫无问题地启动几十个。
我使用的实例是Ubuntu。我正在使用Python 3.7.4进行 AWS 资源操作,但在使用AWS 控制台时也会发生同样的情况。
每个命令通常会阻塞终端(即阻止您在终端的该实例中发出进一步的命令,如果您要手动执行) - 这反过来会设置其状态,如 AWS SSM - In Progress所见。从本质上讲,从 AWS SSM 的角度来看,该命令是不完整的,直到进程被终止或停止(更多内容见下文)。
问题是我可以通过 SSM 运行多达4 个进程,并且仍然能够使用 SSM 操作它们(杀死、检查等)——这意味着最多有4 个命令In Progress。但是,当我启动第五个时,虽然它们都继续工作,但我不能再使用 SSM,没有其他命令被执行(无论是新进程还是任何其他命令)
重现此问题的最简单方法是通过AWS-RunShellScript文档发送5 个简单的sleep 60命令,然后尝试任何新命令 - 您会在 SSM 中注意到它们将弹出In Progress,但如果您跟踪 amazon-ssm- agent.log文件,实际上不会执行任何新命令。更奇怪的是,您会注意到日志在此块之后停止:
2019-08-13 08:25:12 INFO [MessagingDeliveryService] SendReply Response{
Description: "Reply e82b5dcb-0e81-4698-8f6e-fe1411f18300 was successfully sent.",
MessageId: "aws.ssm.1af47ba7-0d28-41ac-83dd-3bffbaa7db2d.i-08d3f4176a025a07b",
ReplyId: "e82b5dcb-0e81-4698-8f6e-fe1411f18300",
ReplyStatus: "QUEUED"
在此之后将不再处理任何命令,也不会记录更多信息。但是,使用我们的示例,当睡眠结束时,一旦打开另一个插槽,就会执行QUEUED命令(假设您一次只能排队5 个命令,我相信是这种情况,但没有提到)。
注意:正如我提到的AWS-RunShellScript文档一样, AWS-RunRemoteScript文档也会出现同样的问题。
由于我必须提供一些代码,请使用Python从上述示例中找到以下片段:
run_cmd_shell = lambda: ssm.send_command(
Targets=[{
'Key': 'tag:Name',
'Values': ['test_ssm']
},
{
'Key': 'tag:Role',
'Values': ['slave']
}
],
DocumentName='AWS-RunShellScript',
Parameters={'commands': [f'sleep {sleep_time}'],
'workingDirectory': [workingDirectory],
'executionTimeout': [executionTimeout]
},
OutputS3BucketName=bucket_name,
OutputS3KeyPrefix=bucket_prefix,
MaxConcurrency='150'
)
remote_cmd_script = lambda: ssm.send_command(
Targets=[{
'Key': 'tag:Name',
'Values': ['test_ssm']
},
{
'Key': 'tag:Role',
'Values': ['slave']
}
],
DocumentName='AWS-RunRemoteScript',
Parameters={'sourceType': ['S3'],
'sourceInfo': [f'{{"path":"https://s3.amazonaws.com/{bucket_name}/agents/{project_name}"}}'],
'commandLine': [f'sleep {sleep_time}'],
'workingDirectory': [workingDirectory],
'executionTimeout': [executionTimeout]
},
OutputS3BucketName=bucket_name,
OutputS3KeyPrefix=bucket_prefix,
MaxConcurrency='150'
)
我希望能够通过 SSH 或手动运行尽可能多的阻塞命令(这比5多得多),但是要么我在 SSM 方面做错了事,要么 AWS SSM 受到限制。