개요
Terraform plan과 apply를 수행하기 위해서 GitHub Workflow를 작성하는 과정을 정리 해보았다.
Terraform plan
공식문서인 링크에서 예시로 제공해주는 yml 파일을 확인하면 Terraform Cloud를 사용하는 것을 알수 있었다. 나는 Terraform Cloud를 사용하지는 않기 때문에 다른 예시를 찾았다.
예시에서는 plan과 apply를 하나의 워크플로우로 관리하는데 나는 plan과 apply를 나눌것이기 때문에 별개의 yml 파일로 구성해주었다.
[기존 버전]
name: Terraform dev plan
on:
# 수동 실행 포함
workflow_dispatch:
push:
# dev branch의 경우에만 push
branches:
- "dev"
permissions:
id-token: write
contents: read
jobs:
terraform-plan:
name: Terraform Plan
runs-on: ubuntu-latest
outputs:
tfplanExitCode: ${{ steps.tf-plan.outputs.exitcode }}
steps:
- uses: actions/checkout@v4
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_wrapper: false
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
# assume role을 위한 arn
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: us-east-1 # Required
- name: Move workdir to dev
run: cd ./environment/dev
- name: Terraform Init
run: terraform init
- name: Terraform Format
run: terraform fmt -check
- name: Terraform Plan
id: tf-plan
run: |
export exitcode=0
terraform plan -var-file="environment/dev/dev.tfvars" -detailed-exitcode -no-color -out tfplan || export exitcode=$?
echo "exitcode=$exitcode" >> $GITHUB_OUTPUT
if [ $exitcode -eq 1 ]; then
echo Terraform Plan Failed!
exit 1
else
exit 0
fi
[수정 버전]
name: Terraform dev plan
on:
# 수동 실행 포함
workflow_dispatch:
# dev branch에 push 될 시 workflow가 실행
push:
paths:
- "**.tf"
- "**.yml"
branches:
- "dev"
# OIDC jwt token 발급을 위한 설정
permissions:
id-token: write
contents: read
jobs:
terraform-plan:
name: Terraform Plan
runs-on: ubuntu-latest
outputs:
tfplanExitCode: ${{ steps.tf-plan.outputs.exitcode }}
steps:
- uses: actions/checkout@v4
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_wrapper: false
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
# assume role을 위한 arn
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: us-east-1
- name: Terraform Init
run: terraform init
working-directory: environment/dev
- name: Terraform Format
run: terraform fmt -check
- name: Terraform Plan
id: tf-plan
working-directory: environment/dev
run: |
export exitcode=0
terraform plan -input=false -var-file="dev.tfvars" -detailed-exitcode -no-color -out tfplan || export exitcode=$?
echo "exitcode=$exitcode" >> $GITHUB_OUTPUT
if [ $exitcode -eq 1 ]; then
echo Terraform Plan Failed!
exit 1
else
exit 0
fi
위와 같이 구성해주었다.
중간에 겪었던 문제가 하나 있다.
terraform plan 시 환경 변수가 없어서 변경 사항을 추적하지 못하는 문제점이다. plan 시 환경 변수를 지정할 수 있게 -var-file 파라미터를 통해 var file을 지정해 주었고, 다른 예제에서는 다 example.tfvars 로만 지정을 해서 경로 기반으로 파일을 지정해줄수 없는지 확인 했는데 잘 되어서 경로 기반으로 지정해주었다.
Terraform apply
[기존 버전]
name: Terraform dev apply
on:
workflow_dispatch:
permissions:
id-token: write
contents: read
jobs:
terraform-apply:
name: Terraform Apply
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_wrapper: false
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
# assume role을 위한 arn
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: us-east-1 # Required
- name: Move workdir to dev
run: cd ./environment/dev
- name: Terraform Init
run: terraform init
- name: Terraform Apply
run: terraform apply -auto-approve -var-file="dev.tfvars"
[수정 버전]
name: Terraform dev apply
on:
workflow_dispatch:
permissions:
id-token: write
contents: read
jobs:
terraform-apply:
name: Terraform Apply
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_wrapper: false
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
# assume role을 위한 arn
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: us-east-1 # Required
- name: Terraform Init
run: terraform init
working-directory: environment/dev
- name: Terraform Apply
run: terraform apply -auto-approve -var-file="dev.tfvars"
working-directory: environment/dev
apply 도 동일하게 구성해주었다. apply의 경우 workflow_dispatch를 이용해서 수동으로 테스트를 진행 후 plan Workflow를 트리거로 받아서 적용해보고자 했다.
그런데 테스트를 진행하는 과정에서 문제가 발생했다. 아무리 workflow_dispatch를 이용해 workflow를 구성해도 GitHub 웹 콘솔에서는 Run을 할수있는 버튼이 생겨나지 않았다.
gh 명령어를 사용해도 could not create workflow dispatch event: HTTP 422: Workflow does not have 'workflow_dispatch' trigger (https://api.github.com/repos/Familiar-org/Familiar-terraform/actions/workflows/111031181/dispatches) 에러나 404 error 만 뱉고 있었다.
One thing that's not mentioned in the documentation: the workflow must exist on the default branch for the "Run workflow" button to appear. Once you add it there, you can continue developing the action on its own branch and the changes will take effect when run using the button.
문서에 언급되어 있지 않은 한 가지 사항은 '워크플로 실행' 버튼이 표시되려면 워크플로가 기본 브랜치에 있어야 한다는 것입니다. 여기에 추가한 후에는 자체 브랜치에서 작업을 계속 개발할 수 있으며 버튼을 사용하여 실행할 때 변경 사항이 적용됩니다.
검색을 하다보니 GitHub의 Default 브랜치에 Workflow 파일이 존재 해야한다는 사실을 발견했고, dev 브랜치를 새로 구성해서 개발을 진행하고 있다보니 Merge를 하지 않아서 발생한 문제인걸로 파악을 했다. 링크에서 확인했다.
머지를 진행하고 나니 정상적으로 보이는 것을 확인할 수 있었다.
당분간은 수동으로 사용하다가 dev 환경의 경우 바로바로 적용될 수 있게끔 할 예정이다.
[참조] :
'기타 > 토이프로젝트' 카테고리의 다른 글
[Familiar] Terraform output for 반복문 사용하기 (0) | 2024.08.20 |
---|---|
[Familiar] Terraform 구조 잡기 & 문제 해결 (0) | 2024.08.08 |
[Familiar] 테라폼 사용을 위한 Github Actions OIDC 설정 (0) | 2024.08.02 |
[Familiar] 토이 프로젝트 개요 (0) | 2024.08.01 |