2019年6月29日土曜日

DockerでPython3.7、requests、slackがインストールされたコンテナ(Alpine3.9ベース)を作成する

requestsとslackでネットワークにアクセスした結果に応じてslackの通知するようなプログラムを作成する事ができます。

1.イメージの作成
以下のコマンドとDockerfileでPython3.7、requests、slackがインストールされたコンテナを作成します。
docker build --no-cache -t slack-requests:1.0 .

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

2. 以下のサンプルプログラムでrequestsとslackを活用して簡単なURLの生死監視・エラーチェックを行うことができます。
下記monitor_urls.pyの他に監視したいURLを保持したurls.txt(1行に1URLを書いてください)と通知時のメッセージヘッダーを保持したheader.txtを同じフォルダに用意します。
Botsの登録などはあらかじめ行い、TOKENを控えてください。

monitor_urls.py
import os
import requests
from requests.exceptions import ConnectionError
import slack
import json

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

with open(os.environ['URLS']) as furls:
  urls = furls.readlines()

errors=[]

for url in urls:
  url = url.rstrip('\n')
  try:
    result = requests.get(url, timeout=10)
    if result.status_code >= 400:
      errors.append({'status_code':result.status_code, 'reason':result.reason, 'url':url})
  except ConnectionError as err:
    errors.append({'status_code':-1, 'reason':'No response', 'url':url})

if len(errors) > 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 + json.dumps(errors, indent=2))

実行は以下のコマンドを実行します。slackへのトークン情報やurlを格納したファイルなどの情報は環境変数を指定して渡します。
docker run -e SLACK_TOKEN='<slack token>' \
  -e SLACK_CHANNEL='#general' \
  -e SLACK_USER='mybot' \
  -e SLACK_ICON=':cat:' \
  -e URLS='/tmp/query.txt'
  -e HEADER='/tmp/header.txt'
  -v `pwd`:/tmp  -it slack-requests:1.0 /usr/local/bin/python3 /tmp/monitor_urls.py

0 件のコメント:

コメントを投稿