terraform 0.11 系に対応した GitHub Actions 作った & tflint も入れてみた♪

概要

Terraform 用の GitHub Actions として hashicorp 社にて以下リポジトリが用意されています。

hashicorp/terraform-github-actions

ですが、上記のリポジトリでは、 terraform の最新版 (2019-09-30 時点 0.12.9) にのみ適用しています。

hashicorp/terraform-github-actions を folk して
0.11 系がなかった為、 0.11 系に対応した terraform-github-actions を以下リポジトリに作成しました。

kenzo0107/terraform-github-actions

terraform の古いバージョンについての対応は、 terraform 公式に以下リンクにて記載があります。

Terraform Versions - Terraform GitHub Actions - Terraform by HashiCorp

古いバージョンは folk して自分で作ってね♪ と書いてあります。

ついでに

以下追加してみました。

  • tflint 追加
  • 実行するディレクトリを表示

使い方

以下のような terraform プロジェクトがあるとします。

1
2
3
4
5
6
7
8
9
10
11
12
13
├── envs
   ├── prd
      ├── backend.tf
      ├── main.tf
   ...
      └── variable.tf
   └── stg
   ├── backend.tf
   ├── main.tf
   ...
   └── variable.tf
└── modules
├── ...

GitHub Actions 設定方法

以下 2 ファイルを root ディレクトリに配置します。

  • .github/workflows/main.yml
  • .github/workflows/fmt.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
├── .github
│   └── workflows
│ ├── main.yml
│ └── fmt.yml

├── envs
│   ├── prd
│   │   ├── backend.tf
│   │   ├── main.tf
│   ...
│   │   └── variable.tf
│   └── stg
│   ├── backend.tf
│   ├── main.tf
│   ...
│   └── variable.tf
└── modules
├── ...

.github/workflows/main.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
name: Terraform
on: [pull_request]

jobs:
on-pull-request:
name: On Pull Request

strategy:
matrix:
env: [stg, prd]

runs-on: ubuntu-latest

steps:
- name: Checkout Repo
uses: actions/checkout@v1

- name: ${{ matrix.env }} Terraform Init
uses: kenzo0107/terraform-github-actions/init@v0.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TF_ACTION_WORKING_DIR: './envs/${{ matrix.env }}'
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

- name: ${{ matrix.env }} Terraform Validate
uses: kenzo0107/terraform-github-actions/validate@v0.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TF_ACTION_WORKING_DIR: './envs/${{ matrix.env }}'
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

- name: ${{ matrix.env }} Terraform Lint
uses: kenzo0107/terraform-github-actions/lint@v0.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TF_ACTION_WORKING_DIR: './envs/${{ matrix.env }}'

- name: ${{ matrix.env }} Terraform Plan
uses: kenzo0107/terraform-github-actions/plan@v0.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TF_ACTION_WORKING_DIR: './envs/${{ matrix.env }}'
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

ちょっと解説

Pull Request をトリガーに実行されます。
1
on: [pull_request]
リポジトリをチェックアウト
1
2
- name: Checkout Repo
uses: actions/checkout@v1
matrix で stg, prd を並列実行します。
1
2
3
strategy:
matrix:
env: [stg, prd]
terraform init, validate, lint, plan
1
2
3
4
5
6
7
    - name: ${{ matrix.env }} Terraform Init
...
- name: ${{ matrix.env }} Terraform Validate
...
- name: ${{ matrix.env }} Terraform Lint
...
- name: ${{ matrix.env }} Terraform Plan

言わずもがな、以下を実行しています。

  • terraform init
  • terraform validate
  • terraform lint
  • terraform plan

kenzo0107/terraform-github-actions/init@v0.6.0 が terraform v0.11.14 に対応しています。

init, validate, lint は指摘事項がある場合は、Pull Request にコメントしてくれます。

terraform plan は必ず実行結果を貼り付けてくれます。

これはレビュワーに有難い機能です。

コードの変更内容と terraform plan 内容の整合性が取れているかどうかが重要なレビュー観点となる為です。

実行パス指定

パスを移動してから terraform plan 等を実行したい場合に以下環境変数に指定します。

1
TF_ACTION_WORKING_DIR: './envs/${{ matrix.env }}'

kenzo0107/terraform-github-actions/plan@v0.6.0 では、
上記の設定した TF_ACTION_WORKING_DIR を terraform plan 実行内容と共に表示するようにしています。((hashicorp/terraform-github-actions では、実行したディレクトリパスは Pull Request コメントに乗らない様になってます。))

これは terraform plan 実行内容から stg, prd どちらで実行したかわかりずらく、レビュワーを困惑させる可能性がある為です。

secrets の設定
1
2
3
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

secrets.GITHUB_TOKEN は secrets にトークンを設定する必要がありません。

個人的に GitHub が実行する CI/CD だからこそ実現できる秘匿性のある管理方法で、 Actions の大きな利点だと思います。

その他は、 settings > secrets で設定します。

.github/workflows/fmt.yml

terraform fmt を stg, prd 等は関係なく、リポジトリのルートディレクトリで実行するので
.github/workflows/main.yml とは分けました。

こちらも Pull Request をトリガーとして実行されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
name: Terraform
on: [pull_request]

jobs:
on-pull-request:
name: On Pull Request

runs-on: ubuntu-latest

steps:
- name: Checkout Repo
uses: actions/checkout@v1

- name: Terraform fmt
uses: kenzo0107/terraform-github-actions/fmt@v0.6.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

総評

GitHub Actions に触れてみようとした題材として非常に簡易だったのでとっつきやすかったです。

そして何より、手間かけましたが、 0.12 系に対応した方が早かったかもしれない…

やんごとなき理由で 0.11 にしている場合以外は、最新に追従した方が良いですね♪

以上
参考になれば幸いです。

terraform 0.11 系に対応した GitHub Actions 作った & tflint も入れてみた♪

https://kenzo0107.github.io/2019/09/30/2019-10-01-terraform-0-11-github-actions-tflint/

Author

Kenzo Tanaka

Posted on

2019-10-01

Updated on

2020-07-29

Licensed under

コメント