如何使用简单的Slack命令在Slack中显示AWS指标
要求:
- AWS控制台访问
- 具有Cloudwatch读取访问权限的AWS IAM用户
- 具有读取/写入S3,Lambda,API网关的AWS IAM用户
- 管理员对Slack工作区的访问
基本步骤:
- 创建Lambda以使用Flask后端从Cloudwatch提取指标图像以处理Slack POST请求
- 使用Zappa部署Lambda以自动创建Lambda和API网关
- 将API网关挂接到Slack斜杠命令中
背景
我作为生产支持的工作比我想象的要多得多。 就像任何与AWS一起工作的人都知道的那样,不断打开AWS控制台可能会很痛苦,尤其是如果您只想检查一些简单的事情(例如当前在线实例数)时。 我登录AWS的次数越多,我就认为应该有一种更好的方法来从AWS获取简单信息,尤其是能够与可能无法访问AWS的其他人自动共享更新的数据。
这是最终产品的示例

(完整的代码位于https://github.com/JulianRunnels/Slackbot,请随意提出任何改进,因为我是一个自学成才的编码人员,该代码可能不是最可靠的)
创建一个AWS Slackbot
从AWS提取数据
我做了一些基础研究,最终使我了解了AWS CLI,以及更多的boto3,这是用于连接到AWS的python特定的SDK。 通过此操作,我可以查询AWS并使用get_metric_widget_image接收特定信息:

要获取要绘制的指标,请转到AWS控制台中的Cloudwatch服务,转到“指标”,选择要绘制图形的指标,然后转到“源”并选择视图作为Image API。 将该json复制到脚本中,作为从中提取数据的指标。
例如:自动扩展组CPU使用率指标:
cpu_metric ='{“ metrics”:[[“ AWS / EC2”,“ CPUUtilization”,“ AutoScalingGroupName”,’\
‘“ NAME_OF_AUTOSCALING_GROUP_HERE”]],“ view”:“ timeSeries”,“ stacked”:false,’\
‘“ period”:300,“ yAxis”:{“ left”:{“ min”:0}},“ title”:“ Autoscaling CPU Utilization”,“ start”:“-PT1H”,’\
‘“结束”:“ P0D”,“时区”:“-0800”}’

在此处,您要使用boto3设置与CloudWatch的客户端连接。 在这里,您需要确保至少有一个只读的IAM用户设置来提取数据。 我相信还有其他建立连接的方法,但是我发现这是最简单的方法。
既然我已经具备从AWS提取信息的能力,我想要一种简单的方法来为其他团队成员提供一种自动查看此信息的方式,而无需我提取信息。 因此,我看了一个我们已经大量使用的程序Slack。

松弛
Slack斜杠命令的基本结构通过使Slack将带有各种信息的POST请求发送到指定的URL来工作,并且易于设置和理解。 部署lambda之后,只需简单地获取它给您的api_gateway的URL,然后将其放置在您创建的slack slash命令的响应URL中(稍后将对此进行更多介绍)。 对于本地测试,我使用Flask-ngrok创建本地运行代理,并通过该代理运行命令。
Flask / Slackclient
来自Slack的POST请求的实际处理是通过一个简单的Flask后端完成的。 基本上,如果得到有效的响应,它将让用户知道它已经收到了响应,然后将请求传递给处理程序以提取适当的信息。 该信息通过Slackclient传递给Slack的python开发工具包传递回Slack通道。 一旦通过Boto3提取了度量标准信息,它将被传递回发出请求的通道,并在此处显示图像。 大多数Flask响应是通过使用Flask任务在同一时间完成的,这使得整个过程非常快。 对于未知的响应,它也有一些错误处理。 正如我稍后提到的那样,对Slack的请求进行了检查,以确保它来自正确的地方。
扎帕
为了部署此lambda,我使用Zappa进行了部署。 Zappa花了一些时间才弄清楚,对于某些人来说可能是一个争论点,因为它要求IAM用户至少具有对Lambda,API Gateway和S3的部署和执行权限。 Zappa的实际部署非常简单,请参考文档。 我已将我的zappa_settings.json包含一些已删除的个人信息。 只需安装Zappa并在命令行中运行zappa init,它会自动创建一个zappa_settings,您可以使用keep_warm等项目进行调整。
如果您是使用AWS的向导,则很有可能自己构建lambda并手动创建API Gateway连接,这将通过消除对IAM用户的需求来减轻安全风险。
安全
当然,要考虑的重要方面是安全性。 在Zappa部署的任何计算机上,它都需要具有对IAM用户的一组AWS凭证的访问权限,并且可以对部分环境进行读/写操作。 这确实带来了一些风险,但是可以通过将Zappa部署脚本放置在锁定的部署计算机上,将密钥私下保存在该计算机上或自己创建Lambda来缓解。
Slack连接使用唯一的Slack Bot令牌发布到您团队的应用程序,并在每个请求中同时检查Verification Token和Slack Team ID,以验证其是否有效。 还有一个选项可以设置oauth结构以增强安全性。 如代码所示,我的大多数安全令牌都是通过环境变量传递的。 我计划的未来升级是将密钥迁移到类似AWS Secret Manager的系统中,因为我的Slackbot已经以Lambda的形式存在。
未来升级
从这里可以建立很多潜在的角度,从连接到RDS数据库以进行直接查询之类的事情,到根据简单的闲置请求生成的自动电子邮件报告之类的角度。 您将AWS之类的东西连接到Slack之类的外部源上的次数越多,您留下的攻击途径就越多,因此意识到这一点非常重要。
话虽如此,我想实现一个斜杠命令,该命令允许从Slack查询只读RDS db,我目前的想法是,该进程可以访问由提交请求的用户所控制的db。必须在slash命令中包含的辅助密码。 Flask后端将对照授权用户列表和提供的密码检查提交的用户。
例如:/ info查询“ PASSWORD”查询
当然,几乎有无限的想法,实际上,如果您想一路走下去,那么可能可以实现一些命令来更改诸如Auto Scaling Group中的实例数量,管理EC2实例或向S3添加项目之类的命令。 需要警惕的是任何会更改AWS的命令,因为这意味着您的AWS环境现在依赖于Slack安全性。
用法
总体而言,对我来说,这比一个严肃的项目更有趣,但是我发现它对于快速,轻松地显示信息非常有用,特别是因为它允许其他人(包括可能无法访问直接目录的更高版本)资源,以便在需要时轻松获取信息。 我发现这有助于减少向我的团队请求简单信息的次数,这通常会打断其他流程。
(完整的代码位于https://github.com/JulianRunnels/Slackbot,请随意提出任何改进,因为我是一个自学成才的编码人员,该代码可能不是最可靠的)