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

能否仅通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:25:11