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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:41:00