我需要从 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运行时中不可用
我希望与 EC2 建立流式连接,这样我可以逐一发送命令并立即接收每个命令的输出
StartSession
启动会话并打开与其返回的 URL 的 WebSocket 连接来完成此操作。
不幸的是,除了源代码之外,连接使用的格式没有记录,并且没有官方的Python库可以使用它(据我所知)。
还有其他语言的第三方库,例如JS.
我尝试使用 SSM.Client.start_session 但它需要会话管理器插件,该插件在 AWS Lambda 运行时中不可用
start_session
API 调用不需要插件。
该插件使 CLI 能够连接到会话并在 WebSocket 连接和终端之间转发命令,它仅适用于 CLI,不适用于编程访问。