본문 바로가기
Infrastructure as Code/Terraform

[T101 Study 1주차] Terraform 용어 정리 및 기초 및 설치

by 코인선물로부자된다 2022. 11. 7.
반응형

Nickname : 가시다-서O호님 (Cloud Net@)의 Terraform 스터디가 시작되었고,

(사실 10월달에 시작했는데 여행다녀온다고.. 참석을.. 제대로 못했습니다.)

22년 11월 말까지 회사의 신규 플랫폼을 Terraform으로 구축완료하자는 꿈을 품고 스터디와 블로깅을 시작한다.

질좋은 강의와 스터디를 무료로 진행해주시는데다가 강의 자체가 좋다보니 고수분들의 참여도도 높아 자연스럽게 무언가를 하게된다.

덕분에 자리를 빌어 감사하다는 말씀드립니다.

사실... 이곳 저곳에서 짜집기해서 쓰는 글이기 때문에 잘 정리되어있는 사이트를 추천합니다.

글을 쓰는 현재 저의 환경입니다. 22년 11월 7일 기준입니다.

Git Repo

https://github.com/idealistchanu/study-T101Study.git

CSP란?(Cloud service Provider)

AWS, Azure, Google Cloud Platform, Oracle, Alibaba Cloud, IBM, LG U+, KT, NHN

IaC 장점 ? 왜 도입해야하는가 ?

  • 자급식 배포 Self-service : 배포 프로세스를 자동화 할 수 있으며, 개발자는 필요할 때마다 자체적으로 배포를 진행 할 수 있음
  • 속도와 안정성 Speed and safety : 자동, 일관되고 오류 적음
  • 문서화 Documentation : 시스템 관리자 조직만 인프라에 관한 정보를 독점하는 것이 아니라 누구나 읽을 수 있는 소스 파일로 인프라 상태를 나타낼수 있음
  • 버전 관리 Version control : 인프라의 변경 내용이 모두 기록된 코드형 인프라 소스 파일을 저장할 수 있으므로 버전을 쉽게 관리할 수 있음, 문제 발생 시 코드 원복
  • 유효성 검증 Validation : 인프라 상태가 코드로 정의되어 있으면 코드가 변경될 때마다 검증을 수행하고 일련의 자동화된 테스트를 실행할 수 있음
  • 재사용성 Reuse : 인프라를 재사용 가능한 모듈로 패키징할 수 있어 검증된 모듈로 일관되게 배포할 수 있음
  • 비용 절감
  • 인프라 일관성 향상
  • 구성 변동 제거
  • 공통의 도구 제공

IaC Tool은 어떤것들이 있는가 ?

  • Chef
  • Puppet
  • Red Hat Ansible Automation Platform
  • Saltstack
  • Terraform
  • AWS CloudFormation

그렇다면, IaC중에 굳이 Terraform을 쓰는 이유는 무엇인가?

회사에서는 AWS를 사용하여 대규모 프로덕션 환경을 운영중에 있다.

Cloudformation을 사용하고 CDK도 사용한다.

Terraform은 사용하지 않는 상황이다.

간략히 보자면..

Cloudformation과 CDK로 구성된 현재의 Architecture다.

물론 MSA구조로 서비스를 잘게 쪼갠 것도 있고, 매번 배포할때마다 여러번 같은 동작을 하게되어 문제가 된부분도 있어

코드로 관리하고싶은 욕망에 나중에 개발된 인프라의 경우엔 CDK(Typescript)로 변경 되는 부분에 대해서 부터는 변경했다.

물론! Cloudformation, CDK모두 각각의 장단점이 있다.

근데 왜 그만두고 Terraform으로 가느냐 ?

현재 인프라는 하이브리드인데다가 3rd-Party도 많고 AWS 계정도 하나가 아닌 여러개로 운영중에 있다.

타부서에서도 요청이 들어오고,팀원들이 늘어나고 협업도 필요한데 Typescript base를 모두 학습하기엔 어려움이 있었고

(CDK 다른 언어도 지원합니다.)

외부 Cloud와 온프레미스들이 붙기 시작했고 여러 환경의 인프라가 붙었을때 관리를 어떤식으로 해야

공유, 협업의 문제까지 해결할 수 있을까에 대한 고민을 하게되었다.

(사실 인프라 뿐만이 아닌 개발도 같이하고 있는데다가 런칭 시점이랑 겹쳐 DevOps쪽은 제일 후순위지이지만 자동화가 반드시 필요하다. 다만 엄청난 고민을 할 시간이 없는게 안타깝다.)

이러한 와중에 Terraform을 도입하고자 생각을 갖게 되었다.

Terraform Provider, Git Fork등등 여러가지를 보고 결정하게 되었지만 !

트렌드가 기술의 성장성이나 커뮤니티 생태계의 성숙도, 비교 우위를 결정짓는 것은 아니지만 궁금해서 참고하고자

22년 11월 12일 기준으로 검색해보았다.

Github 기준 연관 Repo 수

  • Terraform 15만
  • Ansible 18만
  • Cloudformation 1.5만
  • CDK 1.4만

물론 어느 도구던간에 만능은 아니다. 적재적소에 맞는 도구를 잘 활용할 수 있는 것이 제일 좋다.

현재 상황에서 Terraform은 좋은 선택일 수 있다.

Terraform 이란 ?

IaC(Infrastructure as Code)의 도구중 하나로 인프라를 코드로 작성 및 실행하여 인프라의 자원을 쉽게 확인하며

생성, 배포, 수정, 정리한다.

Terraform의 특징 ?

여러 클라우드 플랫폼에서 인프라를 관리할 수 있고,

배포 전반에 걸쳐 리소스 변경 사항을 추적하며,

안전하게 협업하기 위해 구성을 버전화하여 관리하며,

단순 CSP뿐만이 아닌 약 2600개의 공급자에 대한 리소스 관리를 제공

리소스 간의 종속성을 자동으로 계산하여 올바른 순서로 생성 및 제거

하시코프사가 Go 언어로 개발한 오픈 소스 도구로 OS마다 바이너리 파일이 존재 컴파일 될 때, Provider를 대신해 API 호출

클라우드 간 종속성 처리 ( 동일한 워크 플로를 사용하여 여러 공급자를 관리 ), 대규모 멀티 클라우드 인프라에 대한 관리 및 오케스트레이션을 단순화

Terraform Provider를 확인하고자 한다면?

https://registry.terraform.io/browse/providers

[Terraform Registry

registry.terraform.io](https://registry.terraform.io/browse/providers)

Terraform Main Command

init Prepare your working directory for other commands
validate Check whether the configuration is valid
plan Show changes required by the current configuration
apply Create or update infrastructure
destroy Destroy previously-created infrastructure

Terraform Other Command

console Try Terraform expressions at an interactive command prompt
fmt Reformat your configuration in the standard style
force-unlock Release a stuck lock on the current workspace
get Install or upgrade remote Terraform modules
graph Generate a Graphviz graph of the steps in an operation
import Associate existing infrastructure with a Terraform resource
login Obtain and save credentials for a remote host
logout Remove locally-stored credentials for a remote host
output Show output values from your root module
providers Show the providers required for this configuration
refresh Update the state to match remote systems
show Show the current state or a saved plan
state Advanced state management
taint Mark a resource instance as not fully functional
test Experimental support for module integration testing
untaint Remove the 'tainted' state from a resource instance
version Show the current Terraform version
workspace Workspace management

Terraform Deploy

Scope - Identify the infrastructure for your project.

Author - Write the configuration for your infrastructure.

Initialize - Install the plugins Terraform needs to manage the infrastructure.

  • 지정한 backend에 상태 저장을 위한 .tfstate 파일을 생성합니다. 여기에는 가장 마지막에 적용한 테라폼 내역이 저장됩니다.

  • init 작업을 완료하면, local에는 .tfstate에 정의된 내용을 담은 .terraform 파일이 생성됩니다.

  • 기존에 다른 개발자가 이미 .tfstate에 인프라를 정의해 놓은 것이 있다면, 다른 개발자는 init작업을 통해서 local에 sync를 맞출 수 있습니다.

    Plan - Preview the changes Terraform will make to match your configuration.

  • 정의한 코드가 어떤 인프라를 만들게 되는지 미리 예측 결과를 보여줍니다. 단, plan을 한 내용에 에러가 없다고 하더라도, 실제 적용되었을 때는 에러가 발생할 수 있습니다.

  • Plan 명령어는 어떠한 형상에도 변화를 주지 않습니다.

    Apply - Make the planned changes.

  • 실제로 인프라를 배포하기 위한 명령어입니다. apply를 완료하면, AWS 상에 실제로 해당 인프라가 생성되고 작업 결과가 backend의 .tfstate 파일에 저장됩니다.

  • 해당 결과는 local의 .terraform 파일에도 저장됩니다.

Other Command의 경우에는 우당탕탕 회사 신규 플랫폼 구축 시, 사용할때 간간히 포스팅하겠습니다.

Terraform 기본 개념

  • resource : 실제로 생성할 인프라 자원을 의미
  • provider : Terraform으로 정의할 Infrastructure Provider를 의미
  • output : 인프라를 프로비저닝 한 후에 생성된 자원을 output 부분으로 뽑을 수 있음. Output으로 추출한 부분은 이후에 remote state에서 활용 가능
  • backend : terraform의 상태를 저장할 공간을 지정하는 부분. backend를 사용하면 현재 배포된 최신 상태를 외부에 저장하기 때문에 다른 사람과의 협업이 가능
  • module : 공통적으로 활용할 수 있는 인프라 코드를 한 곳으로 모아서 정의하는 부분. Module을 사용하면 변수만 바꿔서 동일한 리소스를 손쉽게 생성할 수 있음
  • remote state : remote state를 사용하면 VPC, IAM 등과 같이 여러 서비스가 공통으로 사용하는 것을 사용할 수 있음. tfstate파일이 저장되어 있는 backend 정보를 명시하면, terraform이 해당 backend에서 output 정보들을 가져옴

Terraform Install

# Terraform 설치
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
brew update
brew upgrade hashicorp/tap/terraform

# Terraform 도움말
terraform -help
terraform -help plan

# Terraform 자동 완성 (ZSH이 설치되어있다면 ZSH)
touch ~/.bashrc
terraform -install-autocomplete

# Terraform 자동 완성 (ZSH) 해당 부분은 어떤 방식으로 설치했느냐에 따라 위치가 다르다.
cat ~/.zshrc
autoload -U +X bashcompinit && bashcompinit
complete -o nospace -C /usr/local/bin/terraform terraform
or 
autoload -U +X bashcompinit && bashcompinit
complete -o nospace -C /opt/homebrew/bin/terraform terraform

각종 툴 (Mac OS 용)

brew install tree jq watch