使用 Go AWS Lambda 函數發送 Slack 通知

WBOY
發布: 2024-07-17 14:03:57
原創
505 人瀏覽過

介紹

在本文中,我們將討論如何建立 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!