2

所以首先,我四处寻找关于我面临的问题的现有线程,但我没有找到任何东西。我也在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 受到限制。

4

1 回答 1

1

简短的回答。增加 amazon-ssm-agent.json 文件中的 CommandWorkersLimit 设置

关于我如何追踪它的稍微长一点的回应。

来自源代码中的ReleaseNotes

删除了代理上最大并行执行文档数的上限(以前最大为 10)您可以通过在 amazon-ssm-agent.json 文件中设置“CommandWorkerLimit”属性来配置此数字

如果我们在 Mds 部分获取一个峰值amazon-ssm-agent.json.template文件,您可以看到它设置为 5。

{
    "Profile":{
        "ShareCreds" : true,
        "ShareProfile" : ""
    },
    "Mds": {
        "CommandWorkersLimit" : 5,
        "StopTimeoutMillis" : 20000,
        "Endpoint": "",
        "CommandRetryLimit": 15
    },
... <LOTS DELETED> 
}

编辑配置文件的方向

于 2019-08-29T10:42:48.597 回答