ホームページ  >  記事  >  バックエンド開発  >  Go AWS Lambda 関数を使用して Slack 通知を送信する

Go AWS Lambda 関数を使用して Slack 通知を送信する

WBOY
WBOYオリジナル
2024-07-17 14:03:57520ブラウズ

導入

この記事では、AWS インスタンスの CPU 使用率が 50% に達したときに Slack 通知を送信する AWS Lambda 関数を作成する方法について説明します。

AWS Lambda は、アマゾン ウェブ サービス (AWS) が提供するサーバーレス コンピューティング サービスです。これにより、サーバーを自分でプロビジョニングしたり管理したりすることなく、コードを実行できます。

これはイベント駆動型です。つまり、s3 で完了したファイルのアップロード、Amazon API Gateway からの HTTP リクエスト、またはその他のさまざまなトリガーなど、他の AWS サービスによってトリガーされたイベントに応答してコードが実行されます。

ここでは、EC2 インスタンスからメトリクスを監視および収集するように Amazon Cloudwatch を設定する方法、それらのメトリクスに基づいて特定のしきい値または条件が満たされたときに通知をトリガーする Cloudwatch アラーム、Amazon Simple Notice サービスを設定する方法について説明します。これらの通知を受信し、最後にラムダ関数が SNS トピックをサブスクライブし、通知を処理して Slack メッセージを送信します。

前提条件

これを読み進めるには、読者は次の基本的な知識と理解を持っている必要があります

  • ゴラン
  • 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 関数

  • まず、Slack に送信されるメッセージ形式を表すために、slackMessage という名前の構造体を作成します。これには、メッセージの内容を保持する単一フィールド Text があります
  • handleRequest 関数は、ラムダ ランタイムによって実行されるメイン関数です。これは、2 つの引数 context と、受信した SNS 通知に関する詳細を含む snsEvent events.SNSEvent を受け取ります。
  • この関数は、snsEvent 内の各 snsRecord を反復処理し、sns.message フィールドからメッセージ コンテンツを取得し、Slack Webhook URL とメッセージ コンテンツを使用して sendSlackNotification を呼び出します

sendSlackNotification 関数

  • この関数は 2 つの引数 webhookURL (Slack 通知が送信される URL) と message: Slack に送信されるメッセージの内容を取ります。
  • 提供されたメッセージに「CPU 使用率が 50% を超えています」という事前定義メッセージを追加しました。 次に、json.marshal.
  • を使用して、slackMessage 構造体を JSON 形式にマーシャリングします。
  • HTTP 投稿リクエストは、Slack Webhook URL、JSON 形式の本文、および application.json に設定されたコンテンツ タイプ ヘッダーを持つ http.NewRequest を使用して作成されます。 *リクエストは http.client を使用して送信され、レスポンスが受信されます main 関数はローカル テストにのみ使用されます。 lambda 環境では、lamba.start 関数が handleRequest をエントリ ポイントとして自動的に呼び出されます

Slack Webhook URL の取得

Slack にメッセージを送信できるようにする Slack Webhook URL を取得するには、https://api.slack.com/apps に移動します。続行する前に、Slack アカウントにサインインしていることを確認してください。

  • 右上の「新しいアプリを作成」をクリックします ダイアログボックスが表示されます。新しいアプリを作成するには、「最初から」を選択します。 その後、別のダイアログ ボックスが表示されます。ここで、アプリに「cpu-alert」という名前を付けて、メッセージを送信する特定の Slack ワークスペースを選択できます。すでにテスト ワークスペース「サイト信頼性テスト」を作成しました
  • 「アプリを作成」をクリックします
  • 「機能の追加」セクションで「受信 Webhook」を選択します
  • 受信 Webhook のアクティブ化ボタンを「オン」に切り替えます。 もう一度戻って、「アプリのインストール セクション」までスクロールします
  • 「ワークスペースにインストール」をクリックすると、Slack にメッセージを送信するチャネルを選択します。次に、「許可」をクリックします。
  • 「機能と機能の追加」に戻り、「受信 Webhook」を選択します
  • 下にスクロールして Webhook URL を見つけ、それをコピーしてコードに貼り付けます。

次のステップは、Go アプリの展開パッケージを作成することです
アプリケーションを構築していきます。

  • プロジェクトの作業ディレクトリでターミナルを開きます。run GOOS=linux go build -o main main.go
  • 「ブートストラップ」ファイルを作成する 次の内容を含む「bootstrap」という名前のファイルをプロジェクトのルート ディレクトリに作成します。
#!/bin/sh 
./main

ブートストラップ ファイルを実行可能にする

  • chmod +x ブートストラップを実行する
  • zip function.zip main bootstrap を実行して、実行可能ファイルとブートストラップ ファイルを圧縮します。

lamba 関数のアップロード

  • AWS 管理コンソールに移動します
  • ラムダを検索し、新しい関数を作成します
  • 任意の名前を付けます
  • 「最初から作成する」を選択します
  • ランタイムとして、Amazon linux 2023 を選択します
  • 機能の選択をクリック
  • 機能の作成が完了したら、下にスクロールして「アップロード元」オプションを見つけます
  • コードを含むフォルダー全体ではなく、function.zip ファイルを選択してください
  • 保存します
  • ランタイム設定セクションを見つけて、[編集] をクリックします
  • ハンドラーをブートストラップに設定して保存します

次のステップでは、Lambda 関数のトリガーを設定します。このトリガーは、関数にメッセージを Slack

に送信するよう促すイベントを定義します。

前に述べたように、そのトリガーは仮想マシンの CPU 使用率が 50% 以上になった場合です

この機能を実現するには、最初のステップとして EC2 インスタンスを作成します。

これが完了したら、メトリクスを監視および収集するように Cloudwatch を設定する必要があります

  • Cloudwatch を検索して開きます
  • アラームの作成を選択します
  • 指標の選択を選択
  • EC2 を選択
  • インスタンスごとのメトリクスを選択
  • CPU使用率メト​​リクスを選択

コンディションセクション内

  • しきい値として「大きい/等しい」を選択します
  • しきい値を「50」として定義します
  • 「次へ」をクリック 次のページで通知セクションを見つけます
  • アラーム状態のトリガーは「アラーム中」のままにしておきます
  • 「新しいトピックの作成」オプションを選択します
  • 一意の名前を入力します。通知を受け取る電子メールを入力することもできます
  • トピックの作成を選択します
  • 次のページで、一意のアラーム名を入力します 次にアラームを作成します

ラムダ関数に戻ります

  • 「トリガーの追加」を選択します
  • 「ソースを選択」フィールドで「sns」を検索して選択します
  • 前に作成したトピックを選択し、「追加」をクリックします ### テスト シンプルなインフラストラクチャのさまざまな部分の組み立てが完了したので、今度はテストします。

これが機能することをテストするには、VM に一種のストレス テストを行う必要があります。このテストでは、高い CPU 負荷が発生します。このテストを実行するには、Linux の「stress」ツールを使用します。

何よりもまず、EC2 inatance に「stress」ツールをインストールする必要があります。EC2 インスタンスに接続し、次のコマンドを実行します
sudo apt-get update
sudo apt-get インストールストレス
次のコマンドを使用して CPU のストレス テストを行います
ストレス --cpu 4 --timeout 300
この例では、4 つの CPU ワーカー (並列プロセスまたはスレッドの数) を 300 秒 (5 分) 使用します。ワーカー数とセカンダ数はご希望に応じて調整できます。

Slack を開いて待つと、次のようなアラートが表示されます

Image description

遭遇する可能性のある一般的なエラー

ストレス テストの実行中に、Cloudwatch の状態が「データ不足」に変化することに気づく場合があります。これにより、アラームが少し遅れる可能性があります。これを修正するには

  • Cloudwatch コンソールを開きます
  • アラームに移動し、特定のアラームを選択します
  • アクションをクリックして編集します
  • 欠損データの処理セクションまで下にスクロールします
  • 「欠落データを無視する(現在の状態を維持する)」を選択します
  • アラームを保存する ### 結論 これまで、Go で単純な Lambda 関数を作成して設定する方法を検討してきました。さらに、メトリクスを監視および収集するように CloudWatch を設定し、特定のしきい値に達したときにトリガーされるように CloudWatch アラームを設定し、これらのアラームを受信するための SNS トピックを確立しました。 SNS トピックの目的は、Slack メッセージを送信する Lambda 関数をトリガーすることです。

これは楽しくて有益だと感じていただけたと思います。間違いがある場合、明確に説明されていない部分がある場合、または何かを見逃していると思われる場合は、お気軽にご連絡ください。あなたのフィードバックは非常に貴重です。ありがとうございます!

github リポジトリへのリンクはここにあります

以上がGo AWS Lambda 関数を使用して Slack 通知を送信するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。