以前にCircleCIでTerraform CI/CD環境を作りましたが、振り返るとpath-filteringの学習コストが高いという印象を受けました。逆にGitHub Actionsではpathsでサクッと作ることができたのでご紹介したいと思います。
[CircleCI][Orbs][path-filtering]特定ディレクトリに差分が出たらterraform applyを適用するように実装してみた
準備と設計
- 準備
クレデンシャルはGitHub Actionsで管理すると煩雑になってしまうのでOIDCにしましょう。
- 設計
- プルリクエスト時/terraformディレクトリ配下に差分がある場合
- terraform fmt
- terraform validate
- terraform plan
- masterマージ/terraformディレクトリ配下に差分がある場合
- terraform apply
- プルリクエスト時/terraformディレクトリ配下に差分がある場合
GitHub Actions
- terraform_ci.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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
name: Terraform CI on: pull_request: paths: - "terraform/**" env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_USERNAME: terraform-ci SLACK_CHANNEL: notify_ci SLACK_ICON: https://avatars.githubusercontent.com/u/44036562?s=280&v=4 AWS_ROLE_NAME: githubactions-oidc AWS_ROLE_SESSION_NAME: githubactions-oidc AWS_REGION: ap-northeast-1 permissions: id-token: write contents: read jobs: terraform_ci: name: Terraform CI runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Configure AWS OIDC uses: aws-actions/configure-aws-credentials@master with: role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ env.AWS_ROLE_NAME }} role-session-name: ${{ env.AWS_ROLE_SESSION_NAME }} aws-region: ${{ env.AWS_REGION }} - name: Setup Terraform uses: hashicorp/setup-terraform@v2 with: terraform_version: 1.3.0 - name: Terraform init id: init working-directory: ./terraform run: terraform init - name: Terraform fmt id: fmt working-directory: ./terraform run: terraform fmt -check - name: Terraform validate id: validate working-directory: ./terraform run: terraform validate -no-color - name: Terraform plan id: plan working-directory: ./terraform run: terraform plan -no-color - name: Slack Success if: ${{ success() }} uses: rtCamp/action-slack-notify@v2 env: SLACK_TITLE: terraform plan Success SLACK_COLOR: good - name: Slack Failure if: ${{ failure() }} uses: rtCamp/action-slack-notify@v2 env: SLACK_TITLE: terraform plan Failure SLACK_COLOR: danger |
https://github.com/hashicorp/setup-terraform
36行目で setup-terraform
を利用していますが、以前まではterraform-github-actionsしかなく、可読性が悪いのとコードの柔軟性がありませんでした。
また、validateやplan時に -no-color
を指定していますが、GitHub Actionsのログがうまく表示されないため色なしで出力しています。
- terraform_cd.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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
name: Terraform CD on: push: branches: [master] paths: - "terraform/**" env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_USERNAME: terraform-cd SLACK_CHANNEL: notify_ci SLACK_ICON: https://avatars.githubusercontent.com/u/44036562?s=280&v=4 AWS_ROLE_NAME: githubactions-oidc AWS_ROLE_SESSION_NAME: githubactions-oidc AWS_REGION: ap-northeast-1 permissions: id-token: write contents: read jobs: terraform_cd: name: Terraform CD runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Configure AWS OIDC uses: aws-actions/configure-aws-credentials@master with: role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ env.AWS_ROLE_NAME }} role-session-name: ${{ env.AWS_ROLE_SESSION_NAME }} aws-region: ${{ env.AWS_REGION }} - name: Setup Terraform uses: hashicorp/setup-terraform@v2 with: terraform_version: 1.3.0 - name: Terraform init id: init working-directory: ./terraform run: terraform init - name: Terraform apply id: apply working-directory: ./terraform run: terraform apply -auto-approve -no-color - name: Slack Success if: ${{ success() }} uses: rtCamp/action-slack-notify@v2 env: SLACK_TITLE: terraform apply Success SLACK_COLOR: good - name: Slack Failure if: ${{ failure() }} uses: rtCamp/action-slack-notify@v2 env: SLACK_TITLE: terraform apply Failure SLACK_COLOR: danger |
- 確認
fmtに失敗すればエラーを返しています。
terraform planが通り、masterマージでapplyされています。
まとめ
CircleCIと比べると圧倒的にpathsの学習コストが低いため、工数はかかることなく実装することができました。ECSやFargateでのデプロイもサクッとできそうなので後で試してみたいと思います。
0件のコメント