はじめに
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を変更すれば、ステータスを確認することも問題なさそうです。