Terraform Cloud 기반으로 인프라 구축 협업하기

MD@Technology Management

안녕하세요. VNTG에 DevOps Engineer 포지션으로 입사한 이동열입니다. DevOps Engineer라고 하면 개발과 운영을 하나로 통합해 변화에 빠르게 대응할 수 있도록 도구들을 사용하거나 방법론을 선택해 개발과 운영에 대한 인프라를 구축해나가는 업무를 수행합니다. 저는 회사 체계를 정립하고 다른 조직이 DevOps를 실현할 수 있도록 인프라단위의 지원업무를 맡고 있습니다!

첫 기술블로그 포스팅으로 Terraform Cloud를 활용한 GCP 기반 인프라 협업에 대한 내용을 적어보려합니다.

Terraform과 Terraform Cloud

Terraform은 인프라를 안전하고 효율적으로 구축, 변경 및 버전 관리하기 위한 도구입니다. 클라우드를 사용해 인프라를 구축해 보았다면 일정 규모 이상의 인프라 구축 시 자신이 어떤 리소스를 어떻게 생성 했는지 헷갈릴 때가 있었을 것입니다. 테스트를 위해 지우고 다시 생성하거나, 개발환경에서 Production 환경으로 마이그레이션 할 때, 규모가 크다면 일관성 있는 인프라를 구축하기가 힘들고 어플리케이션이 정상 동작하지 않을 수도 있습니다. 이러한 것들을 예방하기 위해 인프라를 코드로 관리하여 쉽고 간편하게 인프라의 일관성을 유지하고 관리 할 수 있습니다. 이러한 관리 기법을 코드형 인프라(Infrastructure as Code, IaC)라고 하며 Terraform은 IaC에서 대표적으로 사용되는 도구 중 하나입니다.

그럼 Terraform Cloud는 무엇일까요? 인프라를 구축하는 여러명의 Engineer가 Terraform을 사용해 협업한다고 생각해보면 각자가 수정한 부분에 대한 인프라를 모두가 검증할 필요가 있습니다. 특히 인프라의 경우는 시스템 전체에 영향을 끼칠 수 있고 문제 발생시 그 원인을 찾는 것이 굉장히 힘들기 때문에 사전에 철저하게 검토해야합니다. Terraform Cloud를 사용하면 버전관리 시스템과 연동해 코드를 관리하고 인프라가 변경되기전에 모두의 검토를 받을 수 있습니다. 즉, Terraform Cloud는 Terraform으로 쉽게 협업을 할 수 있도록 도와주는 도구입니다.

Terraform Cloud 시작하기

샘플 Terraform Code를 Fork합니다.

GitHub - vntg-ldy/vntg-terrafrom-cloud-gcp-sample

위 Repository의 Terraform 코드는 네트워크 모듈로만 구성되어 있습니다. main branch는 초기 상태의 코드이며, chapter01 branch는 이 블로그에서 진행된 내용이 포함되어 있는 코드입니다. README.md에 적혀있는 대로 따라하시게 되면 web, was, proxy에 대한 네트워크 리소스가 생성됩니다.

그럼 위 샘플 코드를 사용해 Terraform Cloud를 사용해보도록 하겠습니다.

먼저, Terraform Cloud를 사용하기 위해서는 Terraform Cloud 계정을 만들고 작업공간을 생성해야합니다. 작업공간은 Github의 Repository와 같은 역할을 한다고 생각하시면 됩니다. 기본적으로 Terraform Cloud의 작업 공간에는 구성 파일, 환경 변수, 입력 변수, 상태 파일 등이 포함되어 있습니다.

https://app.terraform.io/signup/account

위 링크로 이동해 Terraform Cloud 계정을 생성하고 작업 공간을 생성합니다. 계정을 생성하게 되면 이메일 인증 후 setup workflow를 선택하라는 페이지가 출력되는데 그 중 Start from scratch을 선택합니다. 선택을 하게 되면 조직을 생성하는 페이지가 출력됩니다. 원하는 이름으로 조직까지 생성하면 이제 조직내에 작업 공간을 생성할 수 있게 됩니다.

그럼 생성한 조직으로 이동해 작업 공간을 생성합니다. 작업 공간은 Workspaces 우측 상단에 New workspace를 클릭해서 생성할 수 있습니다.


클릭하면 Version control workflow, CLI-driven workflow, API-driven workflow 중에서 하나의 workflow를 선택하는 페이지가 출력되는데, 지금은 Github와 연동해서 사용할 것이기 때문에 Version control workflow를 선택하도록 합니다.


그러면 Provider를 선택하는 페이지가 출력됩니다. 저의 경우에는 이미 이전에 Github와 연동해서 사용한 이력이 존재해 페이지에 Github만 표시되어 있지만 Terraform Cloud를 처음 사용하시는 분들이라면 Github 외에도 여러 Provider들이 표시되어 있을 겁니다. 이 중에 Github를 선택하시면 되며, 이전에 다른 Provider를 사용하셨던 분들이라면 하단의 Connect to a different VCS를 클릭해 Github를 선택할 수 있습니다.


Github 버튼을 클릭하게 되면 Github Repository를 선택할 수 있습니다. 하지만 해당 Provider로 처음 생성하는 것이라면 계정 연결 절차를 먼저 진행하게 되며 특별한 것 없이 안내해주는 대로 인증해주시면 됩니다.


Repository를 선택했으면 작업 공간의 이름과 설명을 입력해줍니다.


Workspaces에 작업 공간이 생성된 것을 볼 수 있습니다.


해당 작업 공간으로 이동하면 Github Repository가 연동돼 README.md가 출력되는 것을 볼 수 있습니다.


Terraform Cloud 변수

Terraform을 개인적으로 사용해보셨다면 terraform apply 명령어를 사용해 Terraform 코드를 직접 실행 하셨을 것입니다. 하지만 Terraform Cloud를 사용하면 Terraform 코드는 Terraform Cloud에서 실행하게 됩니다. 그 말은 Terraform 코드를 실행시키기 위한 GCP 인증 정보나 실행 시 필요한 각종 변수들이 Terraform Cloud 내에 정의되어 있어야 한다는 뜻입니다.

그럼 제일 먼저 GCP 리소스를 생성하기 위한 GCP 인증 정보에 대한 변수를 생성합니다. 인증 정보에 대한 변수를 생성하기 위해서는 GCP의 인증 정보를 먼저 가지고 있어야 합니다. GCP의 인증 정보는 GCP내 IAM 및 관리자 → 서비스 계정에서 생성할 수 있으며, 서비스 계정 생성 후 해당 계정의 키 관리 메뉴로 이동하면 json 형식의 비공개 키 파일을 만들고 다운로드 받을 수 있습니다.

서비스 계정을 사용해 GCP 리소스를 생성하기 위해서는 서비스 계정이 해당 리소스 생성에 대한 권한을 가지고 있어야합니다.


위 절차대로 GCP에서 비공개 키 파일을 만들고 다운로드 받았다면 Terraform Cloud의 작업 공간으로 이동해 탭 메뉴에서 Variables를 클릭 합니다.

그러면 변수를 관리하는 페이지가 출력됩니다. 이 페이지에서는 작업 공간에서 사용할 수 있는 Terraform 변수나 환경 변수 등을 관리할 수 있습니다. 여기서 환경 변수를 등록하기 위해서는 페이지 중간에 Workspace variables의 Add variable을 클릭합니다. 그 다음 Environment variable(환경 변수)를 체크하고 Key에 GOOGLE_CREDENTIALS, Value에는 위에서 생성한 비공개 키 파일 내용 전체를 복사해 붙여넣습니다. 그리고 노출되면 안되는 민감한 변수 이므로 Sensitive를 체크합니다. Sensitive를 체크하게 되면 헤딩 변수가 UI나 API에 표시되지 않습니다.

GCP 서비스 계정의 비공개 키를 확인해보면 줄바꿈이 포함되어 있는 json형식으로 되어 있습니다. Terraform Cloud는 줄바꿈이 포함되어 있는 변수를 등록하면 정상 작동하지 않아 반드시 줄바꿈을 전부 제거한 후 등록해주셔야 합니다.



환경변수를 잘 등록했다면 이제 Terraform 변수도 등록합니다. Terraform 변수는 말그대로 Terraform에서 사용할 변수를 말합니다. 로컬에서 실행했을 때 지정하던 변수값을 똑같이 지정해주면 됩니다. 위에서 받은 코드는 대부분의 변수에 default값이 설정되어 있지만 Project와 Region은 설정되어 있지 않아 변수를 꼭 등록해주어야 합니다. 변수는 아래처럼 추가 해주시면 됩니다.


그럼 이제 Terraform Cloud를 사용해 Terraform Code를 실행시켜봅시다. 페이지 우측 상단에 보면 Actions 버튼을 볼 수 있습니다. 클릭 후 Start new plan을 클릭합니다. 그러면 plan을 시작하는 이유를 적고 최종 실행하게 됩니다.


실행과정은 로컬에서 실행하는 것과 똑같습니다. 무엇을 만들지 보여주고(plan) 팀원들이 승인하면 실제로 배포됩니다. 다른 점이라면 확인과정에서 Comment를 남길 수 있습니다.



모두가 승인했다면 위 plan대로 반영됩니다.

하지만 매번 이렇게 수동으로 코드를 실행시키기는 너무 불편합니다. 어차피 VCS에서 코드 병합전에 검토를 할 것이기 때문에 병합이 된다면 자동으로 코드를 실행하게 하는 것이 좋을 것 같습니다. Terraform Cloud에서 코드를 자동으로 실행시키려면 Automatic speculative plans를 활성화 해주어야합니다. Settings → Version Control로 이동해 Automatic speculative plans를 활성화 합니다.


이제 정상적으로 실행되는지 확인하기 위해 루트 디렉토리의 variables.tf를 열어 vpc_name의 defualt값을 tc-vpc-2로 변경 후 Commit&Push 합니다. 그러면 Terraform Cloud에서 자동으로 실행하는 것을 볼 수 있습니다.




VPC 이름을 변경해 Subnetwork까지 함께 Replace된 것을 볼 수 있습니다.


GCP에서 네트워크 리소스가 생성된 모습

후기

Terraform Cloud를 사용해보면서 느꼈던 가장 큰 장점은 굉장히 조심스럽게 다뤄야하는 인프라를 안전하게 협업할 수 있다는 점과 둘 다 Hashicorp사에서 제공하는 서비스이기 때문에 다른 CI/CD처럼 복잡한 설정없이 쉽게 설정이 가능하다는 점 이였습니다. 하지만 Terraform Cloud는 조직 내 5인이상 사용할 경우 유료이기 때문에 비용에 민감한 조직이라면 무작정 도입하는 것 보다는 5인 이하는 무료라는 점을 이용해 충분히 테스트 해보고 신중하게 결정하시는 것이 좋겠습니다.

이렇게 Terraform Cloud를 직접 사용해보고 블로그를 작성해 보았는데 막상 다 쓰고 보니 너무 간단하게만 다룬 것 같아 아쉬움이 너무 많네요! 하지만 앞으로 VNTG에서 있으면서 Terraform Cloud뿐만 아니라 다른 다양한 기술들과 도구들도 깊게 사용해 볼 것이기 때문에 다음에는 보다 알차고 재미있는 내용으로 준비해서 다시 작성해보도록 하겠습니다! 감사합니다!

Share