AWS Lambdaでヘルスチェックを行う手順

はじめに

Webサービスを開発していると、サイトが正常に動作しているかを定期的に監視したい場合があります。
これは外形監視・ヘルスチェックなどと呼ばれています。

方法としては、何らかの外部のサーバーで監視スクリプトを実行する方法が一般的です。単純なもので良ければRoute53のヘルスチェックなどでも楽でしょう。

私の場合、これまでConoHaのVPSを借りて、そこで5分ごとにスクリプトを実行していました。
しかし内容は、 HTTP リクエストを送って、応答データが期待値かどうかをチェックするのみで、VPSのスペックは全く使用しきっておらず、勿体ない状況でした。

ほぼ何も使ってないVPSのグラフ

そのため、AWS Lambdaでコスト削減をしたいと思います。料金は月50円に届かないレベルになると思います。月1000円→月50円ですから大幅な削減です。(大幅か?チリツモか?)
ちなみに、今回はAWSを使用していますが、GCPやAzureにも似たようなサービスはあります。

手順

レイヤーを作成

レイヤーというものを作ります。要するに実行環境の設定です。

    1. 適当なディレクトリにpythonというディレクトリを作成し、必要なパッケージをインストール

    Lambda の python は実行環境に python というディレクトリを使用します。
    固定のため、このディレクトリ名を使用します。

      mkdir python
      cd python
      pip install -t ./ --no-user requests

      2. zipに固める

      3. Lambda > レイヤー

      AWSにログインし、Lambdaからレイヤーを開きます。

        4. レイヤーの作成

        5. 作成

        基本事項を記入し、先ほど作成したzipをアップロードします。

        6. 完成

        これでレイヤーは作成完了です。

        関数を作成

        次に実行するプログラム(関数)を作成します。

        1. Lambda -> 関数の作成

        2. 名前を設定

        ここではPythonで実行します。ヘルスチェックと言えばPythonです(知らんけど)
        詳細設定等は無し

        3. トリガーを追加

        定期実行するためトリガーを追加します。

        4. EventBridgeを設定

        定期実行は「EventBridge」を使用します(この名前じゃ分からないよ・・・)。
        Schedule expression は「rate(5 minutes)」と書きます。これで5分毎実行の設定となります。cronフォーマットでも設定可能です。

        5. レイヤーを追加

        Lambdaのページの一番下にあります。

        6. 自分で作成したレイヤーを追加

        zipで作成したレイヤーを指定します

        7. コードを書く

        lambda_handler がメイン関数のため、ここから他のスクリプトを実行する構成としました。
        health_check.py の test() 関数を呼び出し、実行しています。
        エラーの場合の通知はコードにべた書きです。discord の webhook に投げます。

        import json
        import health_check # <=== 別ファイルをインポート

        def lambda_handler(event, context):
        # TODO implement
        health_check.test() # <=== 別ファイルの関数を実行
        return {
        'statusCode': 200,
        'body': 'success'
        }
        import requests

        def test():
        try:
        print("-----holiday-----")
        response = requests.get('https://api.excelapi.org/datetime/holiday?date=43954', verify=True)
        if response.text != "憲法記念日":
        logger("error: holiday")
        logger(response.text)

        except Exception as e:
        print("error: exception")
        print(e)
        logger(e)

        def logger(name, text):
        print("logger start")
        requests.post('https://discord.com/api/webhooks/********/********', {
        "username": name,
        "content": text,
        }
        )

        if __name__ == '__main__':
        test()

        8. 動作テスト

        Test ボタンをクリックしてテストします。
        入力フォームが出てきた場合は適当に名前を付けます。

        9. デプロイ

        問題なく使用できていれば、デプロイします。

        これで完了です。

        モニタリングでエラーが発生していないか、実サーバー上でリクエストが届いているか確認しましょう。

        その他

        タイムアウトが短すぎて失敗する

        この場合、基本設定からタイムアウトを長くします。
        あまりに長くすると、エラー時にコストがエグイことになります。

        参考

        27円/月で運用できるAWS Lambda を用いたウェブサイトの外形監視 | ゴミ人間.com
        ## ウェブサイトの外形監視とは? ウェブサイトがユーザーからきちんと閲覧できるかどうかを監視するという至極単純なものが「ウェブサイトの外形監視」です。外形というワードが入っているとおり、ユーザー側から名前解決を正常に行うことができ、宛先にきちんとリクエストを行え、妥当な時間内に正常なレスポンスを受け取ることができる...

        コメント

        タイトルとURLをコピーしました