Edited at

Slackにアラート通知(CloudWatch+SNS+Lambda+incoming-webhook)

More than 1 year has passed since last update.


目的

サーバのアラートをSlackの特定の部屋に投稿したい


使用サービス


  • slack

  • incoming-webhook(slack apps)

  • cloudwatch(aws)

  • sns(aws)

  • lambda(aws)

  • iam(aws)

  • ec2(aws)


要件

サンプルとしてCPU使用率が閾値を超えたらSlackの部屋に投稿するという機能を作成する


設定その1:incoming-webhook

"Make a Custom Integration"から"Incoming Webhooks"でWebhooksを作成。外部から Slack へ投稿する手段として"incoming-webhook"を使用。左のメニューから”Apps&Integrations”を選択。ブラウザで”AppDirectory”ページが表示されるので"incoming-webhook"を検索して"Add Configuration"を実行。設定は以下のようにする



  • Integration Settings


    • Post to Channel:任意のSlackチャンネル

    • Webhook URL:コピーしておく(Lambdaコード内で使用する)

    • Descriptive Label:特になし

    • Customize Name:必ず変える必要はない

    • Customize Icon:必ず変える必要はない

    • Preview Message:必ず変える必要はない




接続テスト

"incoming-webhook"を組み込んだだけでSlackに投稿可能であるか確認する

端末エミュレータから以下接続テストコマンド(curl ~)を実行する

image


設定その2:SNSのTopic作成

プッシュ通知サービスAmazon Simple Notification Serviceを設定する。CloudWatchでアラート発生したらSNSのTopicに連携されLambdaでコードを実行できるようにする。SNSは細かい設定は必要なくTopicを作成するだけで良い。



  • ”SNS DashBoard”→"Create Topics"


    • Topic name "EC2_CPU_Util"

    • Display name "EC2_CPU_Util"
      上記入力完了したら"Create topic"を押下



image


  • Topic detail: EC2_CPU_Util画面で"Publish to topic"を押下


設定その3:CloudWatchのアラーム作成

"Cloudwatch"→"xxx_dashboard"(なければ作成)→"アラームの作成"→"EC2メトリクス"から任意のインスタンスIDを検索→当該インスタンスの"CPUUtilization (CPUUtilization)"を選択し以下のように入力


  • アラームのしきい値

    名前:CPU_Utilization

    説明:CPU_Utilization

    次の時:CPUUtilization (CPUUtilization)

    が:>=10

    を:1回連続した場合

    ※アラートを意図的に発報させるため閾値は低く設定しておく。本番の場合は別途考慮する。


  • アクション

    通知

    アラームが次の時: 状態:OK

    通知の送信先: EC2_CPU_Util ※SNSTopic


通知

アラームが次の時: 状態:OK

通知の送信先: EC2_CPU_Util_Email

メールリスト:hoge@alertmail.jp

通知

アラームが次の時: 状態:警告

通知の送信先: EC2_CPU_Util ※SNSTopic

通知

アラームが次の時: 状態:警告

通知の送信先: EC2_CPU_Util_Email

メールリスト:hoge@alertmail.jp

※通知を追加する場合は"+通知"を押下


  • アラームのプレビュー

インスタンス ID (Instance­Id): 任意のインスタンスID

インスタンス名:任意のインスタンス名

メトリクス名:CPUUtilization

間隔:5分間

統計: Standard

平均

image


設定その4:Lambda functionの作成

"Dashboard"→"Create a Lambda function"→"Configure triggers"→□をクリックしSNSを探し選択。SNS topic"EC2_CPU_Util"を選択→"Enable trigger"にチェックを入れ"Next"を押下→"Configure function"で以下のように設定する

image

Configure function

- Name: Func_Alert_CPU_Util

- Description: Alert_CPU_Util

- Runtime: Python 2.7

- Handler: lambda_function.lambda_handler

Lambda function code

- Code entry type: Edit code inline

import urllib

def lambda_handler(event, context):
endpoint = 'https://hooks.slack.com/services/XXXX/XXXX/XXXX'
parameter = urllib.urlencode({"payload": {"text": "ALERT:CPU Utilization"}})
function = urllib.urlopen(endpoint, parameter)
print function.read()
return

Lambda function handler and role

- lambda_function.lambda_handler

- Choose an existing role

- service-role/lambda_exec_role ※IAMで作成してあること

Advanced settings

- Memory (MB): 128

- Timeout 0 min 3 sec

DLQ Resource

- なし

VPC

- No VPC

KMS key

- (default)aws/lambda

"Next" → "Create function"でLambdafunctionの作成完了

"Triggers"→”Test”を実行

image


設定その5:SNSのSubscription作成


  • Lambda連携用

    Topic ARN:arn:aws:sns:ap-northeast-1:XXX:EC2_CPU_Util ※作成したSNSTopicのARNを入力

    Protocol:AWS Lambda

    Endpoint:arn:aws:lambdaxxxfunctionname ※上のプロトコルを選ぶと自動入力される

    Version or alias:default


  • Email連携用

    Topic ARN:arn:aws:sns:ap-northeast-1:XXX:EC2_CPU_Util_Email ※作成したSNSTopicのARNを入力

    Protocol:Email

    Endpoint:通知先メールアドレスを入力

    Version or alias:default


上記を入力したら"create subscription"を入力

image


実行・確認


  • 意図的にCPU負荷を上昇させる。※1回で足りなければ並列で実行

# 負荷開始

$ yes >> /dev/null &
[1] 18593
# 負荷停止
$ kill -9 18593
[1]+ Killed yes >> /dev/null


  • CloudWatchでCPU使用率を確認

    閾値を超えていることを確認


  • Emailにアラートが届いていることを確認


  • Slackの指定したチャンネルにアラートが投稿されていることを確認


image