CircleCIのyamlのメモと、TerraformをCircleCIでapplyするメモ

目的

  • GitHubにpushしたソースをCircleCIを用い、Terraformをapplyしたい
    • Terraformをapplyする際にはユーザの確認を行いたい

参考

  • まさにこのページがそれでした(公式のサンプル)

learn.hashicorp.com

準備

Terraformの環境変数

  • TerraformからAWSにアクセスする必要があるので、環境変数にアクセスキーを登録する必要がある
  • Project Settings -> Environment Variables

Project Settingsのメニューから
f:id:y-ni-shi:20201121165528p:plain

Environment Variablesを選択して登録画面を表示
f:id:y-ni-shi:20201121165613p:plain

  • 環境変数を設定する
    • AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYを設定する(画像では他のenvも入っている) f:id:y-ni-shi:20201121165829p:plain

.circleci/config.yml

  • サンプルファイル
    • とりあえず公式のサンプルをそのまま使用

github.com

解説(jobについて)

  • 以下がjobの部分。
    • 各種jobが定義されており、実際に何を行うかを記載する
    • 複数のjobを記載することが可能
version: 2 # version 2の指定(現在は2.1が主流?2.1にしても動いた)

jobs:
  plan-apply:
    working_directory: /tmp/project #  VM(Docker)上でどこの作業スペースで行うか
    docker:
      - image: hashicorp/terraform:light
    steps:  # 作業の核心部分(以下参照)
      - checkout
      - run:
          name: terraform init & plan
          command: |
            terraform init -input=false
            terraform plan -out tfapply -var-file variables.tfvars
      - persist_to_workspace:
          root: .
          paths:
            - .

stepsについて

  • これがCIの核心部分(実際になにの作業を行うかを記載している)
    steps:
      - checkout  # GitHubからソースファイルをpullしてきてworking_dirに展開する
      - run:
          name: terraform init & plan  # タスクの名称
          command: |
            terraform init -input=false
            terraform plan -out tfapply -var-file variables.tfvars  # terraform planした結果を tfapplyという名前にして出力
      - persist_to_workspace:  # 以下のrootの内容を保存する(CircleCiの次のステップに持ち越せる)
          root: .
          paths:
            - .
name

nameの部分がCircleCIの各セクションの名前になる f:id:y-ni-shi:20201121162732p:plain

checkout
  • GitHubからソースファイルをダウンロードして展開する
    steps:
      - checkout
persist_to_workspace
  • このstepで作成した何かしらの成果物を次のステップに持ち越す

解説(workflowsについて)

  • 実際にどのジョブをどのように流していくかを記載するのがworkflow
    • 今回はterraformでapplyしたいわけだが、terraform planした内容が正しいのかどうか、を人がチェックしてからterraform applyしたい
      • そういうときはtype: approvalがいいらしい

circleci.com

  • workflows抜粋
workflows:
  version: 2
  plan_approve_apply:  # workflowの名前。好き名前つけられる
    jobs:
      - plan-apply # plan-applyを実行する
      - hold-apply:
          type: approval # approvalというのはユーザが許可したら次へいく、という機能のようで、人がチェックしたら次へいける
          requires:
            - plan-apply # plan-applyが終わってからやる、という意味。つまり失敗したら実行されない
      - apply:
          requires:
            - hold-apply # hold-applyの完了を待っている。
jobs
  • type: approval
    • これがユーザがチェックする部分
  • このように、holdと出てユーザの入力待ちになる f:id:y-ni-shi:20201121164027p:plain
  • このような画面が出てapprovをクリックしたら次に進む f:id:y-ni-shi:20201121164327p:plain

まとめ

  • terraformのplanとapplyを行う場合にはtype: approval
    • ユーザが確認してクリックするまでブロッキングされる機能がある
    • 実際には、このplanの内容をslackとかに投げたいなあ。そしてslackからクリックしたらCI進んで欲しい、とかありそうだなと。
      • これ↓とかまさにそれ?

qiita.com

  • CircleCIでterraformするためにはAWSのクレデンシャルをCircleCIの環境変数に入れる必要がある
    • これは仕方ないんだろうけど、ちょっと気持ち悪いけど、仕方ないんでしょう
      • terraform applyするなら結構権限強いユーザになってると思うので、なおさら書きたくないですが・・・