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 설정 추가를 해서 승인자를 둘 수도 있다.