作成日 : 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を学ぶことでできることが広がりました。
DMP構築のご相談
お気軽にお問い合わせください