2019年6月28日金曜日

DockerでPostgreSQLにクエリーを実行した結果をslackに通知するコンテナ(Alpine3.9ベース)を作成する

python3.7にslackclientとpandasとpsycopg2をインストールしたコンテナを作成し、PostgreSQLにクエリーを発行した結果が1行以上あればslackに通知するコンテナは以下の手順で作成します。
データベースのデータ監視などに利用する事ができます。

1.イメージの作成
docker build -t slack-pandas-pg:1.0 .

Dockerfile
FROM python:3.7-alpine3.9
RUN apk --no-cache add libstdc++ \
    postgresql-dev \
  && apk --no-cache --virtual pydeps add gcc \
    g++ \
    python3-dev \
    musl-dev \
    cython \
    libffi-dev \
  && pip install pandas \
  && pip install psycopg2 \
  && pip install slackclient \
  && apk del --purge pydeps
CMD ["/bin/sh"]

2. コンテナの実行
下記queryresult.pyの他にクエリーを保持したquery.txtと通知時のメッセージヘッダーを保持したheader.txtを同じフォルダに用意します。
Botsの登録などはあらかじめ行い、TOKENを控えてください。

queryresult.py
import os
import pandas as pd
import psycopg2
import slack

query = ""
with open(os.environ['QUERY']) as fquery:
  query = fquery.read()

header = ""
with open(os.environ['HEADER']) as fheader:
  header = fheader.read()

conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
result = pd.read_sql(sql=query, con=conn)
if len(result) > 0:
  client = slack.WebClient(token=os.environ['SLACK_TOKEN'])
  response = client.chat_postMessage(
    channel=os.environ['SLACK_CHANNEL'],
    username=os.environ['SLACK_USER'], icon_emoji=os.environ['SLACK_ICON'],
    text=header + result.to_string())

PostgreSQLへの接続情報やslackの情報は下図のように環境変数で渡します。
docker run -e PG_HOST='dbhost' \
  -e PG_PORT='5432' \
  -e PG_DB='dbname' \
  -e PG_USER='postgres' \
  -e PG_PASS='pass' \
  -e SLACK_TOKEN='<slack token>' \
  -e SLACK_CHANNEL='#general' \
  -e SLACK_USER='mybot' \
  -e SLACK_ICON=':cat:' \
  -e QUERY='/tmp/query.txt'
  -e HEADER='/tmp/header.txt'
  -v `pwd`:/tmp  -it slack-pandas-pg:1.0 /usr/local/bin/python3 /tmp/queryresult.py

0 件のコメント:

コメントを投稿