Github Actions 으로 terraform 실행하기

terraform tutorials

Automate Terraform with GitHub Actions | Terraform | HashiCorp Developer

https://github.com/hashicorp/learn-terraform-github-actions

 

terraform github actions : tutorials과 terraform github actions 내용이 약간 다르며 terraform github actions 페이지가 더 최신 정보임. https://github.com/hashicorp/setup-terraform

 

github에서 AWS key 관련한 환경변수를 설정을 해야 함. (gitrepo - Setting - Secrets - Actions - Repository secrets). github actions 에서는 env를 이용해서 해당 변수 설정하여 사용을 함.

AWS_ACCESS_KEY_ID

AWS_SECRET_ACCESS_KEY

 

hashicorp/setup-terraform@v2 : 가장 최신의 terraform cli 를 설치함. 버전을 지정할 수도 있음. wrapper 스크립트를 기본 설치하여 terraform 의 STDOUT, STDERR, exit code 출력값을 이용할 수 있음.

wrapper 스크립트를 설치하면 하위의 step에서 output에 접근할 수 있다. output을 이용하여 pull request에 대한 코멘트를 달 수 있다. 이를 통해 팀은 Terraform Cloud를 여는 대신 PR에서 직접 terraform plan 결과를 검토할 수 있다. 이 단계는 pull 요청에서만 실행된다. (if: github.event_name == 'pull_request')

continue-on-error: true 를 설정하면 에러가 나도 다음 단계로 넘어갈 수 있도록 할 수 있다. 이렇게 하면 이 단계가 실패하더라도 다음 단계에서 계획 오류 메시지를 표시할 수 있습니다.

 

name: "Terraform" on: push: branches: - main pull_request: env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} jobs: terraform: name: "Terraform" runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Terraform uses: hashicorp/setup-terraform@v2 # with: # terraform_version: 1.1.7 # terraform_wrapper: true # cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }} - name: Terraform Format id: fmt run: terraform fmt -check - name: Terraform Init id: init run: terraform init - name: Terraform Validate id: validate run: terraform validate -no-color - name: Terraform Plan id: plan # if: github.event_name == 'pull_request' run: terraform plan -no-color continue-on-error: true - uses: actions/github-script@v6 if: github.event_name == 'pull_request' env: PLAN: "terraform\n${{ steps.plan.outputs.stdout }}" with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const output = `#### Terraform Format and Style 🖌\`${{ steps.fmt.outcome }}\` #### Terraform Initialization ⚙️\`${{ steps.init.outcome }}\` #### Terraform Validation 🤖\`${{ steps.validate.outcome }}\` <details><summary>Validation Output</summary> \`\`\`\n ${{ steps.validate.outputs.stdout }} \`\`\` </details> #### Terraform Plan 📖\`${{ steps.plan.outcome }}\` <details><summary>Show Plan</summary> \`\`\`\n ${process.env.PLAN} \`\`\` </details> *Pusher: @${{ github.actor }}, Action: \`${{ github.event_name }}\`, Working Directory: \`${{ env.tf_actions_working_dir }}\`, Workflow: \`${{ github.workflow }}\`*`; github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: output }) - name: Terraform Plan Status if: steps.plan.outcome == 'failure' run: exit 1 - name: Terraform Apply if: github.ref == 'refs/heads/main' && github.event_name == 'push' run: terraform apply -auto-approve -input=false

 

 

branch를 만들어서 PR을 하면 github actions 가 실행이 된다. PR 화면에서 terraform validate, terraform plan 결과를 바로 확인할 수 있다.

운영환경에서는 Branch Protection rule 로 “Require status checks to pass before merging” 를 설정하면 좋다. 이렇게 하면 main 에 머지가 되기 전에 workflow가 정상적으로 완료가 되었는지를 확인할 수 있다.

Branch protection rule 에 Require approvals 설정 추가를 해서 승인자를 둘 수도 있다.