CloudWatch
SNS
lambda
Slack
Webhook

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