You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从AWS SSM文档执行结果中提取输出数据

解决方案:提取SSM命令执行后的服务状态

核心结论

send_command() 的响应仅包含命令元数据(如CommandId、InstanceId),不会直接返回执行结果。要获取服务状态,必须通过 boto3.client('ssm').get_command_invocation() 接口查询。

具体实现步骤

1. 修改Lambda代码,添加结果查询逻辑

调用 send_command() 后,需等待命令执行完成,再调用 get_command_invocation() 获取输出。可通过轮询或SSM内置Waiter实现等待:

import boto3
import time

ssm_client = boto3.client('ssm')

def lambda_handler(event, context):
    instance_id = event['InstanceId']
    service_name = event['ServiceName']
    
    # 发送SSM命令
    send_response = ssm_client.send_command(
        InstanceIds=[instance_id],
        DocumentName='你的SSM文档名称',
        Parameters={'ServiceName': [service_name]}
    )
    command_id = send_response['Command']['CommandId']
    
    # 轮询等待命令执行完成
    while True:
        try:
            invocation_response = ssm_client.get_command_invocation(
                CommandId=command_id,
                InstanceId=instance_id
            )
            status = invocation_response['Status']
            if status in ['Success', 'Failed', 'TimedOut']:
                break
            time.sleep(2)
        except ssm_client.exceptions.InvocationDoesNotExist:
            time.sleep(2)
            continue
    
    # 提取并返回服务状态
    if invocation_response['Status'] == 'Success':
        service_status = invocation_response['StandardOutputContent'].strip()
        return {'statusCode': 200, 'body': f"服务状态: {service_status}"}
    else:
        error_msg = invocation_response['StandardErrorContent'].strip()
        return {'statusCode': 500, 'body': f"命令执行失败: {error_msg}"}

2. 优化SSM文档,确保输出易提取

调整文档脚本,让输出为纯状态字符串,方便Lambda解析:

Windows模块(PowerShell)
schemaVersion: '2.2'
parameters:
  ServiceName:
    type: String
    description: "要检查的服务名称"
mainSteps:
- action: aws:runPowerShellScript
  name: CheckWindowsService
  inputs:
    runCommand:
    - "Get-Service -Name {{ServiceName}} | Select-Object -ExpandProperty Status"
  precondition:
    StringEquals:
    - platformType
    - Windows
Linux模块(Bash)
- action: aws:runShellScript
  name: CheckLinuxService
  inputs:
    runCommand:
    - "systemctl is-active {{ServiceName}}"
  precondition:
    StringEquals:
    - platformType
    - Linux

3. 必要的权限配置

  • Lambda的IAM角色需添加以下权限:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ssm:SendCommand",
                    "ssm:GetCommandInvocation"
                ],
                "Resource": "*"
            }
        ]
    }
    
  • EC2实例需关联AmazonSSMManagedInstanceCore权限策略,确保SSM Agent正常通信。

调试技巧

  1. 先在AWS控制台SSM Run Command中手动执行文档,确认输出为预期的状态字符串(如Running/Stopped/active/inactive)。
  2. 在Lambda中打印invocation_response完整内容,查看StandardOutputContent、Status等字段的实际值,排查解析问题。

内容的提问来源于stack exchange,提问作者Daniel Sierra Pérez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:18:13