RDS PostgreSQL Slack ์๋ ํ ์คํธ (slack incoming-webhook ์ฑ ์ด์ฉ)
Slack์ ์๋ฆผ ์์ ์ ์ํ ์ฑ ์ถ๊ฐ (incoming-webhook)
๊ตฌ์ฑ ์ ํํด์ ๊ตฌ๋ ์ ์ํ๋ ์ฌ๋ ์ฑ๋์ ์ ํ
์ ํ ํ ์นํํฌ URL ๋ณต์ฌํด๋ ๋ค (๋๋ค ์์ฑ ์ ํ์) ์ค์ ์ ์ฅ
Slack ์์ ์ ์ํ AWS Lambda ํจ์ ์์ฑ
์ญํ ์ ํ ํ SNS ํธ๋ฆฌ๊ฑฐ๋ ์์ง ์ฃผ์ ์์ฑ ์ ์ด๊ธฐ์ ์ ๊ฑฐํ๋ค.
๋๋ค ์์ฑ ์ ํ๊ฒฝ ๋ณ์ ์ค์
kmsEncryptedHookUrl๊ณผ slackChannel ๊ฐ์ ์ ๋ ฅํด์ค๋ค
Url ์ ๋ณด์ slackChannel์ ์์ ์ฌ๋์์ ์ฑ ์ค์ ํ ์ ์ ๋ณด๋ค์ ์ ๋ ฅํด์ค๋ค
์์ฑ ์๋ฃ
Amazon SNS ์ฃผ์ ์์ฑ
ํ์ค ์ ํ, ์ด๋ฆ ์ ๋ ฅ ํ ์์ฑ
์์ฑ๋ ์ฃผ์ ๋ก ๋ค์ด๊ฐ์ ๊ตฌ๋ ์์ฑ
์ฃผ์ ARN์ผ๋ก ์์์ ์์ฑํ ๋๋ค ์ ํ ํ ํ๋กํ ์ฝ AWS Lambda ์ ํ → ๊ตฌ๋ ์์ฑ
๊ตฌ๋ ์์ฑ๋ ๊ฒ ํ์ธ
ํ ์คํธ ์๋ ์์
์์ฑ๋ ๋๋ค ํจ์๋ก ๋ค์ด๊ฐ์ ํ ์คํธ ์ด๋ฒคํธ ์์ฑ ํ ํ ์คํธ ์งํ
- ์ฌ๋ ํ ์คํธ ์ค๋ฅ ์์ -> hook_url ์์ ๋ฐ ๋์์ฑ ํธ์ง
AWS Lambda๋ฅผ ์ด์ฉํ Sequence Check ์ฌ๋ ์๋๊น์ง
- rds slack ์ํ์ค test -> psycopg2 ๋ชจ๋ ์ฐพ์ ์ ์๋ค๊ณ ๋จ๋ ์๋ฌ ์์ -> layer ์ถ๊ฐํ๋ฉด๋จ
- AWS Lambda ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก DB ์ปค๋ฅ์ ์ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ ์ ๊ณต์ ์ํ๋ค.(ํฌ์คํธ๊ทธ๋ - psycopg2, mysql - psmyqsl ๋ฑ) → psycopg2๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ฐ์์ Lambda๋ด Layer(๊ณ์ธต)๋ผ๋ ๊ณณ์ ์ฌ๋ ค์ผํ๋ค.
- Add a layer(๊ณ์ธต์์ฑ) ์ ์๋์ ์ถ๊ฐ๋ psycopg2-layger.zip ํ์ผ ์ ๋ก๋
Layers ์์ฑ ํ์ธ!
- postgre_alarm_test_ty ๋๋ค ์์ฑ ์ ์ฝ๋
import json
import os
import psycopg2
import urllib.request
ENCRYPTED_HOOK_URL = os.environ['kmsEncryptedHookUrl']#ํด๋น ํ๊ฒฝ๋ณ์๋ค์ ๊ตฌ์ฑ์์ ์ถ๊ฐ
SLACK_CHANNEL =os.environ['slack_channel']
def post_slack(argStr):
message = argStr
send_data = {
"text": message,
}
send_text = json.dumps(send_data)
request = urllib.request.Request(
ENCRYPTED_HOOK_URL,
data=send_text.encode('utf-8'),
)
with urllib.request.urlopen(request) as response:
slack_message = response.read()
def lambda_handler(event, context):
# TODO implement
sql = 'select * from ( select sequencename , round(("last_value")::numeric/max_value::numeric, 10) as pct from pg_catalog.pg_sequences) a where a.pct > 0.07;'
conn = psycopg2.connect(
host = os.environ['DB_HOST'],
dbname = os.environ['DB_NAME'],
user = os.environ['DB_USER'],
password = os.environ['DB_PASSWORD'],
port = os.environ['DB_PORT']
)
cur = conn.cursor()
#print(cur.mogrify(sql))
cur.execute(sql)
result = cur.fetchall()
for cur in result:
if cur is not None:
msg = cur[0] + ' is urgent'
post_slack(os.environ['DB_NAME'] + ' ' + msg + '(taeyeong)')
else:
post_slack("sequence is normal.")
conn.close()
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
- ๋๋ค ๊ตฌ์ฑ ์ ํ๊ฒฝ ๋ณ์ ํธ์ง
- ํธ๋ฆฌ๊ฑฐ ์ถ๊ฐ (ํธ๋ฆฌ๊ฑฐ๋ฅผ ํ์ฉํ ์ด๋ฒคํธ ๊ฑธ๊ธฐ)
- 1๋ถ์ 1๋ฒ์ฉ ์๋ ์ค๋ ๊ฒ ํ์ธ
728x90