Terraform Cloud (1) CLI-driven workflow

FoO·2023년 7월 18일

Terraform

목록 보기
1/1
post-thumbnail

📝IaC, Terraform 그리고 Terraform Cloud

🪄IaC

IaCInfrastructure as Code의 약자로, 코드를 통해 인프라를 생성하고 관리하는 개념이다.

AWS, Azure 등의 클라우드 서비스를 이용할 때 기본적으로 콘솔을 이용한다. 다양한 리소스를 만들면서 설정, 정책, 태그 등에 대해 사람이 직접 콘솔 화면을 보며 구성한다면 의도하지 않은 휴먼 에러를 발생시킬 뿐 아니라, 일관되지 않는 인프라 개발 환경에 놓이게 된다.

2022년 GitHub에서 오픈소스 트렌드의 1위를 차지했으며, 현재도 많은 DevOps 엔지니어의 관심을 받고 있다.

🟪Terraform

테라폼은 Golang으로 작성된 IaC의 한 종류이다. HashiCorp에서 개발하여 2014년 최초로 출시 하였으며, 테라폼은 오픈 소스 코드형 인프라스트럭처로 인프라 개발자는 HCL이라는 선언형 구성 언어를 사용하여 인프라스트럭처를 코드로서 작성하고 프로비저닝할 수 있다.

프로비저닝이란?
프로비저닝은 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것을 말한다. 서버 자원 프로비저닝, OS 프로비저닝, 소프트웨어 프로비저닝, 스토리지 프로비저닝, 계정 프로비저닝 등이 있다.
- 위키백과

2022 Stackoverflow 설문조사에서 많이 사용하게 된 개발자 도구에 terraform이라고 응답한 수는 전체의 11.22% 가량을 차지한다.

HashiCorp에서는 현재 Terraform Associate 003자격을 제공하고 있다. 테라폼에 관심이 있다면 한번 응시해 보자.

☁️Terraform Cloud

What is Terraform Cloud - Intro and Sign Up

Terraform CloudHashiCorp에서 공식적으로 지원하는 인프라스트럭처 자동화와 관리를 위한 원격 작업 환경이다.

테라폼 클라우드는 테라폼 사용자들이 팀과 조직 내에서 협업하고 공유하는데 최적화되어 있다. 여러 사용자가 한 프로젝트를 함께 작업하거나, 인프라스트럭처 변경 사항을 공유하고, 원격에서 인프라스트럭처를 관리할 수 있도록 지원한다.

주요 기능

  1. 협업과 버전 관리: 팀 내의 여러 사용자가 테라폼 코드를 버전 관리하고 공유할 수 있다. 코드 변경 사항을 추적하고, 팀원들과 협업하여 인프라스트럭처를 개발하고 유지보수할 수 있다.

  2. 상태 파일 관리: 테라폼의 상태 파일을 중앙에서 안전하게 저장 및 관리한다. 이를 통해 여러 사용자가 동시에 인프라를 업데이트할 수 있고, 팀원들과 변경 사항을 쉽게 공유할 수 있다.

  3. 워크스페이스: 워크스페이스는 프로젝트의 개별 인스턴스로, 코드를 분리하여 여러 환경에 적용하거나, 각 환경의 설정을 구성하는 데 사용된다.

  4. CI/CD 통합: 테라폼 클라우드는 CI/CD 도구와 통합하여 인프라스트럭처의 지속적인 전달과 배포를 자동화 할 수 있다.

  5. 알림 및 감시: 테라폼 클라우드는 인프라스트럭처 변경 사항에 대한 알림과 감시를 지원하여, 리소스의 상태를 실시간으로 파악하고 문제를 해결하는 데 도움을 준다.

테라폼 클라우드는 테라폼 사용을 훨씬 간편하고 협업적으로 만들어주는 강력한 플랫폼이다. 클라우드 기반 인프라를 더욱 효율적으로 관리할 수 있도록 도와준다.

테라폼 클라우드는 로컬 머신이 아니라, 일관되고 신뢰가능한 환경에서 테라폼이 실행되도록 한다. 이를 통해 안전하게 state, secret data를 저장할 수 있으며, VCS(Version Control System. 대체로 Git)과 연결해 인프라 개발을 마치 애플리케이션 개발처럼 진행 할 수 있다.

테라폼 클라우드의 UI는 테라폼 프로젝트로 관리되는 리소스들을 자세히 제공하여 다양한 테라폼 사용 과정에 좀 더 명확한 가시성을 준다.

테라폼 클라우드를 이용하면 테라폼의 각 단계(init -> plan -> apply, and destroy)에서 좀 더 편하게 협업할 수 있다. 예를 들어 누군가 terraform plan을 수행하면, 다른 팀원이 리뷰를 하고 승인을 해야 apply를 할 수 있게끔 한다던지. 또한 각 단계가 진행 중일 때는 자동적으로 lock을 걸어서 state file이 덮어써지지 않게끔 한다.

💪Workflows

🗂️Project and workspace

테라폼 클라우드는 ProjectWorkspace를 제공한다. 각 워크스페이스는 Project에 속하는 형태로, 만약 따로 설정을 하지 않는다면 Default Project에 속하게 된다.

Project는 워크스페이스를 그룹화 하기 위해 생겨난 것으로 테라폼 클라우드 Standard Edition(유료)에서는 팀의 권한을 특정 프로젝트에 지정할 수도 있다.

👣Workflows

새로운 워크스페이스를 만들 때 3가지 워크플로우 중 하나를 선택할 수 있다.

새로운 워크스페이스를 만드는 화면

  • CLI-driven workflow
  • VCS-driven workflow
  • API-driven workflow

3가지 워크플로우를 간단히 설명하고 CLI-driven workflow를 직접 사용해 보자.

🔳CLI-driven workflow

테라폼 명령어를 로컬 터미널에서 입력하면 테라폼 클라우드의 원격 환경에서 명령어가 실행된다. 다양한 인풋, 환경변수 등이 현재와 이전의 state 파일과 함께 저장된다.

CLI-driven workflow를 사용하면 최소한의 설정으로 테라폼 명령어를 수행하는데 있어 보안성, 안정성, 가시성을 얻을 수 있다.

깃을 거치지 않고 거의 똑같은 개발 환경에서 진행되기 때문에 더 경량!한 마음가짐으로 수행할 수 있다.

🔀VCS-driven workflow

VCS-driven workflow를 사용하려면 깃 등과 같은 버전 컨트롤 시스템으로의 접근을 설정해야 한다. 그 다음 테라폼 코드가 있는 레포지토리에 연결하고 나면 워크스페이스 설정을 할 수 있다.

모든 Pull RequestsPlan이 실행되어, 팀원들이 인프라에 생길 변화를 확인하게끔 할수 있다. 특히 main 브랜치로의 모든 merge는 테라폼 명령어를 트리거해서 인프라 변화가 반영된다.

↔️API-driven workspace

테라폼 클라우드 API와 통신할 수 있는 툴링을 만들 수 있도록 한다.

공식 문서에서는 CLI-driven workflowVCS-driven workflow에 대해서만 tutorial을 제공하며, 테라폼 클라우드 API에 대한 문서를 따로 제공하고 있다.

🔳CLI-driven workflow

CLI-driven workflow

CLI-driven workflow를 사용하면 익숙한 CLI 환경에서 테라폼 클라우드의 협업 기능을 사용할 수 있다. 로컬 환경에서 CLI를 통해 terraform planterraform apply를 사용하면 터미널에서 각 명령어의 실행 결과를 볼 수 있으면서도, 실제 실행은 원격에서 진행된다.

🤝가입 및 Organization 만들기

처음 테라폼 클라우드에 가입하면 시작할 수 있는 다양한 옵션을 제공한다. 공식 문서를 따라 organization을 만들어 보자. (사실 감으로 진행해도 별 문제는 없다.)

만약 기존의 organization에 가입하고 싶다면, 해당 조직의 관리자에게 가입에 사용했던 이메일을 주고 초대를 부탁해야 한다.

👣Workspace 만들기

조직을 만들었다면 워크스페이스를 만들어 보자.

우측 상단의 New를 통해 새로운 프로젝트나 워크스페이스를 만들 수 있다.


워크플로우 타입을 선택하고 간단한 설정을 하면 된다. 워크스페이스 네이밍 컨벤션도 있으니 참고하자. 프로젝트는 따로 선택하지 않으면 Default Project에 속하게 된다.

워크 스페이스를 만들고 나면 구성 설정을 위한 테라폼 코드 조각을 제공한다. 이 코드 조각을 로컬 환경의 테라폼 코드에 넣고, 테라폼 CLI에서 로그인 한 뒤에 terraform init-plan-apply를 하면 된다.

🐒Terraform CLI 로그인

Log in to Terraform Cloud from the CLI

테라폼 CLI에서 테라폼 클라우드로 로그인 하려면 테라폼 CLI 버전 v1.1.0 이상이 필요하다. 그 이전 버전을 사용할 경우, CLI 구성 파일을 직접 사용해 테라폼 클라우드 인증을 할 수 있다.

☘️User Token 발급

로그인 과정에서 토큰이 필요하기 때문에 테라폼 클라우드에서 먼저 토큰을 발급 받아야 한다.

테라폼 클라우드에는 3가지 종류의 토큰이 있는데, 지금 발급받을 것은 User Token이다.

  • User Tokens : 유저 계정과 똑같은 권한을 가진다. 여러 조직에 접근할 수 있는 권한을 가지는 유일한 토큰이다. 유저 세팅 페이지에서 생성할 수 있다.
  • Team Tokens : CI/CD 파이프라인 등에서 planapply를 수행하기 위해 쓰인다. 팀 토큰 생성을 위해선 팀 세팅 페이지에 가야 한다.
  • Organization Token : 팀과 팀 멤버십, 워크스페이스 제어를 위한 토큰으로, 워크스페이스에서 planapply를 할 수 있는 권한은 없다.

유저 토큰 발급을 위해 User Settings > Tokens 페이지로 가자.

Create an API token을 클릭하고 이어지는 모달 창에 토큰이름과 만료 기간을 설정하면 유저 토큰을 발급 받을 수 있다. 토큰 창은 이때 한번밖에 제공되지 않으니 믿을만한 장소(이를테면 카톡 나에게 보내기 같은..)에 보관해둬야 한다.

🐾terraform login

테라폼 CLI v1.1.0 이상이 설치된 터미널에서 terraform login 명령어를 입력하고, 이어서 yes와 토큰값을 입력하면 된다.

$ terraform login
Terraform will request an API token for app.terraform.io using your browser.

If login is successful, Terraform will store the token in plain text in
the following file for use by subsequent commands:
    /home/leebon/.terraform.d/credentials.tfrc.json

Do you want to proceed?
  Only 'yes' will be accepted to confirm.

  Enter a value: 
  
 (...)
 
 
 Generate a token using your browser, and copy-paste it into this prompt.

Terraform will store the token in plain text in the following file
for use by subsequent commands:
    /home/leebon/.terraform.d/credentials.tfrc.json

Token for app.terraform.io:
  Enter a value: 

🫡Credentials Block

config-file - credentials

만약 v1.1.0 이전 버전의 테라폼 CLI를 사용 중이라면 Credentials Block을 이용해 테라폼 클라우드 인증을 할 수 있다. 테라폼 코드 내에 다음 블럭을 넣으면 된다.

credentials "app.terraform.io" {
  token = "xxxxxx.atlasv1.zzzzzzzzzzzzz"
}

⚙️Workspace configuration

🪄terraform init

워크스페이스를 처음 만들었을 때 안내한 코드 블럭을 로컬 환경 안에 넣고, terraform init을 수행한다.


만약 존재하지 않는 워크스페이스 이름을 사용할 경우, 테라폼 클라우드에서 자동으로 워크스페이스를 생성한다.

조직에서 global variable sets를 설정하지 않았다면 자동으로 생기는 워크스페이스에서 테라폼 변수나 환경 변수를 사용할 수 없고, 기본적으로 제일 최신 버전의 테라폼을 사용하게 되기 때문에 테라폼 클라우드 UI를 사용해 설정이 완료된 워크스페이스를 사용할 것을 권장한다.

cloud 블럭은 1.1.0 이후 버전에서만 사용 가능하며, 그 이전 버전은 remote backend릴 이용해야 한다.

✒️terraform plan

terraform init이 무사히 끝났다면 terraform plan을 통해 테라폼 클라우드에서 plan을 할 수 있다.

$ terraform plan
Running plan in Terraform Cloud. Output will stream here. Pressing Ctrl-C
will stop streaming the logs, but will not stop the plan running remotely.

Preparing the remote plan...

To view this run in a browser, visit:
https://app.terraform.io/app/<organization>/<workspace>/runs/<run id>

Waiting for the plan to start...

	(...)
Plan: 1 to add, 0 to change, 0 to destroy.

터미널에 보여지는 결과는 실제로는 테라폼 클라우드에서 실행된 내용이다.

plan 결과를 테라폼 클라우드 UI에서 볼 수 있는 URL이 제공된다. 혹은 테라폼 클라우드 워크스페이스 화면에서, 사이드바의 Run을 통해 해당 페이지에 접근할 수 있다.

아래의 안내처럼 이 Plan의 경우 팀원들의 리뷰를 위한 것으로 테라폼 클라우드에서는 speculative plan이라고 부른다. 이 Planapply를 할 수 없다. apply를 하고 싶다면 CLI에서 terraform apply를 수행해야 한다.

Remote Speculative Plans

🚀terraform apply

원격 apply run 권한이 있는 유저가 CLI를 통해 terraform apply를 수행할 수 있다.

워크스페이스가 VCS와 연결된 상태라면 원격 apply를 할 수 없다. VCS와 연결된 워크스페이스에서 원격 apply를 하고 싶다면 특정 브랜치로 merge를 수행하면 된다.

terraform apply를 수행하면 원격 실행을 한다는 안내 메시지가 나오며, 테라폼 클라우드에서 plan을 하고 다시 커맨드라인에서 apply를 할 것인지 물어본다.

$ terraform apply
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C
will cancel the remote apply if it's still pending. If the apply started it
will stop streaming the logs, but will not stop the apply running remotely.

Preparing the remote apply...

To view this run in a browser, visit:
https://app.terraform.io/app/5thofnovmbr/test-workcpace/runs/run-13bZ7NKR1Wda67jG

Waiting for the plan to start...

(...)

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions in workspace "test-workcpace"?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: no

╷
│ Error: Apply discarded.
│ 
│ 
╵

원격에서 terraform plan의 실행결과, apply를 할 것인지 여부, 결과를 볼 수 있다.

yes가 아닌 값을 넣었기 때문에 discarded 처리가 되었고, 테라폼 클라우드 Runs에서도 마찬가지로 같은 결과를 볼 수 있다.

apply를 수행하면 테라폼 클라우드에서 다시 plan이 실행되기 때문에 그것 역시 그곳에 Run List에서 볼 수 있을 줄 알았는데 Run List에 남는 planSpeculative Plans밖에 없다. apply의 결과가 나오기 전까지만 Planned로 나오고, 결과가 나오면 그 결과로 덮어써진다.


plan이 완료되고, apply를 할지에 대한 질문이 대기중인 상태


yes라고 답하면 apply가 시작되고, 기존에 planned 상태였던 Run은 다른 상태로 바뀐다.

💣terraform destroy

terraform destroy는 커맨드라인에서 실행해도 되지만, 테라폼 클라우드 UI에서도 진행할 수 있다.

workspace > Settings > Destruction and Deletion 페이지에서 destroy plan을 시작할 수 있다.

plan만 생성되었고 apply를 하기 위해선 Runs 페이지에서 Confirm & Apply를 하여야 한다.

컨펌 외에도 해당 Run에 대해 코멘트를 추가하거나 Run 자체를 취소 할 수 있다.

CLI에서 terraform destroy를 수행한 경우에도 Runs에서 확인할 수 있다.

마찬가지로 apply를 위해 터미널에 yes를 입력하지 않으면 Planned 상태로 멈춰있게 된다.

Do you really want to destroy all resources in workspace "test-workcpace"?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

aws_instance.example: Destroying... [id=i-0e806530801ea90e8]
aws_instance.example: Still destroying... [10s elapsed]
aws_instance.example: Destruction complete after 30s

Apply complete! Resources: 0 added, 0 changed, 1 destroyed.

yes를 입력해 해당 RunApplied 상태로 바꿔주자.

🖐️마무리

간단히 테라폼 클라우드와 CLI-driven workflow를 알아봤다.

테라폼 클라우드의 편리성은 VCS-driven workflow를 사용할 때 더 명확히 드러나겠지만, CLI-driven workflow 역시 개발 환경에 큰 변화를 주지 않고도 테라폼 클라우드의 이점을 누릴 수 있다는 장점이 있다.

클라우드의 발전으로 인프라 관리도 애플리케이션 개발과 같이 관리하는 시대가 열렸다. 테라폼 클라우드를 통해 좀 더 안전하고 편리한 인프라 개발 환경을 기대한다.
(사이드바 UI가 헷갈리는 건 나뿐일까?)

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

테라폼 클라우드 써보고 싶었는데, 이 글 참고해서 한번 사용해보겠습니다. 좋은 글 감사해요

답글 달기
comment-user-thumbnail
2023년 7월 18일

너무 좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기