RDS
python3
lambda

AWS RDS イベントサブスクリプションの通知を Slack へ流す(Lambda Python3.6)

More than 1 year has passed since last update.

IAM ロール作成

ロール名:rdsevents-to-slack
信頼関係:Lambda
ポリシー:AWSLambdaBasicExecutionRole(AWS 管理ポリシー)

Lambda 作成

リージョン:東京 (ap-northeast-1)
関数の作成:一から作成(設計図 cloudwatch-alarm-to-slack を参考)
名前:rdsevents-to-slack
ランタイム:Python 3.6
ロール:rdsevents-to-slack
コードエントリタイプ:コードをインラインで編集
ハンドラ情報:lambda_function.lambda_handler
関数コード:

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):
    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message))

    slack_text1 = (datetime.strptime(message["Event Time"][:-4], '%Y-%m-%d %H:%M:%S') + timedelta(hours=9)).strftime("%Y/%m/%d %H:%M:%S")
    slack_text2= "%s: %s" % (message["Source ID"], message["Event Message"])
    slack_text = slack_text1+ "\n" + slack_text2

    slack_message = {
        'username': "AWS Norifier",
        'text': "*[ALARM] AWS RDS Events*",
        'icon_emoji': ":bangbang:",
        'attachments': [
            {
                "text": slack_text
            }
        ]
    }

    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

基本設定
 タイムアウト:5分

AWS SNS 設定

トピック:rdsevents-to-slack

サブスクリプション
 プロトコル:AWS Lambda
 エンドポイント:arn:aws:lambda:ap-northeast-1:************:function:rdsevents-to-slack 

RDS イベントサブスクリプション 設定

通知の送信先:SNS rdsevents-to-slack