DevOps:Infrastructure as Code with 테라폼(Terraform) and AWS - 사전준비 편
AWS
DevOps
IaC
Terraform
11/14/2020
본 포스팅은 송주영님의 인프런 DevOps:Infrastructure as Code with 테라폼(Terraform) and AWS를 보고 개인적으로 정리한 내용입니다.
Terraform 기본
구성요소
- provider - 생성할 인프라 종류 ex) AWS
- resource - 실제로 생성할 인프라 자원
- state - 생성한 자원 상태. 테라폼 명령어 실행시 결과값으로 나오므로, 실제 상태와 같게 유지해주는것이 키포인트
- output - 만든 자원을 변수형태로 state에 저장
- module - 재사용 가능한 코드를 모듈형태로 정의
- remote - 다른 경로의 state를 참조. output 변수를 불러올때 주로 사용
기본 명령어
init / plan / apply / import / state / destroy
- init : 다른명령어들을 위한 설정 진행, provider와 state, module 설정이 있음
- plan : 테라폼코드 예측결과 제시, 가장 많이 쓰임
- apply : 실제작성한 코드로 명령어 생성, 인프라에 영향을 끼치므로 주의
- import : 이미 만들어진 자원을 테라폼 state로 옮겨옴
- state : state를 다루는 명령어, 하위 명령어로 mv, push 등
- destroy : 생성된 자원(state)들을 모두 삭제
기본 명령어 프로세스
init - plan - apply
Zsh 및 Oh-my-zsh 설치
세팅
- Zsh 설치
sudo yum install zsh
- 아마존 리눅스sudo apt-get install zsh
- ubuntu
- Zsh 기본 쉘로 설정
- amazon linux 포함 몇몇 os들은
sudo yum install util-linux-user.x86_64
- ubuntu는 하지 않아도 됨 - 패스워드 입력해야 할 경우
sudo passwd <username>
으로 패스워드 변경 chsh -s /bin/zsh
- amazon linux 포함 몇몇 os들은
- Oh-my-zsh 설치
sudo yum install git
으로 git 설치curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
- zsh 설정 변경
~/.zshrc
에서 테마 변경
이 세팅의 장점
- 중간자 검색을 통한 autocompletion
- 수십 수백번을 치는 명령어들을 tab 자동완성으로 간단하게 칠 수 있다
- Git UI 개선
AWS CLI 및 Terraform 설치
AWS CLI
- version 1, 2 중 2로 설치(기능이 더 많음) - Amazon Linux는 기본적으로 설치되어있음
- 설치 후 unzip, install(사이트 참조)
Terraform
wget <link address>
- terraform 설치 링크를 넣는다.- Go 언어로 만들어진 파일이므로, unzip 후 binary 파일을
echo $PATH
의 경로에 옮겨준다.
AWS Configure 설정
설정법
IAM 계정에서 진행할것(정석).
- Access Key : AWS security credentials에서 가져옴
- Secret Access Key : AWS security credentials에서 가져옴. 생성할때만 볼수 있으니 다운로드 하든지, 복사해놓든지
- region name : 서울의 경우
ap-northeast-2
- output format :
text
혹은json
을 주로 사용
현재 접속한 사용자가 누군지 확인하려면
aws sts get-caller-identity
Terraform 기본
작동원리
Terraform의 3가지 형상
- Local 코드 : 현재 개발자가 작성/수정하는 코드
- AWS 실제 인프라 : 실제 AWS에 배포되어 있는 인프라
- Backend에 저장된 상태 : 가장 최근에 배포한 state파일
가장 중요한 것은 2와 3이 일치하도록 만드는것.
배포되어있는 것과 저장된 state파일이 일치하지 않는 경우의 예는 다음과 같다.
- state 파일에 인프라 상태가 저장되어 있는 채로, 인프라를 콘솔에서 변경하는경우
- 인프라를 변경하여 state 파일을 기록하지 않고, state 파일을 직접 변경하는 경우
- local에서 state 파일을 변경하였으나, 다른 사람과 state 파일의 싱크가 어긋난 경우
과정
- provider, resource 등 작성 이후
init
(따로 설정하지 않으면 최초 backend는 로컬) plan
으로 결과 예상- 이 때, plan은 backend의 .tfstate / 실제 리소스 / 로컬 코드(.terraform)를 모두 확인하여 예측결과를 보여준다
- apply 시, 로컬 코드를 기준으로 상태를 적용시킨다.
apply
로 현재 코드를 실제 인프라에 반영 후 state에 기록- 현재 state 상태는
state list
로 확인 - 인프라에 배포된 서비스를 state로 옮겨오고 싶다면
import
사용
BucketAlreadyExists 오류가 뜬다면, bucket명을 변경하자.(s3.tf 내의 bucket 필드) S3 버킷은 globalnamespace를 가지고 있으므로, 다른 누군가가 해당 이름을 사용하고 있다는 말.
import 이후에는 plan을 하여 내용을 확인 한다. 이때 plan을 했을 경우 로컬에 해당 코드가 없으므로 리소스가 삭제/변경된다고 뜬다. 따라서 해당 내용에 맞는 코드를 작성후 apply해주어야한다. import-plan-apply
201115 추가
Basic한 테라폼 파일의 분류는 다음과 같다.
provider.tf
- 리소스를 생성할 프로바이더 명시<resource>.tf
- 프로바이더에 생성되는 리소스의 설정 코드.terraform
폴더 - 로컬에서 반영한 테라폼 형상에 대한 설정파일. 로컬 코드 기록만 남으므로 타인의 apply 기록은 남지 않는다.terraform.tfstate
- 테라폼 apply로 반영된 형상 결과 저장 코드. 협업 시 자신의 코드와 타인의 코드를 동기화하기 위해 필요하다. 설정한 backend 위치에 저장된다.
즉 terraform.tfstate
코드(파일)는 협업을 위해 공유하는 형상 코드라고 생각하면 된다.
- DevOps:Infrastructure as Code with 테라폼(Terraform) and AWS - 이론편
- DevOps:Infrastructure as Code with 테라폼(Terraform) and AWS - 실습편