error codes

ソフトウェアエンジニアリングなど、学んだこと、思ったことの記録です。

tfupdate を Github Actions で定期実行する

一ヶ月ぐらい前から、 tfupdateGithub 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 に変な差分が出てないことだけを確認してマージする。良い気分で一週間が始まるようになった。