如何使用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
相关产品推荐
相关产品推荐

