目的
サーバのアラートを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 ~)を実行する
設定その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"を押下
- 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 (InstanceId): 任意のインスタンスID
インスタンス名:任意のインスタンス名
メトリクス名:CPUUtilization
間隔:5分間
統計: Standard
平均
設定その4:Lambda functionの作成
"Dashboard"→"Create a Lambda function"→"Configure triggers"→□をクリックしSNSを探し選択。SNS topic"EC2_CPU_Util"を選択→"Enable trigger"にチェックを入れ"Next"を押下→"Configure function"で以下のように設定する
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”を実行
設定その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:defaultEmail連携用
Topic ARN:arn:aws:sns:ap-northeast-1:XXX:EC2_CPU_Util_Email ※作成したSNSTopicのARNを入力
Protocol:Email
Endpoint:通知先メールアドレスを入力
Version or alias:default
上記を入力したら"create subscription"を入力
実行・確認
- 意図的にCPU負荷を上昇させる。※1回で足りなければ並列で実行
# 負荷開始
$ yes >> /dev/null &
[1] 18593
# 負荷停止
$ kill -9 18593
[1]+ Killed yes >> /dev/null
CloudWatchでCPU使用率を確認
閾値を超えていることを確認Emailにアラートが届いていることを確認
Slackの指定したチャンネルにアラートが投稿されていることを確認