Aurora のフェイルオーバーなどの DB クラスターイベントを Slack に通知する

前回 Aurora のスロークエリを Slack に通知できるようにしました。

enomotodev.hatenablog.com

今回は Failover(フェイルオーバー)などの DB クラスターで発生したイベントを Slack に通知できるようにしてみたいと思います。

Webhook URL の発行

前回 Slack の Webhook URL を用意した時と同様に Slack の Incoming Webhooks のページから Webhook URL を発行してください。

この後に作成する Lambda で Slack の Webhook URL を使用します。

IAM ロールの作成

Lambda に設定する IAM ロールを作成します。

  • ロール名:rds-event-to-slack-role
  • このロールを使用するサービスを選択:Lambda
  • ポリシー:AWSLambdaBasicExecutionRole

として作成します。

Lambda の作成

一から作成を選択し、

  • 名前:rds-event-to-slack
  • ランタイム:Python 3.7
  • ロール:既存のロールを選択
  • 既存のロール:rds-event-to-slack-role

として作成します。

関数コードはこちらです。

import os
import json
import logging
from datetime import datetime, timedelta
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

Slack_Webhook_URL = os.environ['SLACK_WEBHOOK_URL']

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

def lambda_handler(event, context):
    message = json.loads(event['Records'][0]['Sns']['Message'])

    slack_message = {
        'text': '*New AWS RDS Events* in %s' % (message['Source ID']),
        'attachments': [
            {
                'color': '#36464f',
                'title': message['Source ID'],
                'title_link': message['Identifier Link'],
                'text': message['Event Message'],
                'footer': 'Amazon RDS',
                'ts': datetime.strptime(message['Event Time'][:-4], '%Y-%m-%d %H:%M:%S').timestamp()
            }
        ]
    }

    req = Request(Slack_Webhook_URL, json.dumps(slack_message).encode('utf-8'))
    try:
        response = urlopen(req)
        response.read()
        logger.info('Message posted to %s', Slack_Webhook_URL)
    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)

環境変数にはキーを SLACK_WEBHOOK_URL にし、値には先ほど発行した Slack の Webhook URL を設定します。

これで Lambda の作成は完了です。

トピックの作成

Simple Notification Service(SNS)に移動し、トピックの作成を選択し、

  • トピック名:rds-event-to-slack-topic

で作成します。

f:id:enomotodev:20181213204347p:plain

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

RDS の画面に戻り、イベントサブスクリプションに移動し、

  • 名前:rds-event-to-slack-subscription
  • 通知の送信先:ARN
  • ARN:rds-event-to-slack-topic
  • ソースタイプ:DB クラスタ
  • Db クラスター を含める:すべての db クラスタ
  • 含まれるイベントのカテゴリ:すべてのイベントカテゴリ

でイベントサブスクリプションを作成します。

『Db クラスター を含める』と『含まれるイベントのカテゴリ』の項目で対象の DB クラスターやイベントを選択できますので、絞り込みたい場合はこちらで適当なものを選択してください。

f:id:enomotodev:20181213204539p:plain

私の場合はイベントサブスクリプションのステータスが作成中からアクティブになるまでは 3 分ほどかかりました。

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

SNS の画面に戻り、下の画像のように先ほど作成したトピックの ARN の部分のリンクを選択し、トピックの詳細に移動します。

f:id:enomotodev:20181213203631p:plain

移動したらサブスクリプションの作成を選択し、

としてサブスクリプションを作成します。

作成が完了すると下の画像のように作成したサブスクリプションが確認できるかと思います。

f:id:enomotodev:20181213203452p:plain

動作確認

ブラウザからフェイルオーバーさせることができるので、実際にフェイルオーバーさせて Slack に通知されるか確認してみます。

RDS のインスタンス一覧に移動し、フェイルオーバーさせたい DB クラスターに所属するインスタンスを選択し、インスタンスの操作からフェイルオーバーを選択します。

実際にイベントが発行されているかどうかは画面左側のイベントのリンクからイベント一覧を表示することで確認できます。

Slack に通知されるまでは 3 分ほどタイムラグがあるので、少し待ちましょう。

f:id:enomotodev:20181213201616p:plain

これで Aurora で発生した DB クラスターのイベントを Slack に通知できるようになりました!

DNSがよくわかる教科書

DNSがよくわかる教科書

Amazon Web Services エンタープライズ基盤設計の基本

Amazon Web Services エンタープライズ基盤設計の基本