如何从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正常通信。
调试技巧
- 先在AWS控制台SSM Run Command中手动执行文档,确认输出为预期的状态字符串(如Running/Stopped/active/inactive)。
- 在Lambda中打印
invocation_response完整内容,查看StandardOutputContent、Status等字段的实际值,排查解析问题。
内容的提问来源于stack exchange,提问作者Daniel Sierra Pérez
相关产品推荐
相关产品推荐

