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