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

如何使用AWS CDK Python将SSM Document设置为EventBridge的触发目标

可行实现方案

AWS CDK的aws_events_targets模块确实没有内置SSM Document作为事件目标的封装,你可以通过以下两种方案实现需求:

方案1:直接使用AwsApi自定义目标(推荐)

无需额外部署中间资源,直接通过EventBridge原生支持的AWS API调用能力,触发SSM SendCommand执行指定文档。

代码示例

from aws_cdk import (
    Stack,
    aws_events as events,
    aws_events_targets as targets,
    aws_iam as iam,
)
from constructs import Construct

class SsmTriggerStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        # 1. 定义EventBridge规则
        event_rule = events.Rule(self, "TriggerSsmRule",
            event_pattern=events.EventPattern(
                # 替换为实际的事件匹配规则,和手动配置的规则保持一致
                source=["aws.ec2"],
                detail_type=["EC2 Instance State-change Notification"],
                detail={
                    "state": ["running"]
                }
            )
        )
        
        # 2. 给EventBridge规则角色添加调用SSM SendCommand的权限
        event_role = iam.Role(self, "EventBridgeSsmRole",
            assumed_by=iam.ServicePrincipal("events.amazonaws.com")
        )
        event_role.add_to_policy(iam.PolicyStatement(
            effect=iam.Effect.ALLOW,
            actions=["ssm:SendCommand"],
            resources=["*"], # 建议根据实际SSM文档ARN、EC2实例标签等缩小权限范围
            conditions={
                "StringEquals": {
                    "aws:ResourceTag/your-target-tag": "your-tag-value"
                }
            }
        ))
        
        # 3. 配置AwsApi目标调用SSM SendCommand
        event_rule.add_target(targets.AwsApi(
            service="ssm",
            action="sendCommand",
            parameters={
                "DocumentName": "AWS-RunShellScript", # 替换为你的SSM Document名称
                "Targets": [
                    {
                        "Key": "tag:your-target-tag", # 替换为你匹配EC2的标签键
                        "Values": ["your-tag-value"] # 替换为你匹配EC2的标签值
                    }
                ],
                "Parameters": {
                    "commands": ["echo 'Hello from EventBridge trigger' > /tmp/test.log"] # 按SSM文档实际入参调整
                }
            },
            role=event_role
        ))

注意事项

  • 参数结构完全和SSM SendCommand的API参数保持一致,可直接复用手动配置时的参数
  • 权限建议按照最小权限原则收缩,不要直接使用*作为资源,可指定具体的SSM文档ARN、实例ARN,或者配合标签条件限制作用范围

方案2:Lambda函数中转(适合需要额外逻辑处理的场景)

如果需要在触发SSM前做参数校验、逻辑判断等额外操作,可以用Lambda作为中间层:

  • 把Lambda设置为EventBridge的目标
  • 在Lambda代码里调用SSM SendCommand API执行指定文档
  • 给Lambda对应的执行角色添加SSM SendCommand的权限
    该方案需要额外维护Lambda代码,没有特殊需求优先选择方案1。

内容的提问来源于stack exchange,提问作者Anepopane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:15:04