关于使用CircleCI作为工作流的故事
我是Journey公司的Riita,负责CircleCI Advent Calendar 2021的第7天,我们正在开发酒店预订服务。
因为我想要CircleCI的T恤,所以我决定公开我用CircleCI的用途以及实际的yaml。
我将会讲述一个关于使用CircleCI支持KPI分析所使用的数据基础设施的三个分类的故事。
现状
-
- Cloud Composerを使ってデータ基盤の3分類を実現している。
BigQueryには、ProductionのMySQLから毎朝8:00にバッチでデータがダンプされる
その直後に、Airflowのdagを使って、データ基盤のデータが更新される
行動ログはサイドカーのfluentdによって、stackdriver経由でリアルタイムに集計できる
行動ログはリアタイで集計できるけれど、どうせProductionのMySQLのデータが必要なので、Composerのdagは1日に一回しか動いていない。
我想解决的问题
-
- Cloud ComposerはKubernetesのマネージドであり、共用CPUが使えず、Zonalクラスタも使えない。
- 結果、3zoneでn1-standard-1を立てることになり、月に3万円程度かかってしまう。年間で36万円程度かかりシリーズAのスタートアップにとっては地味に出費
怎样解决呢
为了每天只需要花费大约30分钟完成的工作,整天都保持Composer的运行是浪费的。
在dag中,任务预定在09:00执行,所以大约在08:50随意启动Composer,在09:30左右就可以关闭Composer了。
如果任务需要超过30分钟才能完成,只需要在10:00进行调整即可,所以并没有必要过于严格地处理任务的结束。(由运维来覆盖)
08:45
上午九点半
我决定通过CircleCI和Terraform实现。
首先,Cloud Composer最初是由Terraform进行管理的。
那么,可以使用Terraform来轻松创建具有相同配置的Cloud Composer。
如果为了执行Terraform Apply而花钱购买容器是没有意义的,所以我们使用了Circle CI的任务来解决问题。
version: 2
jobs:
create:
working_directory: ~/bluemoon
docker:
- image: hashicorp/terraform:0.14.3
steps:
- checkout
- run:
name: Slack notification
command: sh start_slack.sh
working_directory: .
- run:
name: Init terraform
command: terraform init
working_directory: tf/cloud-composer
- run:
name: Apply terraform
command: terraform apply -auto-approve
working_directory: tf/cloud-composer
destroy:
working_directory: ~/bluemoon
docker:
- image: hashicorp/terraform:0.14.3
steps:
- checkout
- run:
name: Slack notification
command: sh end_slack.sh
working_directory: .
- run:
name: Init terraform
command: terraform init
working_directory: tf/cloud-composer
- run:
name: Destroy terraform
command: terraform destroy -auto-approve
working_directory: tf/cloud-composer
deploy:
working_directory: ~/bluemoon
docker:
- image: google/cloud-sdk
steps:
- checkout
- run:
name: initialize gcloud
command: |
gcloud auth activate-service-account --key-file=tf/cloud-composer/account.json
gcloud --quiet config set project -----------
- run:
name: import sql files
command: gcloud composer environments storage plugins import --location us-central1 --environment cloud-composer --source sql/
- run:
name: import dag files
command: gcloud composer environments storage dags import --location us-central1 --environment cloud-composer --source dag/
- run:
workflows:
version: 2
start_workflow:
triggers:
- schedule:
cron: "45 23 * * *"
filters:
branches:
only:
- master
jobs:
- create
- deploy:
requires:
- create
filters:
branches:
only: master
end_workflow:
triggers:
- schedule:
cron: "30 0 * * *"
filters:
branches:
only:
- master
jobs:
- destroy
结果
这个机制一直很顺利地运作着。虽然我们已经使用了一年多,但这个系统本身从未出现过大问题。