tfupdate を Github Actions で定期実行する
一ヶ月ぐらい前から、 tfupdate を Github Actions から定期的に実行する生活をしている。
tfupdate は、個人的にはとても嬉しいツールで、確かにこれは欲しかったものだということを感じさせてくれるものだった。
仕事で管理している terraform の state はどんどん増えていて、それぞれに terraform や provider のバージョンを指定している。これまでは、たまに思い立ったようにアップデートしたり、新しい AWS のサービスが使えなくて都度アップデートしたりしていたが、state 数が多いと結構面倒な作業だった。
tfupdate を CI で定期的に実行して、自動で PR 作成、あとはマージするだけ、としておくと常に最新の terraform と provider で日々仕事が行える。
CircleCI で実行する場合は、作者の方の記事 や、Orbもあるようなので、それを使うと良いと思う。
自分は、最近は CircleCI から Github Actions に徐々に移行していて、tfupdate も Github Actions から実行するようにしている。
Github Actions から tfupdate を実行する
自分の場合は、自作の Actions を作っていて、これを使っている。
daisaru11/tfupdate-github-actions
これを使う場合は、次のような yaml をリポジトリに置くだけで動くと思う。
on:
schedule:
- cron: '0 0 * * *'
jobs:
update_terraform:
runs-on: ubuntu-latest
name: Update terraform versions
steps:
- name: "Checkout"
uses: actions/checkout@v1
- name: tfupdate
uses: daisaru11/tfupdate-github-actions@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
tfupdate_subcommand: terraform
tfupdate_path: './my_workspace'
update_provider:
runs-on: ubuntu-latest
name: Update provider versions
steps:
- name: "Checkout"
uses: actions/checkout@v1
- name: tfupdate
uses: daisaru11/tfupdate-github-actions@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
tfupdate_subcommand: provider
tfupdate_path: './my_workspace'
tfupdate_provider_name: aws
tfenv に対応する
tfenv を使っていて、 .terraform-version ファイルを置いている場合は、これもアップデートしないと、HCL 側の required_version と齟齬が出てしまう。
若干、アドホックな対応で、これでよかったのかと思うところはあるけれど、 update_tfenv_version_files というフラグを action に渡せるようになっていて、これを有効にすると .terraform-version も更新してくれるようになっている。
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
tfupdate_subcommand: terraform
tfupdate_path: "./my_workspace"
update_tfenv_version_files: true
Terraform の Github Actions と一緒に使う
Terraform の plan と apply も 公式の action を使って行っている場合。
こちらの action には、 tf_actions_version という使用する Terraform の バージョンを指定する引数があるので、これも更新されるようにしないといけない。
いくつか方法をある気がするけど、自分は前述の tfenv を使っていて .terraform-version が置いてある状況だったので、これを参照するようにした。
- name: "Detect terraform version"
id: get_tf_version
working-directory: "./my_workspace"
run: echo "::set-output name=tf_version::$(cat .terraform-version)"
- name: "Terraform Plan"
id: tfplan
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: ${{ steps.get_tf_version.outputs.tf_version }}
tf_actions_subcommand: "plan"
tf_actions_working_dir: "./my_workspace"
tf_actions_comment: true
::set-output というコマンドを標準出力に出しておくと、それを後続のステップで使用することができる。
まとめ
上記のような感じで、terraform と provider のバージョンを最新に保つようにしている。
今は毎週月曜の朝に定期実行されるようにセットしている。自動でつくられた PR をみて、plan に変な差分が出てないことだけを確認してマージする。良い気分で一週間が始まるようになった。