使用 Lambda 中的 SSM 在 EC2 上执行命令

问题描述 投票:0回答:1

我需要从 Lambda 在 Linux EC2 实例上执行一系列命令。我目前的做法大致如下:

import boto3, time

client = boto3.client("ssm", region_name="eu-west-1")
INSTANCE_ID = "some-instance-id"

commands = ["ls -la","uname"]
response = client.send_command(
    InstanceIds=[INSTANCE_ID],
    DocumentName="AWS-RunShellScript",
    Parameters={"commands": commands},
)
command_id = response["Command"]["CommandId"]
while True:
    time.sleep(3)
    result = client.get_command_invocation(
        CommandId=command_id,
        InstanceId=INSTANCE_ID,
    )
    if result["Status"] == "InProgress":
        continue
    print(result["StandardOutputContent"])
    print(result["StandardErrorContent"])
    break

这样做的缺点是,如果任何命令失败 - 很难调试哪个命令失败了(因为所有命令都是一体发送的),而且

time.sleep
会稍微减慢速度。 我希望与 EC2 建立流式连接,在这里我可以逐一发送命令并立即接收每个命令的输出,如下所示:

commands = ["ls -la", "uname"]
for command in commands:
    output, errors = some_client.send_command(command)
    if errors:
        break

我尝试使用

SSM.Client.start_session
,但它需要会话管理器插件,该插件在AWS Lambda运行时中不可用

python amazon-web-services amazon-ec2 aws-lambda boto3
1个回答
0
投票

我希望与 EC2 建立流式连接,这样我可以逐一发送命令并立即接收每个命令的输出

您可以通过使用

StartSession
启动会话并打开与其返回的 URL 的 WebSocket 连接来完成此操作。

不幸的是,除了源代码之外,连接使用的格式没有记录,并且没有官方的Python库可以使用它(据我所知)。

还有其他语言的第三方库,例如JS.

我尝试使用 SSM.Client.start_session 但它需要会话管理器插件,该插件在 AWS Lambda 运行时中不可用

start_session
API 调用不需要插件。

该插件使 CLI 能够连接到会话并在 WebSocket 连接和终端之间转发命令,它仅适用于 CLI,不适用于编程访问。

© www.soinside.com 2019 - 2024. All rights reserved.