能否仅通过SNS触发PagerDuty事件?S3特定对象创建告警需求
解决方案:SNS+轻量Lambda转换触发PagerDuty告警
直接用SNS主题订阅极简Lambda的方案,完美适配你的需求,且完全支持Terraform管理,步骤如下:
1. 编写极简格式转换Lambda
这个Lambda只做一件事:把SNS传来的S3事件,转换成PagerDuty Events API要求的格式,然后发送告警。用Python实现的代码超短,无需额外依赖:
import json import urllib3 import boto3 ssm = boto3.client('ssm') def lambda_handler(event, context): # 从SNS消息中提取S3事件详情 s3_msg = json.loads(event['Records'][0]['Sns']['Message']) s3_info = s3_msg['Records'][0]['s3'] obj_key = s3_info['object']['key'] bucket = s3_info['bucket']['name'] # 从SSM参数管理器读取PagerDuty集成密钥(避免硬编码) pd_routing_key = ssm.get_parameter(Name='/pagerduty/s3-invalid-files-key', WithDecryption=True)['Parameter']['Value'] # 构造PagerDuty要求的事件结构 pd_payload = { "routing_key": pd_routing_key, "event_action": "trigger", "payload": { "summary": f"[告警] S3桶{bucket}新增无效文件:{obj_key}", "source": bucket, "severity": "warning" } } # 发送告警到PagerDuty http = urllib3.PoolManager() http.request( 'POST', 'https://events.pagerduty.com/v2/enqueue', body=json.dumps(pd_payload), headers={'Content-Type': 'application/json'} ) return {"status": "success"}
- 建议把PagerDuty集成密钥存在AWS SSM参数管理器中加密存储,Lambda通过IAM权限读取,既安全又便于维护。
2. 用Terraform完成全资源配置
用Terraform把Lambda、SNS订阅、IAM权限统一配置,完全贴合团队现有运维流程:
- 定义Lambda函数,绑定上述代码,配置运行角色(允许读取SSM参数、接收SNS消息、发起出站HTTP请求);
- 给目标SNS主题添加Lambda订阅,确保S3的
NotificationConfiguration仅将invalid-files/前缀的对象创建事件推送到该主题; - 配置SSM参数存储PagerDuty集成密钥(若采用上述代码的存储方式)。
方案优势
- 极简:Lambda逻辑单一,无冗余功能,维护成本极低;
- 适配Terraform:所有资源均可通过Terraform Provider管理,满足团队运维要求;
- 无额外负担:无需SQS队列,避免手动清空队列的麻烦,也不用依赖暂不支持Terraform的事件转换器;
- 精准触发:完全基于已配置的S3前缀规则,仅告警目标对象。
内容的提问来源于stack exchange,提问作者rafat islam
相关产品推荐
相关产品推荐

