目的
- GitHubにpushしたソースをCircleCIを用い、Terraformをapplyしたい
- Terraformをapplyする際にはユーザの確認を行いたい
参考
- まさにこのページがそれでした(公式のサンプル)
準備
- 特定のGitHubリポジトリを作る
- CircleCIに作成したGitHubリポジトリを登録する
- 何かしらのTerraformのプログラムを記載する
- CircleCI用のyamlを記載してpushする
.circleci/config.yml
Terraformの環境変数
Project Settingsのメニューから
Environment Variablesを選択して登録画面を表示
- 環境変数を設定する
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
を設定する(画像では他のenvも入っている)
.circleci/config.yml
- サンプルファイル
- とりあえず公式のサンプルをそのまま使用
解説(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の各セクションの名前になる
checkout
- GitHubからソースファイルをダウンロードして展開する
steps: - checkout
persist_to_workspace
- このstepで作成した何かしらの成果物を次のステップに持ち越す
解説(workflowsについて)
- 実際にどのジョブをどのように流していくかを記載するのがworkflow
- 今回はterraformでapplyしたいわけだが、
terraform plan
した内容が正しいのかどうか、を人がチェックしてからterraform apply
したい- そういうときは
type: approval
がいいらしい
- そういうときは
- 今回はterraformでapplyしたいわけだが、
- 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
と出てユーザの入力待ちになる - このような画面が出て
approv
をクリックしたら次に進む
まとめ
- terraformのplanとapplyを行う場合には
type: approval
- ユーザが確認してクリックするまでブロッキングされる機能がある
- 実際には、このplanの内容をslackとかに投げたいなあ。そしてslackからクリックしたらCI進んで欲しい、とかありそうだなと。
- これ↓とかまさにそれ?