如何自定义AWS Chatbot的Slack告警链接跳转至CloudWatch日志
AWS Chatbot自定义Slack推送消息跳转链接方案
现有实现与问题
当前已打通的告警通知链路如下:
- 生产环境Lambda函数针对5xx、4xx错误配置CloudWatch告警
- 告警触发后推送消息到SNS主题
- AWS Chatbot读取SNS消息转发到指定Slack渠道
当前链路可正常运行,但存在不符合需求的点:Chatbot推送的Slack消息默认附带的跳转链接固定指向CloudWatch告警页面,无法直接跳转至对应指标关联的CloudWatch日志页面,需要实现自定义链接,点击后直接定位到对应日志。
现有CDK栈实现代码如下:
export class CdkStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Lambda const helloworldFn = new lambda.Function(this, "sample-lambda", { code: new lambda.AssetCode("./lib/lambda"), handler: "hello-world.handler", runtime: lambda.Runtime.NODEJS_14_X, }); // Lambda Log Group setting const metricFilter = helloworldFn.logGroup.addMetricFilter( "Keyword Filter", { metricNamespace: "chatbot-sample", metricName: "filter-by-keyword", filterPattern: { logPatternString: "\"HELLO, Slack!\"" }, } ); // Chatbot Role & Policy const chatbotRole = new iam.Role(this, "chatbot-role", { roleName: "chatbot-sample-role", assumedBy: new iam.ServicePrincipal("sns.amazonaws.com"), }); chatbotRole.addToPolicy( new iam.PolicyStatement({ resources: ["*"], actions: [ "cloudwatch:Describe*", "cloudwatch:Get*", "cloudwatch:List*", ], }) ); // SNS TOPIC const topic = new sns.Topic(this, "notification-topic", { displayName: "ChatbotNotificationTopic", topicName: "ChatbotNotificationTopic", }); const alarm = new cloudwatch.Alarm(this, "Alarm", { metric: metricFilter.metric(), actionsEnabled: true, threshold: 0, evaluationPeriods: 5, datapointsToAlarm: 1, comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, }); // 指定告警通知目标SNS const action = new cwactions.SnsAction(topic); alarm.addAlarmAction(action); // Chatbot Slack通知配置 const bot = new chatbot.SlackChannelConfiguration( this, "sample-slack-notification", { slackChannelConfigurationName: 'amplify-github-jatin-notifications', slackWorkspaceId: 'xxxxxx', slackChannelId: 'xxxxxx', notificationTopics: [topic], } ); } }
实现方案
AWS Chatbot没有提供直接修改默认告警消息内置跳转链接的配置项,要实现自定义跳转,需要在原有链路中增加一层消息转换逻辑,具体操作如下:
- 调整告警通知链路:不要将CloudWatch告警直接发送给Chatbot绑定的SNS主题,先把告警推送到独立的中转SNS主题,触发专门做消息格式转换的Lambda函数
- 在消息转换Lambda中完成自定义消息拼装:
- 解析CloudWatch告警推送的原始payload,提取关联的Lambda标识、告警触发时间、告警级别、错误指标等核心字段
- 手动拼接目标CloudWatch日志页面的访问地址,可直接带上日志组、时间范围、过滤关键词参数,点击即可直接定位到告警触发时段的对应错误日志
- 按照Chatbot支持的消息格式组装内容,可以按需添加文本、跳转按钮,不需要保留默认的告警页链接
- 将组装完成的自定义消息发送到Chatbot绑定的SNS主题,Chatbot会直接按照自定义内容推送到Slack渠道
现有代码需要修正的问题
- 当前Chatbot角色的信任策略配置错误,
assumedBy配置的是sns.amazonaws.com,需要修改为chatbot.amazonaws.com,否则Chatbot无法正常获取SNS消息、调用CloudWatch相关接口 - 需要给消息转换Lambda配置对应权限:允许接收中转SNS主题的触发事件、允许向Chatbot绑定的SNS主题发布消息、允许读取CloudWatch告警和日志的元数据
- 原CloudWatch告警的通知动作需要从中转SNS触发,不要直接对接Chatbot绑定的SNS
提示:自定义消息时可以配置多个交互按钮,分别放置「查看告警详情」「查看关联日志」等不同跳转入口,使用体验比单一链接更好。
内容的提问来源于stack exchange,提问作者Jatin Mehrotra
相关产品推荐
相关产品推荐

