dshimizu/blog/alpha

とりとめのないITブログ

GitHub Actionsを使ってPullReqをトリガーにしてTerraform Planを実行させてみた

GitHub Actionsが11/13に正式リリースされた。

参加はしていないけど Terraform meetup tokyo #3@dehio3 様が以下の発表をされていたそうで、自分は今までローカルでPlan/Applyをやっていたのでこの資料を参考にTerraform × GitHub Actionsをやってみた。

GitHub ActionsのWorkflowを作成

GitHub Actionsで、TerraformのPlanやApplyを実行するためのWorkflowを作成する。

Terraformコードが格納されたGitHubリポジトリを選択し、画面上部メニューの「Actions」タブを押下する。 次の画面で、画面上の方にある「Setup Workflow your self」ボタンを押下する。

Workflowの作成画面に遷移し、Workflowをコード化する画面となる。

ここで独自にWorkflowを定義しても良いが、hashicorp社からサンプルのWorkflowのコードが公開されているため、これをほぼそのまま使うこともできる。

この中でactions.ymlをそのまま利用できる。

GitHubからPlanを実行できるようにするために、AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY環境変数をコードにベタ書きするのではなく、GitHubのSecretsに登録するように変更する。

name: 'Terraform GitHub Actions'
on:
  - pull_request    # pull requestが出された時にこのGitHub Actionsを実行する
jobs:
  terraform:
    name: 'Terraform'
    runs-on: ubuntu-latest
    steps:
      - name: 'Checkout'
        uses: actions/checkout@master
      - name: 'Terraform Format'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'fmt'
          tf_actions_working_dir: '.'
          tf_actions_comment: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      - name: 'Terraform Init'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'init'
          tf_actions_working_dir: '.'
          tf_actions_comment: true
          args: '-var-file="terraform.tfvars"'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      - name: 'Terraform Validate'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'validate'
          tf_actions_working_dir: '.'
          tf_actions_comment: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      - name: 'Terraform Plan'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'plan'
          tf_actions_working_dir: '.'
          tf_actions_comment: true
          args: '-var-file="terraform.tfvars"'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

GitHubへのSecretsの登録

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYGitHubのSecretsに登録する。

Terraformコードを格納したリポジトリを選択し、画面上のメニューで「Settings」を選択する。 次のページの画面左メニューから「Secrets」を選択する。 Name、Valueの形で入力する必要があるので、形式に沿って入力する。

AWS_ACCESS_KEY_ID アクセスキーの値
AWS_SECRET_ACCESS_KEY シークレットキーの値

Actionsの実行

上述のコードで、pull requestが出された時にActionsを実行するようになっているので、PullReqを出してActions(ここではTerraform plan)が実行されることを確認する。

on:
  - pull_request

Planが成功すればそのままMergeしてOK。Applyも自動で実行できるかもしれないが、そこまでは試せていないのでわからない。 Planに失敗した場合Terraformコードに問題があることがわかるので、CIをGitHub上だけで完結できて便利になった。

まとめ

GitHub Actionsを使ったTerraform Planの自動実行を、記事に記載した資料を参考に設定してみた。 Workflowを使うことで、GitHub上でTerraformのCI/CDを実装できそうで、とても便利そうだった。

参考