LambdaによるEC2のステータスチェックの構築


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

はじめに

EC2が停止した場合にチェックをするLambdaを構築してみました。
本当はDirectConnectのStatusチェックをしてみようと考えてたのですが、会社の環境にDirectConnectの構築がなかったもので、まず手始めにEC2のStatusチェックをするLambdaを構築しました。

構築概要図

リソース構築

"state"を取得しようとしているEC2の構築はスコープ外にします

Lambdaの構築(デフォルトからの変更部分のみ記述)

IAMロール

既存のCloudWatchのロールに追加して、AWS管理のAmazonEC2ReadOnlyAccessを付与(下記画像あり)

コード部分

import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2')

#取得したいEC2のインスタンスの情報を入力(i-XXXXXXXXXX)部分は自分のEC2リソースを確認して入力
    mystatus= ec2.describe_instances(
        Filters=[{'Name':'instance-id', 'Values':['i-XXXXXXXXXX']}] 
    )["Reservations"][0]["Instances"][0]['State']['Name'] 
    print(mystatus)

CloudWatchLogs

Lambdaの出力ログについての画面(EC2が停止中の状態での画面)

停止しているのでLambdaでStateを取得していると、赤枠のような”stopped”が出力される

メトリクスフィルターの設定

ログの"stopped"をメトリクスフィルターに設定して、CloudWatchアラームに紐づけます

CloudWatchの設定内容

"stopped"をトリガーにしてアラームへ通知がなされ、1度以上の場合にアラームを鳴らすように設定しました。
他にもSNSを利用してメールを通知するなども設定が可能です(スクショ撮り忘れ)。

CloudWatchアラームでの見え方

上記設定後にLambdaを動かしてみると、アラーム状態に表示が変更されることが確認できました。

SNSを利用した通知メール

こちらにもアラームが鳴っていることが通知されています。

さいごに

定期的に動作させるためにEventBridgeのCronを利用すれば良さそうです。
DirectConnectの場合ならclient = boto3.client('directconnect')にLambdaを変更すれば、ステータスを確認することも問題なさそうです。

Last modified: 2022-08-21

Author