AWS Lambda使用Slack Webhook发告警无报错无通知问题求助
问题根因定位
- 致命逻辑错误:
Send2Slack函数内部加了if __name__ == '__main__'判断。AWS Lambda运行时执行lambda_handler作为入口,此时__name__的取值为当前模块名而非__main__,因此该判断下所有发送Slack的逻辑全程不会执行,函数空跑自然无报错也无消息发出。 - 请求头逻辑错误:手动计算
Content-Length请求头的逻辑错误。sys.getsizeof(slack_data)计算的是Python字典对象在内存中的占用大小,并非JSON序列化后实际发送的字节长度,手动传入错误的长度值会导致Slack服务端无法正常解析请求。 - 潜在依赖问题:AWS Lambda默认Python运行环境未预装
requests库,你当前没遇到导入报错是因为上层判断直接跳过了所有用到requests的逻辑,后续修复后如果没有提前打包依赖会触发报错。 - 格式不规范问题:Slack消息结构里的
short字段应为布尔值false而非字符串"false",虽不影响消息发送但可能导致排版不符合预期。
修复方案
完整修复后代码
import json import requests def Send2Slack(message): print('inside slack function') # 替换为你实际的Slack webhook地址 url = "webhook_URL" title = "New Incoming Message" slack_data = { "username": "abc", "channel" : "xyz", "attachments": [ { "color": "#ECB22E", "fields": [ { "title": title, "value": message, "short": False, } ] } ] } # 不需要手动传Content-Length,requests会自动计算生成 headers = {'Content-Type': "application/json"} response = requests.post(url, data=json.dumps(slack_data), headers=headers) if response.status_code != 200: raise Exception(response.status_code, response.text) def lambda_handler(event, context): output = "Hello Slack " Send2Slack(output)
补充说明
- 如果不想额外打包
requests依赖,可以使用Python标准库urllib实现请求发送,避免额外打包操作 - 代码修复后需要将
requests及其依赖打包到Lambda部署包,或者通过Lambda层挂载requests库,否则会触发导入报错
内容的提问来源于stack exchange,提问作者Rukender
相关产品推荐
相关产品推荐

