首页  >  文章  >  后端开发  >  使用 Go AWS Lambda 函数发送 Slack 通知

使用 Go AWS Lambda 函数发送 Slack 通知

WBOY
WBOY原创
2024-07-17 14:03:57614浏览

介绍

在本文中,我们将讨论如何创建 AWS lambda 函数,以便在 AWS 实例的 CPU 利用率达到 50% 时发送 Slack 通知。

AWS Lambda 是 Amazon Web Services (AWS) 提供的无服务器计算服务。它允许您运行代码,而无需自己配置或管理服务器。

它是事件驱动的,即您的代码执行以响应其他 AWS 服务触发的事件,例如在 s3 中完成的文件上传、来自 Amazon API Gateway 的 HTTP 请求或各种其他触发器。

在此,我们将讨论如何设置 Amazon Cloudwatch 来监控和收集 EC2 实例的指标,基于这些指标的 Cloudwatch 警报在满足特定阈值或条件时触发通知,Amazon Simple Notification 服务接收这些通知,最后是一个订阅 SNS 主题的 lambda 函数,该函数将处理通知并发送一条 slack 消息。

先决条件

为了理解这一点,读者应该有基本的知识和理解

  • Golang
  • AWS 及其服务 ### 设置项目 首先,我们将首先编写将这些通知发送到 Slack 的函数。

创建一个新的go项目,随意命名,我在你的main.go文件中将我的命名为“lambdaFunction”,粘贴以下代码

import (
   "bytes"
   "context"
   "encoding/json"
   "fmt"
   "github.com/aws/aws-lambda-go/events"
   "github.com/aws/aws-lambda-go/lambda"
   "net/http"
)

type slackMessage struct {
   Text string `json:"text"`
}

func handleRequest(ctx context.Context, snsEvent events.SNSEvent) error {
    webhookURL := "https://hooks.slack.com/services/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"
    for _, record := range snsEvent.Records {
        snsRecord := record.SNS
        sendSlackNotification(webhookURL, snsRecord.Message)
    }
    return nil
}

func sendSlackNotification(webhookURL, message string) {
   slackMessage := slackMessage{Text: "Cpu usage is above 50%" + message}
   slackBody, _ := json.Marshal(slackMessage)
   req, err := http.NewRequest(http.MethodPost, webhookURL, bytes.NewBuffer(slackBody))
   if err != nil {
      fmt.Printf("Error creating request: %v\n", err)
      return
   }
   req.Header.Set("Content-Type", "application/json")

   client := &http.Client{}
   resp, err := client.Do(req)
   if err != nil {
      fmt.Printf("Error sending request: %v\n", err)
   }
   defer resp.Body.Close()
   if resp.StatusCode != http.StatusOK {
      fmt.Printf("Error response from slack: %v\n", resp.StatusCode)
   } else {
      fmt.Printf("Successfully sent Slack notification: %v\n", resp.StatusCode)
   }
}



func main() {
   lambda.Start(handleRequest)
}

运行 go mod

让我们尝试了解发生了什么
handleRequest 函数

  • 首先,我们创建一个名为 slackMessage 的结构体来表示发送到 Slack 的消息格式,它有一个单独的文本字段,用于保存消息内容
  • handleRequest 函数是 lambda 运行时执行的主要函数。它接受两个参数上下文和 snsEvent 事件。SNSEvent 包含有关传入 SNS 通知的详细信息。
  • 该函数迭代 snsEvent 中的每个 snsRecord,它从 sns.message 字段中检索消息内容,并使用 slack webhook URL 和消息内容调用 sendSlackNotification

sendSlackNotification 函数

  • 该函数有两个参数 webhookURL:发送 Slack 通知的 URL 和 message:要发送到 Slack 的消息内容。
  • 我提供了一条预定义消息“CPU 使用率高于 50%”,附加到所提供的消息中。 然后,它使用 json.marshal 将 slackMessage 结构编组为 JSON 格式。
  • 使用 http.NewRequest 创建 HTTP post 请求,其中包含 slack webhook URL、JSON 格式的正文以及设置为 application.json 的内容类型标头 *使用http.client发送请求并接收响应 main函数仅用于本地测试。在 lambda 环境中,lamba.start 函数会自动调用,并以 handleRequest 作为入口点

获取 Slack Webhook URL

要获取允许您向 Slack 发送消息的 Slack Webhook URL,请导航至 https://api.slack.com/apps。在继续之前,请确保您已登录 Slack 帐户。

  • 点击右上角的“创建新应用程序” 将出现一个对话框。选择“从头开始”创建一个新应用程序。 随后,将弹出另一个对话框。在这里,您可以将应用程序命名为“cpu-alert”,然后选择要发送消息的特定 Slack 工作区。我已经创建了一个测试工作区“站点可靠性测试”
  • 点击“创建应用”
  • 在“添加特性和功能”部分中选择“传入 webhooks”
  • 将激活传入 webhook 按钮切换为“打开” 再次导航回来并滚动到“安装应用程序部分”
  • 点击“安装到工作区”,然后我们将选择希望 Slack 向其发送消息的频道。然后点击允许。
  • 返回“添加特性和功能”并选择“传入 webhooks”
  • 向下滚动找到我们的 webhook URL,然后将其复制并粘贴到我们的代码中。

下一步是为我们的 Go 应用创建部署包
我们将构建该应用程序。

  • 在项目工作目录中打开终端。run GOOS=linux go build -o main main.go
  • 创建一个“引导”文件 在项目根目录下创建一个名为“bootstrap”的文件,内容如下
#!/bin/sh 
./main

使引导程序文件可执行

  • 运行 chmod +x bootstrap
  • 通过运行 zip 函数压缩可执行文件和引导程序文件.zip main bootstrap

上传lamba函数

  • 导航到 AWS 管理控制台
  • 搜索 lambda,并创建一个新函数
  • 给它一个您选择的名称
  • 选择“从头开始创作”
  • 对于运行时,选择 Amazon linux 2023
  • 点击选择功能
  • 该功能完成后,创建向下滚动并找到“上传自”选项
  • 选择您的 function.zip 文件,而不是包含代码的整个文件夹
  • 保存
  • 找到运行时设置部分并单击编辑
  • 将处理程序设置为引导并保存

在下一步中,我们将为 Lambda 函数配置触发器。该触发器定义了将提示函数向 Slack

发送消息的事件

正如我之前提到的,当虚拟机的 CPU 使用率 >= 50% 时触发

要实现此功能,第一步涉及创建 EC2 实例。

完成后,我们需要配置 Cloudwatch 来监控和收集指标

  • 搜索Cloudwatch并打开
  • 选择创建闹钟
  • 选择选择指标
  • 选择 ec2
  • 选择每个实例指标
  • 选择 CPUUtilization 指标

在条件部分

  • 选择大于/等于阈值
  • 将阈值定义为“50”
  • 点击下一步 在下一页上找到通知部分
  • 我们将保留警报状态触发器,因为它处于“警报中”
  • 选择“创建新主题”选项
  • 输入唯一的名称,您也可以输入电子邮件来接收通知
  • 选择创建主题
  • 在下一页输入唯一的警报名称 然后创建闹钟

我们将回到我们的 lambda 函数

  • 选择“添加触发器”
  • 在“选择来源”字段中,搜索“sns”并选择它
  • 选择您之前创建的主题,然后单击“添加” ### 测试 我们已经完成了简单基础设施的不同部分的组装,现在是时候进行测试了。

为了测试这是否有效,我们需要对我们的虚拟机进行某种压力测试。此测试会产生高 CPU 负载。为了执行此测试,我们将使用 Linux 中的“stress”工具。

首先,我们需要在 EC2 inatance 中安装“stress”工具。连接到 EC2 实例并运行以下命令
sudo apt-get update
sudo apt-get install 压力
使用以下命令对你的CPU进行压力测试
压力 --cpu 4 --超时 300
此示例使用 4 个 CPU 工作线程(并行进程或线程的数量)持续 300 秒(5 分钟)。您可以根据自己的需要调整工人和辅助人员的数量。

打开 Slack 并等待,您应该会收到如下所示的警报

Image description

您可能遇到的常见错误

在运行压力测试时,您可能会注意到 Cloudwatch 的状态更改为“数据不足”,这可能会导致警报延迟一点。要解决这个问题

  • 打开 Cloudwatch 控制台
  • 导航至闹钟并选择您的特定闹钟
  • 点击操作然后编辑
  • 向下滚动至缺失数据处理部分
  • 选择“将丢失的数据视为忽略(保持当前状态)”
  • 保存闹钟 ### 结论 到目前为止,我们已经探索了如何在 Go 中编写和设置一个简单的 Lambda 函数。此外,我们还配置了 CloudWatch 来监控和收集指标,设置 CloudWatch 警报以在满足特定阈值时触发,并建立了一个 SNS 主题来接收这些警报。 SNS 主题的目的是触发我们的 Lambda 函数,该函数发送一条 Slack 消息。

我相信您会觉得这很有趣并且内容丰富。如果有任何错误或任何部分没有解释清楚,或者您认为我遗漏了某些内容,请随时与我们联系。您的反馈非常有价值。谢谢!

可以在此处找到 github 存储库的链接

以上是使用 Go AWS Lambda 函数发送 Slack 通知的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn