AWS

CloudWatch AlarmをSlackに通知

AWS

@see
https://qiita.com/taquaki-satwo/items/c9c196c1642cad626661

 

AWS SNSの作成

Amazon SNS -> トピック -> トピックの作成

 

  • 名前
    hoge-cloudwatch-alarm
  • 表示名
    hoge CloudWatch alarm

 

サブスクリプションの作成

トピック -> 作成したトピックを選択 -> サブスクリプションの作成

プロトコル Eメール
エンドポイント <通知したいメールアドレス>

-> サブスクリプションの作成

確認メールの Confirm subscription をクリック

 

テスト配信

トピック -> 作成したトピックを選択 -> メッセージの発行

項目 設定
件名 SNS-test-message
メッセージ本文 テスト配信です

-> メッセージの発行

 

AWS Cliのインストール

$ brew install awscli

 

$ aws --version
aws-cli/1.16.261 Python/2.7.10 Darwin/18.7.0 botocore/1.12.251

 

$ aws configure --profile kanehiro-cloudwatch

AWS Access Key ID [None]: xxxxxxxxxx
AWS Secret Access Key [None]: yyyyyyyyy
Default region name [None]: ap-northeast-1
Default output format [None]: json

 

確認

$ aws configure list --profile kanehiro-cloudwatch
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile      kanehiro-cloudwatch           manual    --profile
access_key     ****************xxx shared-credentials-file
secret_key     ****************yyy shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

 

 

アラーム作成

CloudWatch -> アラーム -> アラーム作成

  • メトリクス
項目 設定
インスタンス名 <任意のRDSインスタンス>
メトリクス名 CPUUtilization

-> 次へ

  • 条件

次の項目はお好みで。

項目 設定
よりも 70
アラームを実行するデータポイント 3/3

-> 次へ

 

 

アラーム名
hoge-DB-CPUUtilization-check

アラームの説明 – オプション
DBインスタンスのCPU使用率が70%を超えました

 

テスト

aws cloudwatch set-alarm-state --alarm-name "ec2-CPUUtilization-check" --state-value ALARM --state-reason "alarm-test" --profile <事前準備で設定したProfile名>

コマンドオプション

オプション 説明
–alarm-name アラーム名
–state-value ステータス
–state-reason アラームの説明

 

3. Incoming WebHooksの設定

https://slack.com/apps/A0F7XDUAZ–incoming-webhook- -> Add to Slack

 

Post to Channel 通知したいSlackチャンネル
Customize Name CloudWatch アラーム

-> Webhook URLを コピーしておく

 

Lambda

関数の作成

設計図の使用 -> cloudwatch-alarm-to-slack-python

トリガーにSNSのトピック名「hoge-cloudwatch-alarm」を指定する

 

EC2用Lambda

import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError


# The base-64 encoded, encrypted key (CiphertextBlob) stored in the kmsEncryptedHookUrl environment variable
# ENCRYPTED_HOOK_URL = os.environ['kmsEncryptedHookUrl']
# The Slack channel to send a message to stored in the slackChannel environment variable
SLACK_CHANNEL = os.environ['slackChannel']
HOOK_URL = os.environ['hookUrl']

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message))

    instanceid = message['Trigger']['Dimensions'][0]['value']
    alarm_name = message['AlarmName']
    new_state = message['NewStateValue']
    reason = message['NewStateReason']
    alarm_description = message['AlarmDescription']

    slack_message = {
        'channel': SLACK_CHANNEL,
        'text': "<!channel> \nアラーム名: %s\nステータス: %s\nアラーム理由: %s\n説明: %s\nインスタンス: %s" % (alarm_name, new_state, reason, alarm_description, instanceid)
    }

    req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8'))
    try:
        response = urlopen(req)
        response.read()
        logger.info("Message posted to %s", slack_message['channel'])
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)

タイムアウトは10秒

環境変数の

  • slackChannel
    通知したいスラックチャンネル名 // #は含まない
  • hookUrl
    Slackのwebhook URL

 

テスト

$ aws cloudwatch set-alarm-state --alarm-name "ec2-CPUUtilization-check" --state-value ALARM --state-reason "alarm-test" --profile <事前準備で設定したProfile名>

 

SES用Lamda関数

import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError


# The base-64 encoded, encrypted key (CiphertextBlob) stored in the kmsEncryptedHookUrl environment variable
# ENCRYPTED_HOOK_URL = os.environ['kmsEncryptedHookUrl']
# The Slack channel to send a message to stored in the slackChannel environment variable
SLACK_CHANNEL = os.environ['slackChannel']
HOOK_URL = os.environ['hookUrl']

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message))

    alarm_name = message['AlarmName']
    new_state = message['NewStateValue']
    reason = message['NewStateReason']
    alarm_description = message['AlarmDescription']

    slack_message = {
        'channel': SLACK_CHANNEL,
        'text': "<!channel> \nアラーム名: %s\nステータス: %s\nアラーム理由: %s\n説明: %s\n" % (alarm_name, new_state, reason, alarm_description)
    }

    req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8'))
    try:
        response = urlopen(req)
        response.read()
        logger.info("Message posted to %s", slack_message['channel'])
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)

タイムアウトは10秒

環境変数の

  • slackChannel
    通知したいスラックチャンネル名 // #は含まない
  • hookUrl
    Slackのwebhook URL

Lambda関数のデバッグ

アラームの閾値を下げて、Lambdaを発火させてCloudWachのログを見てください。

def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message))

+   print(message)

print(message)とかやってCloudWatchのログを見る

 

自己責任で外部サイトなどでJSONの整形して見るとコーディングしやすい。下記サイトはシングルクォートでも整形してくれる。

https://www.en-pc.jp/tech/jsonformat.php#result

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)