元パチ屋店員NWエンジニアの技術ブログ

元パチ屋店員NWエンジニアが技術のアウトプット化を目的に、好き勝手な事を書いてるブログです

EC2の連続稼働時間をLINEに通知してみた

f:id:hayato-ota-rf:20171023025805p:plain

AWS上のEC2を一定時間操作しなかったら、EC2を自動停止するような運用をしているんですが、CloudWatchのアラーム状態がアラートのままだと正常に自動停止してくれません
頻発する事象ではなかったので放置かましてましたが、今日AWSにログインしたらEC2が三日間稼働しっぱなしでした・・・ont
CloudWatchのアラーム状態がアラート⇒OKになる条件が、EC2を起動したあとのログインなので(ActiveSessionsを監視している為)
EC2を起動するだけしてログインせず放置すると、今回のような事象が発生します
なんで、正常に自動停止してくれなかった時に気が付けるように、EC2の連続稼働時間が12時間and24時間を超えた時にLINEに通知させるようにします

参考手順

raptor-falcon.hatenablog.com

 

raptor-falcon.hatenablog.com

 

raptor-falcon.hatenablog.com

手順

カスタムメトリクスの設定(Windows

※参考手順と被っている個所は省きます

①Systems Manager Run Commandに設定してある、JSONファイルの編集

1.EC2 コンソールのステートマネージャー→既存の設定をチェック→アクション→関連付けの編集

f:id:hayato-ota-rf:20171022230822p:plain

2.パラメータのPropertiesをJSON形式で編集し→関連付けの編集

f:id:hayato-ota-rf:20171022231155p:plain

JSON

{

"IsEnabled":true,

"EngineConfiguration": {

  "PollInterval": "00:00:15",

  "Components": [

    {

      "Id": "ApplicationEventLog",

      "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,

AWS.EC2.Windows.CloudWatch",

      "Parameters": {

        "LogName": "Application",

        "Levels": "1"

      }

    },

    {

      "Id": "SystemEventLog",

      "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,

AWS.EC2.Windows.CloudWatch",

      "Parameters": {

        "LogName": "System",

        "Levels": "7"

      }

    },

    {

      "Id": "SecurityEventLog",

      "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,

AWS.EC2.Windows.CloudWatch",

      "Parameters": {

        "LogName": "Security",

        "Levels": "7"

      }

    },

    {

      "Id": "ETW",

      "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,

AWS.EC2.Windows.CloudWatch",

      "Parameters": {

        "LogName": "Microsoft-Windows-WinINet/Analytic",

        "Levels": "7"

      }

    },

    {

      "Id": "IISLogs",

      "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,

AWS.EC2.Windows.CloudWatch",

      "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,

AWS.EC2.Windows.CloudWatch",

      "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,

             AWS.EC2.Windows.CloudWatch",

      "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,

AWS.EC2.Windows.CloudWatch",

      "Parameters": {

        "AccessKey": "",

        "SecretKey": "",

        "Region": "us-east-1",

        "LogGroup": "Default-Log-Group",

        "LogStream": "{instance_id}"

      }

    },

    {

      "Id": "CloudWatch",

      "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,

AWS.EC2.Windows.CloudWatch",

      "Parameters": {

        "AccessKey": "",

        "SecretKey": "",

        "Region": "us-east-1",

        "NameSpace": "Windows"

      }

    }

  ],

  "Flows": {

    "Flows":

    [

      "(ApplicationEventLog,SystemEventLog),CloudWatchLogs",

      "(PerformanceCounterActiveSessions),CloudWatch",

===================今回追記した部分===================

      "(PerformanceCounterSystemUpTime),CloudWatch"

================================================

    ]

  }

 }

}

②カスタムメトリクスが取得できているか確認

f:id:hayato-ota-rf:20171022235701p:plain

カスタムメトリクスの設定(Linux

※参考手順と被っている個所は省きます

①カスタムメトリクス送信用スクリプトを編集

vi /home/hayato/cloudwatch cloudwatch

#!/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コマンドに渡して、一番目のフィールドだけが出力されるようにしている

 

②カスタムメトリクスが取得できているか確認

f:id:hayato-ota-rf:20171023012806p:plain

LINEへの通知設定

※参考手順と被っている個所は省きます

①CloudWatchの設定

カスタムメトリクスで起動してからの時間を秒数でカウントしているので、秒数が一定数を超えたらアラームが警告になるよう設定

f:id:hayato-ota-rf:20171023014542p:plain

※12時間=43200秒

 24時間=86400秒

②Lambdaの設定

1.Lambdaコンソールのダッシュボード→関数の作成

f:id:hayato-ota-rf:20171023015950p:plain

2.一から作成

f:id:hayato-ota-rf:20171023020056p:plain

3.各パラメータを設定→関数の作成

f:id:hayato-ota-rf:20171023020341p:plain

4.各パラメータを設定→モジュールとコードを含んだZIPファイルをアップロード

f:id:hayato-ota-rf:20171023022254p:plain

※コード

#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.トリガータブ→トリガーを追加

f:id:hayato-ota-rf:20171023022410p:plain

6.各パラメータを指定→送信

f:id:hayato-ota-rf:20171023022503p:plain

7.テストイベントの設定

f:id:hayato-ota-rf:20171023023800p:plain

8.各パラメータを指定→作成

f:id:hayato-ota-rf:20171023023559p:plain

9.テスト

f:id:hayato-ota-rf:20171023023904p:plain

10.実行結果が成功で、LINEに通知が届けばOK

f:id:hayato-ota-rf:20171023024055p:plain

LINE通知例

f:id:hayato-ota-rf:20171023025147p:plain

まとめ

EC2の連続稼働時間程度なら、標準メトリクスとしてAWSが用意してくれてもいいような・・・