【问题标题】:AWS Systems Manager "In Progress" commands limit to 5?AWS Systems Manager“进行中”命令限制为 5 个?
【发布时间】:2021-07-13 03:12:18
【问题描述】:

首先,我四处寻找有关我面临的问题的现有线程,但我没有找到任何东西。我也在AWS forums 上发布了这个,但没有得到任何答复。如果这里已经有一个现有的线程,我很抱歉。此外,我会为即将发布的相对较长的帖子道歉。

现在,我要做的是使用 AWS-RunShellScript 文档运行同一个应用程序的多个(阻塞)进程。问题是,使用此方法启动的进程不能超过 5 个。如果我通过 SSH 甚至手动启动它们,我可以毫无问题地启动几十个。

我使用的实例是 Ubuntu。我正在使用 Python 3.7.4 进行 AWS 资源操作,但在使用 AWS 控制台 时也会发生同样的情况。

每个命令通常会阻塞终端(即阻止您在终端的该实例中发出进一步的命令,如果您要手动执行) - 这反过来又会设置其状态,正如 AWS SSM 所见 - 正在进行中。从本质上讲,从 AWS SSM 的角度来看,该命令是不完整的,直到进程被终止或停止(更多内容见下文)。

问题是我可以通过 SSM 运行多达 4 个进程,并且仍然能够使用 SSM 操作它们(杀死、检查等)——这意味着最多有 4 命令进行中。但是,当我启动第五个时,虽然它们都继续工作,但我不能再使用 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"

此时将不再处理任何其他命令,也不会记录更多信息。但是,使用我们的示例,当 sleep 结束时,QUEUED 命令将在另一个插槽打开时立即执行(假设您只能排队 5 一次命令,我相信是这样,但没有提到)。

注意:正如我提到的 AWS-RunShellScript 文档,同样的问题也出现在 AWS-RunRemoteScript 文档中。

由于我必须提供一些代码,请使用 Python 从上述示例中找到下面的 sn-ps:

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 受到限制。

【问题讨论】:

    标签: python amazon-web-services amazon-systems-manager


    【解决方案1】:

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

    关于我如何追踪它的回复稍长。

    来自源代码中的ReleaseNotes

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

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

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

    Direction on editing the config file

    【讨论】:

    • 好吧,我现在觉得有点傻。我浏览了aws docs,boto docs。参数本身有点晦涩,没有人在任何地方都这么说(但是您链接的 ssm 源发行说明)。这绝对是要更改的设置,将尽快检查并标记为已接受。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 2020-02-06
    • 2021-05-18
    • 2021-04-15
    • 1970-01-01
    • 2020-07-22
    • 2020-01-15
    • 2020-10-21
    相关资源
    最近更新 更多