はじめに
この記事はGitHub Actions Advent Calendar 2019の5日目の記事です。
みんな大好き GitHub Actions で terraform を実行するTerraform GitHub Actions リポジトリの話をします。
早い話が workflow のテンプレートでも置いておこうかなって。
Actions で terraform を動かすと何が嬉しいか
- 適用の抜け漏れが減る
- fmt 漏れ、複数ディレクトリの関連チェック漏れなど、ついうっかりミスしてしまうことが減ります
- 自分の環境以外でもちゃんと動くことが保障できる
- 普通動きますけど、たまにワーキングディレクトリ
が汚いの整理が苦手な人とかいますよね。コードの適用漏れとか防げます
- 普通動きますけど、たまにワーキングディレクトリ
- ローカル実行しなくてもいいので、クラウドに対して権限のない人でも(適切に設定すれば)PRベースで作業が可能です
- terraform が利用する IAM Role 等の権限は、基本的に強権限になりがちなので複数人で使いまわすのは本来は不適切です
- もっとも、本当にこの辺りをちゃんとしていると自信持って言えるチームがどれほどあるの。。。(自戒
- 基本的に PR 実行かつ apply しない(planまでしかしない)ので、差分チェックが楽
- 前述のとおりウチも強権限共有ローカル適用組なので(ダメ)PRを投げる時は plan 差分がない状態でマージするルールにしています
- 簡単に言えば、ローカルで開発、apply して問題ない状態のコードをPRして、plan差分がない(リモートステートは同じものを見ている)状態を維持することで、リソースにコードを合わせる、タイプの運用をしています
- コードでリソースをコントロールできるほど強くなりたいものですw
テンプレート
リポジトリのトップにどーんと出ていますが、サンプルなので実運用には向いてません。バージョンをベタ書きするは複数個所に書かせるわ実行ディレクトリ(working_dir)は1つだわ。。。
ドキュメントとしては別にこれでいいですが、不親切なのは否めません。
というわけで、再利用しやすい実運用で実績のあるワークフローファイルを置いておきます。
使い勝手はいい自負はあるのでぜひご活用ください。
/.github/workflows/pr_tf_all.yaml
name: pr_tf # この名前がマージボタン付近の checks の名前に使われるので短いほうが見やすい
on:
pull_request:
paths:
- "terraform/all/*/*.tf"
# PR 中でこの paths にマッチするファイルが更新されている場合に実行される
type:
- opened
- synchronize
- rerequested
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TF_ACTION_TFE_TOKEN: ${{ secrets.TF_ACTION_TFE_TOKEN }}
TF_ACTIONS_VERSION: 0.12.16
# 各 step で何度も同じのを書くのが嫌なので一括してまとめた
# 大体の env はこっちに書ける
# が、tf_actions_xxx は現在のバージョンでは with で渡さないと受け取らなくなった
jobs:
terraform:
name: plan all # この名前も checks の表示に利用されるので短くわかりやすい名前が望ましい
runs-on: ubuntu-latest
strategy:
matrix:
dir:
- "terraform/all/dir1"
- "terraform/all/dir2"
- "terraform/all/dir3"
# ディレクトリを分けてステート管理をしている(working_dirが複数ある)場合に
# この strategy matrix を使うと、同時にそれぞれ実行される
# たくさんあると実行時間がかかるので、適当に分割しておくのがおすすめ
steps:
- uses: actions/checkout@master
- name: Terraform - Format
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: ${{ env.TF_ACTIONS_VERSION }}
tf_actions_working_dir: ${{ matrix.dir }}
tf_actions_subcommand: 'fmt'
# バージョンを変数化することで1回指定にした
# working_dir を matrix.dir から拾うことで逐一書かなくていいようにした
# 以下 validate, init, plan について同じ
おまけ
ちなみに TF_VAR_ は plan だけあればいいので、plan の step で env 渡ししてる。本家にもサンプルがある。