Terraform-study-week7 (feat.t101) terraform+github연동시 생길 수 있는 트러블슈팅

murphybread·2023년 8월 19일
post-thumbnail

해당 교제를 기반으로 진행한 스터디한 내용을 정리한 것입니다
테라폼으로 시작하는 IaC https://www.yes24.com/Product/Goods/119179333

소스는 다음의 링크에서 확인 가능합니다
https://github.com/murphybread/intergreation_TFC

이번주차에서는 Github action에러를 해결하는데에 포커싱을 맞췄습니다.
그 과정에서의 트러블 슈팅과정을 설명하고자합니다

먼저 구조는 다음과 같습니다

.
├── .github
│   └── workflows
│       └── test.yaml
├── .gitignore
├── .terraform
│   ├── environment
│   ├── providers
│   │   └── registry.terraform.io
│   └── terraform.tfstate
├── .terraform.lock.hcl
├── LICENSE
├── README.md
├── imgs
│   ├── github_action_secret.png
│   └── github_action_success.png
├── main.tf
└── provider.tf

github action 사용하는 이유
githubaction 사용 방법

  1. 권한 문제인줄 알았을 때
  2. 비슷한 이슈 확인
  3. terrascan확인
  4. terrascan version 확인
  5. scan job 지우기
  6. tfc token확인
  7. aws variable 등록
  8. tfc +github action 성공

github action 사용하는 이유

gihub action을 사용한다면 CI/CD 파이프라인 자동화를 구축할 수 있습니다. 테라폼에서는 TerraformCloud(이하TFC)와 연동하여 Github에서소스 코드 수정시 TFC가 돌아가게하는 action을 자동화 할 수 가 있습니다. 단순히 action을 테라폼을 수정하는것 뿐만아니라보안 인증이나, 설정 체크나 특정 변수를 저장해놓고 사용할 수 있습니다

github action 사용하는 방법

CI/CD 를 사용할 때 해당 작업들을 실행하기 위한 파일이 필요하다. Jenkins의 Jenkinsfile이나 GitLab의 .gitlab-ci.yaml과 같은 방법이다.
이를 특정 디렉토리인 .githubworkflows아래에 위치함으로써 github action을 동작시킨다

원래라면 동작에 문제가 없지만 해당 동작에 문제가 생기면서 이에 대한 원인을 파악하는 과정을 거치게 됐다.

1. 권한 문제인줄 알았을 때

처음 action을 실행할 때 job log을 통해 upload-sarif@v2라는 job에서 문제가 생기고 권한 문제라고 파악했다

그래서 yaml을 분석한 결과 해당job에서 repo에 접근하지 못하는 점이라 생각을 했고 실제로 job에서는 token을 적는 칸이 누락돼 있어 이를 원인이라 생각했다.

  #     - name: Upload SARIF file
  #       uses: github/codeql-action/upload-sarif@v2
  #       with:
  #         sarif_file: terrascan.sarif
  #         # token: ${{ secrets.GH_TOKEN }}

2. 비슷한 이슈 확인

하지만 위와 같은 권한이 있는 토큰을 넣어줬을 때 문제가 404에러로 바뀌면서 뭔가 잘못 짚었다는 생각을 하게 돼어서 에러문구를 중심으로 찾은결과 비슷한 문제를 겪고 있는것들을 알 수 있었다.
https://github.com/tenable/terrascan/issues/1390

3. terrascan확인

해당 게시물을 분석해서 일단 문제가 생기는 부분이 terrascan임으로 예상하고 terrascan을 로컬에 설치하여 테스트 해보기로 했다. 그 와주엥 공식사이트에서 제공하는 명령어가 제대로 작동 안했다. 아키텍처 오류라는 표기였는데 window에서 wsl을 쓰는 경우라서 그럴 수 있다고 예상만하고 실제로는 파일을 직접 다운받는 방식으로 로컬에 terrascan을 설치했다.

공식 사이트 제공 명령어

$ curl -L "$(curl -s https://api.github.com/repos/tenable/terrascan/releases/latest | grep -o -E "https://.+?_Darwin_x86_64.tar.gz")" > terrascan.tar.gz
$ tar -xf terrascan.tar.gz terrascan && rm terrascan.tar.gz
$ install terrascan /usr/local/bin && rm terrascan
$ terrascan

해결 방법
release 페이지에 들어가 직접 임의의 파일 다운 후 압축해제
terrascan_1.18.3_Linux_x86_64.tar.gz

 tar -xf terrascan_1.18.3_Linux_x86_64.tar.gz terrascan
 install terrascan /usr/local/bin
 sudo install terrascan /usr/local/bin
 terrascan

4. terrascan version 확인

문제의 원인을 계속 나오는 에러메시지인
/github/workspace/provider.tf:2,3-8: Unsupported block type; Blocks of type "cloud" are not expected here.
클라우드 블럭 인식 에러로 생각하여 terrascan 및 terraform 버전도 확인하였다.

terraform

terrasacn의 버전은 최신이였으며 terrascan에서 v15라는 현재 테라폼 버전인 1.15를 지원하는 것을 확인할 수 있었다. 결국 여기서 막혔기에 terracan을 사용하지 않고 action을 동작해보기로 하였다

5. scan job 지우기

해당 job을 지우기 위해서는 간단하게 해당 job을 기술한 yaml을 주석처리해주면 된다

  # SCAN:
  #   name: SCAN
  #   runs-on: ubuntu-latest
  #   steps:
  #     - name: Check out code
  #       uses: actions/checkout@v3

  #     - name: Run Terrascan
  #       id: terrascan
  #       uses: tenable/terrascan-action@main
  #       with:
  #         iac_type: "terraform"
  #         iac_version: "v15"
  #         policy_type: "aws"
  #         only_warn: true
  #         sarif_upload: true

  #     - name: Upload SARIF file
  #       uses: github/codeql-action/upload-sarif@v2
  #       with:
  #         sarif_file: terrascan.sarif
  #         # token: ${{ secrets.GH_TOKEN }}

6. tfc token확인

하지만 테라폼에서 권한이 충분하지 않다는 에러가 나왔다.
그래서 tfc token에서도 org를 통제하는 토큰과 user token이 따로있어서 이런 권한 문제가 원인일지 모른다 생각해 user token을 새로발급해 github action에 등록해주었다.하지만 문제가 그대로 해결되지 않았고 local에서 테스트를 해보았다.

local에서는 다음과 같은 에러문구로 살짝 다르게 나왔기에 해당 에러가 aws 권한 문제라고 생각하여 tfc에 변수를 등록해주기로 했다.

To view this run in a browser, visit:
https://app.terraform.io/app/hashicorp-devops/terraform-aws-github-action-local/runs/run-FbzZJGuXbESM3YMV

Waiting for the plan to start...

Terraform v1.5.4
on linux_amd64
Initializing plugins and modules...
╷
│ Error: configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.
│ 
│ Please see https://registry.terraform.io/providers/hashicorp/aws
│ for more information about providing credentials.
│
│ AWS Error: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, request canceled, context deadline exceeded
│
│
│   with provider["registry.terraform.io/hashicorp/aws"],
│   on provider.tf line 13, in provider "aws":
│   13: provider "aws" {
│
╵
Operation failed: failed running terraform plan (exit 1)

7. aws variable 등록

terraform이 동작하는데 필요한 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY를 local에서 등록했다.
그 결과 성공!

8. tfc +github action 성공

local에서도 성공한 만큼 github과 연동하여 main 브랜치 수정시 action이 돌아가며 tfc를 실행하는 것을 볼 수 있다.

사실 이 일련의 동작을 하기위한 scan job은 코드에 보안문제 관련 하드코딩이 돼있나등을 검사해주는 중요한 작업이기에 prod 환경에서 사용하기 위해서라면 필수로 사용해야한다. 하지만 이 동작을 위한 terrascan 명령어가 terrarom 1.0이상부터 지원되는 cloud block을 인식하지 못하는 것 같다는것이 내 예상이다

트러블 슈팅 보고서

IaC 코드 스캔 시 에러 발생

현상: IaC 코드의 보안점을 검사하는 github action시 terraform의 명령어를 인식하지 못하는 문제로 해당 검사가 수행히 되지 않으며, 이로 인해 CI/CD 동작을 안함

원인: 해당 검사를 수행하는 terrascan의 문제로 이와 관련된이슈를 다른 곳에서도 동일하게 겪고 있으며, 해결할 수 있는 방법이 현재로서는 나오지 않은 상태

해결방법: 해당 기능을 임시적으로 제거하여 수행

의견: 보안과 관련된 내용이니만큼 대체제를 통해 수행할 필요가 있다고 생각. 대표적으로 GItLab같은경우에도 IaC에 대한 Security scan을 진행하는 만큼 다른 툴을 사용하여 해당 보안문제를 대처한 후 현재로서는 action동작만 수행하는 job을 수행하는것이 최선이라 여김

profile
어제를 후회하지 않고, 오늘을 살며, 내일을 걱정하지 않는 삶이 되도록 노력중

0개의 댓글