Lambda->SSM->EventBridge联动故障:无法触发ColdFusion服务重启
问题排查:CloudWatch告警触发EventBridge→Lambda→SSM重启服务无响应
我配置了Python 3.9版本的Lambda函数,期望当指定CloudWatch告警触发(对应域名宕机、ColdFusion 2018 Application Server服务停止)时,通过EventBridge触发Lambda调用SSM文档,重启Windows实例上的ColdFusion服务。但整个流程完全无响应,已尝试多种方法仍未解决。手动在Systems Manager中执行该SSM命令可成功重启服务,实例上已安装SSM Agent。
以下是相关配置信息:
Lambda默认角色
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:ap-southeast-2:727665054500:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:ap-southeast-2:727665054500:log-group:/aws/lambda/johntest:*" ] } ] }
Lambda角色附加的SSM权限内联策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "ssm:SendCommand", "Resource": "*" } ] }
Lambda函数代码
import os import boto3 import json ssm = boto3.client('ssm') def lambda_handler(event, context): InstanceId = 'i-06692c60000c89460' ssmDocument = 'johntest' log_group = os.environ['AWS_LAMBDA_LOG_GROUP_NAME'] targetInstances = [InstanceId] response = ssm.send_command( InstanceIds=targetInstances, DocumentName=ssmDocument, DocumentVersion='$DEFAULT', CloudWatchOutputConfig={ 'CloudWatchLogGroupName': log_group, 'CloudWatchOutputEnabled': True } )
EventBridge规则配置
{ "source": [ "aws.cloudwatch" ], "detail-type": [ "CloudWatch Alarm State Change" ], "detail": { "alarmName": [ "TASS-john2-Testing-SiteDown for domain https://johntest.tassdev.cloud/tassweb" ], "state": { "value": [ "ALARM" ] }, "previousState": { "value": [ "OK" ] } } }
SSM文档配置(命令/会话文档类型)
--- schemaVersion: "2.2" description: "Example document" parameters: Message: type: "String" description: "Example parameter" default: "Hello World" mainSteps: - action: "aws:runPowerShellScript" name: "example" inputs: timeoutSeconds: '600' runCommand: - Restart-Service -DisplayName "ColdFusion 2018 Application Server"
排查方向与解决方案
1. 验证EventBridge规则是否触发
- 确认CloudWatch告警确实从
OK状态切换到ALARM状态(检查告警历史) - 在EventBridge控制台查看规则的"已触发次数"指标,确认规则是否被激活
- 使用EventBridge的测试事件功能,模拟CloudWatch告警状态变更事件(复制真实告警事件格式),手动触发规则,验证是否能调用Lambda
2. 检查Lambda执行状态与日志
- 查看Lambda对应的CloudWatch日志组(
/aws/lambda/johntest),确认函数是否被调用、是否有报错信息(如权限不足、参数错误) - 在Lambda控制台手动测试函数:传入空事件或模拟EventBridge事件,检查是否能成功调用SSM的
SendCommand接口 - 给Lambda代码添加错误捕获与日志输出(示例如下),便于定位问题:
import os import boto3 import json ssm = boto3.client('ssm') def lambda_handler(event, context): try: InstanceId = 'i-06692c60000c89460' ssmDocument = 'johntest' log_group = os.environ['AWS_LAMBDA_LOG_GROUP_NAME'] targetInstances = [InstanceId] response = ssm.send_command( InstanceIds=targetInstances, DocumentName=ssmDocument, DocumentVersion='$DEFAULT', CloudWatchOutputConfig={ 'CloudWatchLogGroupName': log_group, 'CloudWatchOutputEnabled': True } ) print(f"SSM命令发送成功: {json.dumps(response)}") return {'statusCode': 200, 'body': json.dumps('命令发送成功')} except Exception as e: print(f"发送SSM命令出错: {str(e)}") raise e
3. 权限问题排查
- Lambda角色权限:当前仅授权
ssm:SendCommand,若需要追踪命令状态可添加ssm:ListCommands、ssm:GetCommandInvocation;同时确认CloudWatchOutputConfig指定的日志组是否在Lambda角色的日志写入权限范围内(当前角色仅允许写入/aws/lambda/johntest:*) - SSM文档权限:检查SSM文档的资源策略,确认Lambda角色是否被允许执行该文档
- EC2实例权限:虽然手动执行成功,但仍需确认EC2实例的IAM角色(若有)是否允许SSM Agent接收命令(需包含
AmazonSSMManagedInstanceCore权限)
4. SSM文档优化
- 当前文档定义了未使用的
Message参数,可移除以简化配置 - 命令/会话文档(schemaVersion 2.2)支持通过
ssm:SendCommand调用,无需改用自动化文档
内容的提问来源于stack exchange,提问作者John Prindesis
相关产品推荐
相关产品推荐

