【Python】webhookとgceを使ってslack自動投稿ボットを作成しよう

作成日 : 2022年10月14日

目的

slackに今月のGCPの料金を投稿します。

要件

  • 自社のbigquerryに料金データテーブルがあったのでその内容を投稿する。
  • 毎朝8時に投稿する。
  • Workflow Builderは利用しない。(なぜなら、利用には課金が必要)
    Workflow Builderを使用した方法->https://techblog.zozo.com/entry/bq-to-slack-with-nocode

bqの取り出したいデータ

別の料金情報テーブルから料金の合計viewで作成しました。

システムの全体像

GCEを用いてpythonファイルを実行することでbqのデータをslackに自動投稿します。

GCEの使い方

メニュー->[Compute Engine]->[VMインスタンス]

まだvmインスタンスを作成していない方は:これから始めるGCP(GCE) 安全に無料枠を使い倒せ – Qiita

既にvmインスタンスを作成した方は使用するインスタンスの名前をクリック

ssh->[ブラウザで開く]

下画像のような画面が出てきたら成功です。

ssh内でpythonファイルを作成します。

pythonコード

slack apiの基本的な使い方:slack api の使い方 – TechnoLife

bqのデータをpythonで扱う方法:bqからデータをとってきてtableau onlineにpublishする。 – TechnoLife

requirements.txt

asn1crypto==0.24.0
cachetools==3.1.1
certifi==2021.10.8
chardet==4.0.0
crcmod==1.7
cryptography==2.1.4
enum34==1.1.10
futures==3.3.0
google-api-core==1.32.0
google-api-python-client==1.12.11
google-auth==2.11.1
google-auth-httplib2==0.1.0
google-auth-oauthlib==0.4.1
google-cloud-bigquery==1.28.2
google-cloud-core==1.7.3
google-resumable-media==1.3.3
googleapis-common-protos==1.52.0
httplib2==0.20.4
idna==2.10
ipaddress==1.0.17
keyring==10.6.0
keyrings.alt==3.0
numpy==1.16.6
oauthlib==3.1.0
packaging==20.9
pandas==0.24.2
pandas-gbq==0.13.1
protobuf==3.18.0
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycrypto==2.6.1
pydata-google-auth==1.4.0
pygobject==3.26.1
pyparsing==2.4.7
python-dateutil==2.8.2
pytz==2022.2.1
pyxdg==0.25
requests==2.27.1
requests-oauthlib==1.3.1
rsa==4.5
SecretStorage==2.3.1
six==1.16.0
uritemplate==3.0.1
urllib3==1.26.12
import pandas as pd
import requests
import json

query = 'SELECT * FROM "作成したviewを入力"'
print(query)
data_frame = pd.read_gbq(query, 'プロジェクト名',dialect='standard')
print(data_frame)
nmp = data_frame.to_numpy().tolist()
nmp=sorted(nmp,reverse=True,key=lambda x:x[1])

if __name__ == '__main__':
webhook_url = "“
message = str(nmp[0][0])[0:10]+" monthly fee"+"\n"+nmp[0][1] + ":" + str(nmp[0][2])+"\n"+nmp[1][1] + ":" + str(nmp[1][2])+"\n" + nmp[2][1] + ":" + str(nmp[2][2])+"\n" + nmp[3][1] + ":" + str(nmp[3][2])+"\n" +nmp[4][1] + ":" + str(nmp[4][2])
requests.post(webhook_url, data=json.dumps({'text': message}))

GCEに書き込むので、一般的な環境とは異なっています。

留意点としては

  • 日本語は文字化けすること
  • bqデータをデータフレーム化するときpd.read_gbq(query, ‘プロジェクト名’,dialect=’standard’)のように標準SQLに設定しないといけないこと
  • bqデータをデータフレーム化するとなぜか順番が実行毎にばらばらになってしまうのでsorted()関数でまとめました。

crontabで自動実行

crontab編集方法
#export EDITOR=vim 
#↑vimファイルで編集できる 通常editerはnano

#ジョブ編集コマンド
crontab -e

#ジョブ確認コマンド
crontab -l

#ジョブ削除コマンド -eと間違えないように注意!!
crontab -r
crontabの内容
00 23 * * * python /home/python/billing_bq_to_slack.py

毎日8時にpythonファイルを実行するcrontabファイル

留意点

  • 標準時は日本時間の9時間前なので8時に実行するときは前日の23時に設定しなければならないです。

参考および詳しい説明:crontabの書き方 | server-memo.net

最後に

今回はgceを用いてbqのデータをslackに自動投稿することができました。

その過程でcrontabの扱いやslack apiを学ぶことでできることが広がりました。

Follow me!

DMP構築のご相談

お気軽にお問い合わせください

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です