AWSラムダ、EventBridge、SNS、SQSを使用してアップタイムモニタを実装します.


AWS EventBridge規則を使用して、特定の時間または設定間隔でラムダ関数をスケジュールすることができます.これらの2つのサービスを組み合わせることにより、膨大なユースケースとワークロードのロックが解除されます.定期的なウェブ仕事からの自動化された毎日のアラームへの何でもEventBridge規則でラムダ機能をスケジューリングすることによってインプリメントされることができます.
この記事では、ウェブサイトの健康をチェックするために5分ごとに実行するラムダ関数をスケジュールします.ラムダ関数は、ウェブサイトサーバと単純なHTTPリクエストを送信します
レスポンスコードをチェックします.応答コードが200でない場合、ラムダ関数は登録されるSNSトピックにアラートメッセージを送ります.これは私が監視し、SaaS、Komonitor警告アラウンドタイムを実装しています.
この記事の唯一の前提条件はAWSアカウントとノード環境を設定しています.

AWSリソースの設定


このセクションでは、AWSコンソールを介して必要なAWSリソースを設定します.

ラムダ関数


まず、我々のウェブサイトの健康をチェックするために使用されるラムダ関数を作成する必要があります.
AWSラムダコンソールに移動し、新しいラムダ関数を作成し、名前を付けます.
それを作成した後に、このようにコンソールで見るべきです:

たった今、関数はHello Worldメッセージを印刷するテンプレートコードだけを持っています.この記事の後半では
ラムダ関数におけるアップタイムチェック論理

Eventbridge規則


5分ごとにラムダ関数をスケジュールするには、EventBridge規則を作成する必要があります.
AWS EventBridgeコンソールに移動し、「規則を作成」ボタンをクリックします.
ルールの詳細ステップでは、ルールの名前を設定し、ルールの種類を設定し、次の手順に進みます.

次の手順では、スケジュールパターンを定義し、5分にレート式を設定します.

さて、このイベントルールのターゲットを選択します.AWSサービスとラムダ関数を選択します.
ドロップダウンでは、以前に作成したラムダ関数はオプションでなければなりません.

これは、イベント規則を設定するために必要なすべての構成です.次の手順を実行し、規則を作成します.
ルールが生成され、ラムダ関数を対象とするように構成されていることを確認するには、ラムダコンソールに移動し、
機能概要で.この規則は、次のような機能の概要と設定タブで表示されます.

SNSトピックとラムダ許可


我々のUpTimeモニターは、SNS話題によって警報を捕えています.SNSコンソールに行き、新しいFIFOトピックを作成します.

ラムダ関数がSNSトピックにメッセージを発行するためには、ラムダ関数のIAMロールを編集し、そのトピックに発行する許可を与える必要があります.
関数のラムダコンソールに戻り、設定タブを選択し、パーミッションを選択します.あなたは
実行役割一覧.それをクリックしてIAMコンソールに移動します.
「許可を追加」をクリックし、インラインポリシーを作成します.

インラインポリシービジュアルエディタで、サービスをSNSに設定し、アクションの下に、フィルタを選択して発行を選択します.

リソースの場合は、SNSトピックarnを入力します.インラインポリシーを保存し、ラムダ実行機能に接続されていることを確認します.

SQSキューとSNSへの購読


我々のラムダがSNS話題にメッセージを発行するときはいつでも、我々は我々の警報を見ることができたいので、我々はSNS話題からメッセージを購読するSWS待ち行列を作成して、AWSコンソールでメッセージを見るのを許します.
SQSコンソールに行き、新しいFIFOキューを作成します.

キューの作成後、キューの概要が表示されます.
アマゾンSNSトピックを購読し、以前に作成したSNSトピックを選択してサブスクリプションを作成します.
SNSトピックに警告メッセージを発行するたびに、これらのメッセージがSQSキューに表示されます.
すべての必要なAWSリソースが設定されます.次のセクションでは、ラムダ関数コードを実装します.

ラムダコード


次に、ラムダ関数で実行されるコードを作成し、アップタイムチェックを行います.
私たちは、JavaScriptでラムダ関数を書き、ノードを使用します.JMランタイム.
システム上に新しいディレクトリを作成し、実行します
npm init
touch index.js
次に、AWS SDKとFETCHパッケージをインストールします.
npm install aws-sdk node-fetch
ESMモジュールを使用するには、package.jsonを開き、"type": "module"を追加します.index.jsを開き、以下のコードを書いてください(自分のウェブサイトURLとsnsのトピックarnに記入してください).
import AWS from "aws-sdk";
import fetch from "node-fetch";

const snsClient = new AWS.SNS();
globalThis.fetch = fetch;

export async function handler(event) {
  try {
    const websiteUrl = "https://www.google.com";
    const uptimeCheckResponse = await fetch(websiteUrl, {
      method: "GET",
      redirect: "follow",
    });

    if (uptimeCheckResponse.status !== 200) {
      // publish to SNS
      const snsResult = await snsClient
        .publish(
          {
            TopicArn:
              "arn:aws:sns:us-east-1:060780781184:Website-Alert-Topic.fifo",
            Message: `Received ${uptimeCheckResponse.status} status code from ${websiteUrl}`,
            MessageGroupId: "Website-Alert-Group",
            MessageDeduplicationId: new Date().getTime().toString(),
            Subject: "Website Down Alert",
          },
          async (err, data) => {
            if (err) {
              console.log(err);
              throw new Error(err);
            }
            console.log(data);
          }
        )
        .promise();
    } else {
      console.log("Website is up!");
    }

    const response = {
      statusCode: 200,
      body: "Lambda function executed successfully!",
    };
    return response;
  } catch (err) {
    // also publish to SNS in case of other errors
    const snsResult = await snsClient
      .publish(
        {
          TopicArn:
            "arn:aws:sns:us-east-1:060780781184:Website-Alert-Topic.fifo",
          Message: "Error: " + err.message,
          MessageGroupId: "Website-Alert-Group",
          MessageDeduplicationId: new Date().getTime().toString(),
          Subject: "Website Down Alert",
        },
        async (err, data) => {
          if (err) {
            console.log(err);
          }
          console.log(data);
        }
      )
      .promise();
    const response = {
      statusCode: 500,
      body: "Lambda function execution failed!",
    };
    return response;
  }
}
この単純な実装では、我々はウェブサイトのURLとSNSトピックarnをハードコード化しました.
一般的に、ラムダ関数や環境変数をトリガーしたイベントからこれらの値を読みたいと思います.
ラムダ関数にコードと依存関係をアップロードするには、ファイルをzipする必要があります.
Linuxでは、
zip -r package.zip . *
このコマンドは現在のディレクトリにpackage.zipファイルを作成します.
ラムダ関数の概要については、コードタブに移動し、コードを含むZIPファイルをアップロードします.

すべてを確認する


ラムダを手動でテストタブで実行できます.
ラムダがそれがモニターしているウェブサイトから200 OKの地位コードを受け取るならば、それはSNS話題にメッセージを公表しません
そして、代わりに、ウェブサイトがそうであるように、ログを記録します:

我々が行動で警報を見たいならば、我々が常に400のステータスコードを得るように、ウェブサイトURLをhttps://httpstat.us/400に変えてください.
新しいzipファイルをラムダ関数に再アップロードし、再度テストします.ラムダ記録は、ウェブサイトがSNS話題にメッセージを発表したということを示します.
メッセージを見るために、キューのためのSQSコンソールに行って、メッセージを送って、受けてください.メッセージの世論調査をクリックしてください、そして、あなたは待ち行列でメッセージを見ることができなければなりません.メッセージの詳細を見るには、このJSONオブジェクトのようになります.
{
  "Type": "Notification",
  "MessageId": "a44c27f8-9c68-507e-8ba9-7d3b45a76115",
  "SequenceNumber": "10000000000000011000",
  "TopicArn": "arn:aws:sns:us-east-1:060780781184:Website-Alert-Topic.fifo",
  "Subject": "Website Down Alert",
  "Message": "Received 400 status code from https://httpstat.us/400",
  "Timestamp": "2022-04-03T17:21:19.940Z",
  "UnsubscribeURL": "<URL>"
}
あなたがキューに上記のようなメッセージを見るならば、あなたのアップタイム・モニターは働いています!複数のURL、領域、およびその他をカバーするために、この単純な実装を拡張してみてください.

クリーンアップ


AWSからランダムな法案を避けるために、我々は作成したリソースをクリーンアップする必要があります.
彼らがもはや必要でないとき、ラムダ機能、EventBridge規則、SNS話題とSQS Queueを削除するようにしてください.