如何在AWS Lambda中用Python解析CodePipeline的SNS通知消息
用Python Lambda解析AWS CodePipeline的SNS通知
1. 配置Lambda触发器
- 打开AWS Lambda控制台,创建Python函数(建议选Python 3.10及以上版本)
- 在触发器配置中选择SNS,关联你已有的CodePipeline通知主题
- 给Lambda角色配置权限:需包含SNS读取权限(用于获取触发消息),若要转发解析后的消息,还需添加SNS发布权限(可附加
AmazonSNSFullAccess或更细粒度的自定义权限)
2. Python解析代码示例
原始SNS消息的Records[0].Sns.Message字段是CodePipeline的原始JSON内容,我们提取关键信息并转换为可读格式:
import json import boto3 def lambda_handler(event, context): # 提取SNS中的CodePipeline原始消息 cp_message = json.loads(event['Records'][0]['Sns']['Message']) # 提取核心部署信息 pipeline_name = cp_message.get('detail', {}).get('pipeline', '未知') execution_id = cp_message.get('detail', {}).get('execution-id', '未知') status = cp_message.get('detail', {}).get('state', '未知') current_stage = cp_message.get('detail', {}).get('stage', '未知') aws_region = cp_message.get('region', '未知') event_time = cp_message.get('time', '未知') # 构造可读性强的通知文本 readable_content = f""" AWS CodePipeline 部署状态通知 ------------------------------ 流水线名称: {pipeline_name} 执行ID: {execution_id} 当前状态: {status.upper()} 当前阶段: {current_stage} AWS区域: {aws_region} 通知时间: {event_time} """ # 转发解析后的消息到SNS主题(替换为你的目标主题ARN) sns_client = boto3.client('sns') sns_client.publish( TopicArn='arn:aws:sns:你的区域:账号ID:目标主题名称', Message=readable_content, Subject=f"CodePipeline {pipeline_name} {status.upper()}" ) return { 'statusCode': 200, 'body': json.dumps('消息解析并转发完成') }
3. 代码说明
- 从Lambda触发事件中提取SNS消息,解析为JSON格式后,提取CodePipeline的核心字段
- 用格式化文本整理信息,避免原始JSON的冗余内容,突出关键状态和细节
- 通过boto3调用SNS发布接口,将可读文本发送到目标主题,订阅者将直接收到清晰的通知
4. 权限补充
- 确保Lambda角色的信任策略允许SNS触发执行
- 若自定义权限,需包含
sns:Publish动作,资源指定为目标SNS主题ARN
内容的提问来源于stack exchange,提问作者unknow
相关产品推荐
相关产品推荐

