关于使用CircleCI作为工作流的故事

undefined

我是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

image.png

上午九点半

image.png

我决定通过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

结果

image.png

这个机制一直很顺利地运作着。虽然我们已经使用了一年多,但这个系统本身从未出现过大问题。

广告
将在 10 秒后关闭
bannerAds