前回のブログでDOの請求を個人のサーバーで毎月通知するように実装しました。
1 2 |
#Ansible: billing 0 9 2 * * /home/hoge/scripts/billing.sh |
が!
CircleCIの2.0からTriggerという機能を使ってcronで定期実行できるようになってから触ったことがなかったので、せっかくなのでサーバーレスになるし移行してみました。
■Scheduling a Workflow
https://circleci.com/docs/2.0/workflows/#scheduling-a-workflow
https://circleci.com/docs/2.0/configuration-reference/#schedule
■Add Projects
とりあえずcron用のプライベートリポジトリを作ってみました。AnsibleとTerraformやら管理しているリポジトリにまとめようかなと思いましたが、無料プランということもあって、Terraform CIが動いており、2つコンテナが同時に動作することができません!(制限かかる) そもそも逆に分けたほうが管理しやすいということに気づいた。
■CircleCI
- .circleci/config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
version: 2.1 references: default_config: &default_config docker: - image: ubuntu:20.04 working_directory: ~/project jobs: billing_run: <<: *default_config steps: - checkout - run: name : update and install curl jq command: | apt-get update && apt-get install curl jq -y - run: name : DigitalOcean billing_run command: | /usr/bin/bash ~/project/cron/billing.sh workflows: version: 2 cron_schedule: triggers: - schedule: cron: "0 0 2 * *" filters: branches: only: master jobs: - billing_run |
まずは 3~7行目の references
で & (アンカー) を指定していますが、今後それ以外のコンテナでバッチを作ることがあった場合に処理を分割するようにしました。今回はDockerのImageを個人のサーバーのOSと同様にしたかったのでUbuntuを選択しております。
また、11行目で上記の & (アンカー)を指定することでそのImageでbuildしてくれます。あとはTriggerでmasterに対してcronを書くだけなのですが、JSTではなくUTCで表記する必要があります。ここはハマった。
- billing.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/bash url=${SLACK_URL} username='DigitalOcean' to="cost" subject='今月分の料金です!!' color="#0000FF" message=`curl -s -X GET "https://api.digitalocean.com/v2/customers/my/billing_history" -H "Authorization: Bearer ${DO_API}" |jq -r '.billing_history[1] | .date, .amount'` payload="payload={ \"channel\": \"${to}\", \"username\": \"${username}\", \"text\": \"${subject}\", \"attachments\": [ { \"color\" : \"${color}\", \"text\" : \"${message}\" } ] }" curl -m 5 --data-urlencode "${payload}" ${url} |
- Environment Variables
シェルスクリプトで指定しているAPIやSlackのURLはCircleCIの環境変数で動作させるように変更しました。これでGitHub上に情報を管理することがなくなった!(セキュア) いざテスト!
■Test
Authorが謎のロボットになってる!
OK!!!
■まとめ
https://circleci.com/docs/reference-2-1/#circleci-2-1-reference
version 2.1で作ろうとしたらTriggerがまだ対応してない?ぽくて、pushするたびにバッチが動く処理になってしまった。。ちゃんと調べてないので、また今後試してみようと思います。
とりあえずサーバーレス最高!!スケジュール機能によってバッチサーバーが不要になりそうですね。
0件のコメント