본문 바로가기

Tech/[IaC] Terraform

Terraform 실습을 위한 사전 준비와 기초 개념 이해

Terraform 기본

테라폼의 주요 구성요소

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

 

테라폼의 기본 명령어

  • init : 테라폼 명령어 사용을 위해 각종 설정을 진행
  • plan : 테라폼으로 작성한 코드가 실제로 어떻게 만들어질지에 대한 예측 결과를 보여줌
  • apply : 테라폼 코드로 실제 인프라를 생성하는 명령어
  • import : 이미 만들어진 자원을 state 파일로 옮겨주는 명령어
  • state : 테라폼 state를 다루는 명령어, 하위 명령어로 mv, push 등이 있음
  • destroy : 생성된 자원들, state 파일들을 모두 삭제하는 명령어

 

테라폼 사용 과정

  • init → plan → apply 순으로 진행
  • 항상 plan 명령어를 활성화해서 여러 번 확인 필수

 

AWS 기초 셋팅(EC2 생성, ssh, zsh, aws cli, terraform, aws configure)

EC2 생성 후 SSH로 연결 설정 시 주의사항

  • VPC 내 서브넷의 라우팅테이블에 디폴트 라우팅이 IGW로 설정되어 있는지
  • NACL
  • Security Group

SSH는 RSA 공개키 암호시스템(비대칭키)을 사용해 연결 인증을 수행

  • 공개키 : 암호화 키
  • 개인키 : 복호화 키

 

https://8gwifi.org/sshfunctions.jsp

 

Online Generate SSH keys algorithm RSA,DSA,ECDSA

<!-- googletag.cmd.push(function() { googletag.display('site_8gwifi_org_sidebar_desktop'); }); --> Generate SSH Keys Online Your Support Matters! Instead of directly asking for donations, I'm thrilled to offer you all nine of my books for just $9 on leanpu

8gwifi.org

위 사이트에서 SSH 암호 키를 직접 만들어서 공개키는 .ssh 하위 폴더에 배치하고, 개인키로 접근 가능

ssh -i PEM파일경로 SSH사용자이름@원격호스트IP

 

[EC2에서 진행]

sudo yum install zsh util-linux-user.x86_64 git -y

echo "set nu" | sudo tee -a /etc/vimrc > /dev/null

chsh -s /bin/zsh

curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh

sed -i 's/^ZSH_THEME=.*$/ZSH_THEME="ys"/' ~/.zshrc

sudo yum install -y yum-utils shadow-utils

sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo

sudo yum -y install terraform

aws configure

  • 액세스 키, 시크릿 키, 적절한 리전 선택, default 포맷 : JSON

 

[MacOS(호스트)에서 진행]

brew install terraform

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2-mac.html

aws configure

  • 액세스 키, 시크릿 키, 적절한 리전 선택, default 포맷 : JSON

 

[여러 버전 사용 시]

alias로 아래와 같이 구분한뒤 .zshrc 나 .bashrc 에 추가하면 된다.

alias tf12="/usr/local/bin/terraform"

alias tf11="/usr/local/bin/terraform11”

 

Terraform 작동 원리

테라폼의 3가지 형상

1. Local 코드 : 현재 개발자가 작성/수정하고 있는 코드

2. AWS 실제 인프라 : 실제로 AWS에 배포되어 있는 인프라

3. Backend에 저장된 상태 : 가장 최근에 배포한 테라폼 코드 형상

테라폼 운용 시 주의점 : AWS 실제 인프라와 Backend에 저장된 상태가 100% 일치하도록 만들어야 함!

테라폼에서는 이를 위해 import, state 등의 명령어를 제공함

 

일반적인 사용 흐름

  • 로컬에서 테라폼 코드 정의 (yaml) → 실제 인프라로 프로비저닝 → backend를 구성해 최신 코드 저장하여 실제 인프라와 매칭

 

Terraform init

  • 지정한 backend에 상태 저장을 위한 .tfstate  파일을 생성한다. (가장 마지막에 적용한 테라폼 내역이 저장됨)
  • init 작업을 완료하면, local에는 .tfstate 에 정의된 내용을 담은 .terraform  파일이 생성된다.
  • 기존에 다른 개발자가 이미 .tfstate 에 인프라를 정의해 놓았다면, 다른 개발자는 init작업을 통해서 local에 sync를 맞출 수 있다.

 

Terraform plan

  • 정의한 코드가 어떤 인프라를 만들게 되는지 미리 예측 결과를 보여준다. 단, plan 결과에 에러가 없다고 하더라도, 실제 적용되었을 때는 에러가 발생할 수 있다.
  • Plan 명령어는 어떠한 형상에도 변화를 주지 않는다.

 

Terraform apply

  • 실제로 인프라를 배포하는 명령어이다.
  • apply를 완료하면, AWS 상에 실제로 해당 인프라가 생성되고 작업 결과가 backend의 .tfstate  파일에 저장된다.
  • 해당 결과는 local의 .terraform 파일에도 저장된다.

 

Terraform import

  • AWS 인프라에 배포된 리소스를 terraform state로 옮겨주는 작업이다.
  • 이는 local의 .terraform에 해당 리소스의 상태 정보를 저장해주는 역할을 한다.

*주의 : 코드를 대신 생성해 주는 개념은 아니니 오해하지 말기

  • Apply 전까지는 backend에 저장되지 않는다.
  • Import 이후에 plan을 하면 로컬에 관련 인프라 코드가 없기 때문에 리소스가 삭제 또는 변경된다는 결과를 보여준다. → 이 결과를 활용해 코드를 직접 작성해야 한다.

 

이미 인프라가 AWS에 배포되어 있는 상태에서 테라폼 도입

만약 기존에 인프라를 AWS에 배포한 상태에서 테라폼을 적용하고 싶으면 모든 리소스를 terraform import로 옮겨야한다.

번거로운 경우에는 처음부터 다시 작업해서 리소스를 올리면 되지만, 실제 서비스가 되는 인프라를 내리는 건 위험할 수 있기 때문에 import를 적절하게 활용할 줄 알아야 한다.

 

Terraform Workflow