EC2の連続稼働時間をLINEに通知してみた
AWS上のEC2を一定時間操作しなかったら、EC2を自動停止するような運用をしているんですが、CloudWatchのアラーム状態がアラートのままだと正常に自動停止してくれません
頻発する事象ではなかったので放置かましてましたが、今日AWSにログインしたらEC2が三日間稼働しっぱなしでした・・・ont
CloudWatchのアラーム状態がアラート⇒OKになる条件が、EC2を起動したあとのログインなので(ActiveSessionsを監視している為)
EC2を起動するだけしてログインせず放置すると、今回のような事象が発生します
なんで、正常に自動停止してくれなかった時に気が付けるように、EC2の連続稼働時間が12時間and24時間を超えた時にLINEに通知させるようにします
参考手順
手順
カスタムメトリクスの設定(Windows)
※参考手順と被っている個所は省きます
①Systems Manager Run Commandに設定してある、JSONファイルの編集
1.EC2 コンソールのステートマネージャー→既存の設定をチェック→アクション→関連付けの編集
2.パラメータのPropertiesをJSON形式で編集し→関連付けの編集
※JSON
{
"IsEnabled":true,
"EngineConfiguration": {
"PollInterval": "00:00:15",
"Components": [
{
"Id": "ApplicationEventLog",
"FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,
"Parameters": {
"LogName": "Application",
"Levels": "1"
}
},
{
"Id": "SystemEventLog",
"FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,
"Parameters": {
"LogName": "System",
"Levels": "7"
}
},
{
"Id": "SecurityEventLog",
"FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,
"Parameters": {
"LogName": "Security",
"Levels": "7"
}
},
{
"Id": "ETW",
"FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,
"Parameters": {
"LogName": "Microsoft-Windows-WinINet/Analytic",
"Levels": "7"
}
},
{
"Id": "IISLogs",
"FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,
"Parameters": {
"LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
"TimestampFormat": "yyyy-MM-dd HH:mm:ss",
"Encoding": "UTF-8",
"Filter": "",
"CultureName": "en-US",
"TimeZoneKind": "UTC"
}
},
{
"Id": "CustomLogs",
"FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,
"Parameters": {
"LogDirectoryPath": "C:\\CustomLogs\\",
"TimestampFormat": "MM/dd/yyyy HH:mm:ss",
"Encoding": "UTF-8",
"Filter": "",
"CultureName": "en-US",
"TimeZoneKind": "Local"
}
},
{
"Id": "PerformanceCounterMemory",
"FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.
PerformanceCounterInputComponent,
"Parameters": {
"CategoryName": "Memory",
"CounterName": "Available MBytes",
"InstanceName": "",
"MetricName": "Available-Memory",
"Unit": "Megabytes",
"DimensionName": "InstanceId",
"DimensionValue": "{instance_id}"
}
},
{
"Id": "PerformanceCounterCPU",
"FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.
PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"CategoryName": "Processor",
"CounterName": "% Processor Time",
"InstanceName": "_Total",
"MetricName": "CPU",
"Unit": "Percent",
"DimensionName": "InstanceId",
"DimensionValue": "{instance_id}"
}
},
{
"Id": "PerformanceCounterActiveSessions",
"FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.
PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"CategoryName": "Terminal Services",
"CounterName": "Active Sessions",
"InstanceName": "",
"MetricName": "ActiveSessions",
"Unit": "Count",
"DimensionName": "InstanceId",
"DimensionValue": "{instance_id}"
}
},
===================今回追記した部分===================
{
"Id": "PerformanceCounterSystemUpTime",
"FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.
PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"CategoryName": "System",
"CounterName": "System Up Time",
"InstanceName": "",
"MetricName": "SystemUpTime",
"Unit": "Count",
"DimensionName": "InstanceId",
"DimensionValue": "{instance_id}"
}
},
================================================
{
"Id": "CloudWatchLogs",
"FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,
"Parameters": {
"AccessKey": "",
"SecretKey": "",
"Region": "us-east-1",
"LogGroup": "Default-Log-Group",
"LogStream": "{instance_id}"
}
},
{
"Id": "CloudWatch",
"FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,
"Parameters": {
"AccessKey": "",
"SecretKey": "",
"Region": "us-east-1",
"NameSpace": "Windows"
}
}
],
"Flows": {
"Flows":
[
"(ApplicationEventLog,SystemEventLog),CloudWatchLogs",
"(PerformanceCounterActiveSessions),CloudWatch",
===================今回追記した部分===================
"(PerformanceCounterSystemUpTime),CloudWatch"
================================================
]
}
}
}
②カスタムメトリクスが取得できているか確認
カスタムメトリクスの設定(Linux)
※参考手順と被っている個所は省きます
①カスタムメトリクス送信用スクリプトを編集
#!/bin/bash
############ACTIVESESIONS############
#VariableDefine
PROFILE=CloudWatch
METRIC_NAME_1=ActiveSessions ←変数名を変更
METRIC_NAME_2=SystemUpTime ←追加
NAMESPACE=Linux
VALUE_1=$(who | wc -l) ←変数名を変更
VALUE_2=$(cat /proc/uptime | awk '{print $1}') ←追加
UNIT=Count
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
#CLI
aws cloudwatch put-metric-data --profile ${PROFILE} --metric-name ${METRIC_NAME_1}
--namespace ${NAMESPACE} --value ${VALUE_1} --unit ${UNIT} --dimensions "InstanceId=${INSTANCE_ID}" ←変数名を変更
aws cloudwatch put-metric-data --profile ${PROFILE} --metric-name ${METRIC_NAME_2}
--namespace ${NAMESPACE} --value ${VALUE_2} --unit ${UNIT} --dimensions "InstanceId=${INSTANCE_ID}" ←追加
##################################
※コマンド補足
cat /proc/uptime
→「システムが起動してから経過した合計秒数」と「各コアがアイドル状態で経過した合計時間の秒数」が記録されているので、それをcatで確認
awk '{print $1}'
→カスタムメトリクスとして必要なのはシステムが起動してから経過した合計秒数だけなので、パイプでawkコマンドに渡して、一番目のフィールドだけが出力されるようにしている
②カスタムメトリクスが取得できているか確認
LINEへの通知設定
※参考手順と被っている個所は省きます
①CloudWatchの設定
カスタムメトリクスで起動してからの時間を秒数でカウントしているので、秒数が一定数を超えたらアラームが警告になるよう設定
※12時間=43200秒
24時間=86400秒
②Lambdaの設定
1.Lambdaコンソールのダッシュボード→関数の作成
2.一から作成
3.各パラメータを設定→関数の作成
4.各パラメータを設定→モジュールとコードを含んだZIPファイルをアップロード
※コード
#coding:UTF-8
import requests
def lambda_handler(event, context):
url = "https://notify-api.line.me/api/notify"
token = "CH9wwDm7N6zt2WooZoorKccgMT06rkdYbLVbduXCJ2D"
message = ""EC2つけっぱなしにしてない?(12時間連続稼働中)""
stickerPackageId = 2
stickerId = 149
headers = {"Authorization": "Bearer " + token}
payload = {"message" : message , "stickerPackageId" : stickerPackageId, "stickerId" :stickerId}
r = requests.post(url, headers = headers, data = payload)
5.トリガータブ→トリガーを追加
6.各パラメータを指定→送信
7.テストイベントの設定
8.各パラメータを指定→作成
9.テスト
10.実行結果が成功で、LINEに通知が届けばOK
LINE通知例
まとめ
EC2の連続稼働時間程度なら、標準メトリクスとしてAWSが用意してくれてもいいような・・・