Overview & Concept of Terraform
Position of Terraform in IaC
- Iac (Infrastructure as Code) : Code로 서비스 구성 인프라를 관리하고 DevOps 담당자가 모두 읽을 수 있는 코드로 작성하는 것
Terraform은 자체적인 언어인 HCL(Hashicorp Configuration Language)를 제공하여 IaC를 적용할 수 있다. IaC에서 Terraform은 Provisioning Tool의 영역에 속하는 플랫폼이라고 할 수 있다.
IaC Tools
- Provisioning : Terraform, Cloud Formation
- SCM(Service Configuration Management) : Chef, Puppet, Ansible
Terraform은 Infrastructure를 관리하는 영역에 있다.
Basic Concept of Terraform
Terraform은 Cloud Native 전환을 위한 필수 IaC(Infrastructure as Code) 서비스/플랫폼(IaC 중에서도 차지하는 비중이 크다.)으로 특정 CSP(Cloud Service Provider)에 Lock-In 되는 것을 회피하고, Multi Cloud를 활용한 서비스 구성을 가능하게 한다. Terraform은 Hashicorp에서 개발을 하였으며 현재 전 세계 클라우드 서비스를 제공하는 CSP를 중심으로 생태계가 확장되고 있다.
Resource
- 실제로 생성할 인프라 자원을 의미
Provider
- Terraform으로 정의할 Infrastructure Provider
Output
- 인프라를 프로비저닝 한 후에 생성된 자원을 output으로 추출 가능
Backend
- Terraform의 상태를 저장할 공간을 지정하는 부분 (Remote State 저장)
Module
- 공통적으로 활용할 수 있는 인프라 코드를 한 곳으로 모아서 정의
- 한번 작성된 code들이 재사용 될 수 있도록 하게 하는 것
+) Terraform code를 작성하다 보면 빠지게 되는 딜레마
- 동일한 중복 코드들이 발생하게 된다.
- Terraform을 사용하는 이유는 중복을 방지하기 위함도 있다.
- Terraform을 하면서 중복을 지양한다.
- 따라서, 중복을 방지하기 위해 Module을 사용한다.
Remote State
- VPC, IAM과 같은 공용 서비스를 다른 서비스에서 참조함
Terraform에서 중요한 부분은 State와 Backend 부분이다.
- Terraform은 state가 가장 중요하다.
- State를 관리하고 저장하는 역할을 Backend가 한다.
State와 Backend 부분이 중요한 이유는 local에서 1명이 전체의 인프라를 관리하는 곳은 없고, 보통 협업을 통해 관리를 한다. 따라서, Terraform을 local에서 실행하게 될 경우에 장애 발생, code 문제 발생 등 다양한 문제가 발생할 수 있기 때문에 Terraform 코드 같은 경우도 github에 저장, code 관리, state 관리 등 안정적으로 관리할 수 있게 하는 것이 Backend이다.
Key Workflow of Terraform
- Write : Define infrastructure in configuration file
- Provider, Resource 정의
- Infrastructure 관리 코드
- Terraform Initialization
- Plan : Review the changes Terraform will make to your infrastructure
- Execution Action 확인
- 변경될 Resource 결과 확인
- 최종 변경 계획 리뷰
- Apply : Terraform provisions your infrastructure and updates the state file
- create, update, destroy
- Real Infra Resource 변경
- Final State 저장
여러명이 관리를 하므로 개발을 하다 보면 내가 원하지 않는 상황이 생길 수 있기 때문에, 항상 Plan을 먼저 거치고 Apply를 할 수 있도록 하자.
Key Commands of Terraform
1) init : Terraform 초기화, State file 동기화
$ terraform init
- .tfstate 파일 생성
- .terraform 디렉터리 생성
- Local state file sync
2) import : 배포된 인프라를 State file에 저장
$ terraform import
- 인프라에 배포된 리소스를 terraform state로 저장
3) plan : 실행 결과 예측
$ terraform plan
- tf 파일의 실행 결과 예측
- 실제 인프라 상황과는 다름
4) apply : Real Infra 리소스 적용
$ terraform apply
- tf 파일에 작성된 코드를 real 인프라 리소스로 적용
- 작업 결과는 .tfstate 파일에 저장됨
Terraform Extra Keywords
- Backend : terraform의 상태를 저장할 공간을 지정하는 부분이다. Backend를 사용하면 현재 배포된 최신 상태를 외부에 저장하기 때문에 다른 사람과의 협업이 가능하다.
- Output : 인프라를 프로비저닝 한 후에 생성된 자원을 output 부분으로 추출할 수 있다. Output으로 추출한 부분은 이후에 remote state에서 활용할 수 있다.
Implementation of NAVER Cloud Platform IaC
참고 자료
[이렇게 사용하세요!] Terraform을 활용한 네이버 클라우드 플랫폼 VPC 인프라 구성하기
Documentation | Terraform | HashiCorp Developer
1) Terraform 설치하기
OS 별로 최신 버전을 설치한다.
설치 링크 : https://developer.hashicorp.com/terraform/downloads
Window OS이기 때문에 Window OS용 설치
C 드라이브로 실행 파일을 옮겨준다.
환경 변수에 등록해준다.
[시스템 환경 변수 설치] - [환경 변수] - [Path] - [편집]
환경 변수
[Path] - [편집]
[새로 만들기] - [경로 추가] - [확인]
2) vsCode로 설치 확인하기
terraform을 입력했을 때 이런 화면이 나오면 잘 설치된 것이다.
(bash 말고도 cmd, powershell에서도 동일하게 사용 가능)
Cheat Sheet of Ncloud VPC
- Virtual Private Cloud (VPC) : 사용자의 전용 가상 네트워크
- Subnet : VPC의 IP 주소 범위
- Routing Table : 네트워크 트래픽을 전달할 위치를 결정하는 데 사용되는 라우팅이라는 규칙 집합
- Internet Gateway : VPC의 리소스와 인터넷 간의 통신을 활성화하기 위해 VPC에 연결하는 게이트웨이
- NAT 게이트 웨이 : 네트워크 주소 변환을 통해 Private Subnet에서 인터넷 또는 기타 서비스에 연결하는 게이트 웨이
- ACG (Access Control Group) : 보안 그룹은 인스턴스에 대한 인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽 역할을 하는 규칙 집합
예시)
참고 ! 지금 보는 것들은 원래 사진과 같이 하드 코딩 되어있는 것이 아닌, 변수명 처리된다. (이해를 돕기 위해 하드 코딩 된 것)
provider.tf
- 먼저 Provider 설정을 하게 된다. (ncloud로 설정하기)
- 다음으로는 설정한 provider에 대한 세부 설정(필수 값들에 대한 설정)이다.
여기까지 하면 기본적인 Terraform과 Ncloud의 프로바이더 설정은 완료되었다.
(access_key와 secret_key는 보안 상의 문제로 하드코딩이 아닌 OS의 환경 변수로 넣거나 한다.)
vpc.tf
여기서 Route Association은 Ncloud에서 제공하는 리소스 타입은 아니다.
Route Association은 논리적인 리소스이다. (Route Table과 Subnet을 연결해준다.)
이런 파일을 작성할 때는 항상 documentation을 읽어보고 required인지 optional인지 확인하고, 해당 값이 어떤 결과를 발생시키는 지도 확인해야 한다.
지금까지 작성한 코드는 VPC를 생성하는 코드이다.
Tip(?) 작성한 코드를 주석 처리하면 destroy와 같은 효과를 가져온다. 이런 것은 잘 알아보고 사용하기..
plan & apply
plan은 실제 인프라에 적용된 것이 아니기 때문에 인프라가 필요한 것에 대한 결과 값은 가져오지 않는다.
apply 실행 후
terraform state list
VPC Server 생성
서버 이미지는 여러 개를 선택할 수 있다.
Terraform Type
variable 선언할 때는 항상 variable 키워드를 붙여준다.
Variable Types
- string
- number
- bool
Complex Variable Types
- list()
- set()
- map()
- object({=, …})
- tuple([, …])
배열을 사용하는 타입은 3가지(list, set, tuple)이다.
Terraform Functions
현재는 built-in function만 제공하고, custom function은 제공하지 않는다.
Functions
- Numeric functions
- (*)String functions
- (*)Collection functions
- Encoding functions
- Filesystem functions
- Date and Time functions
- Hash and Crypto functions
- IP Network functions
- Type Conversion Functions
functions 중에서는 String functions와 Collection functions 2가지가 가장 많이 쓰인다.
Tip) 숫자와 string이 혼재되어 있는 연산 결과는 string이다. (우선 순위가 string이 가장 높음)
배열 중에서는 list와 tuple이 있다면, tuple이 기본이다.
쿠버네티스 생성 코드
- variables.tf : NKS Variables 설정
- versions.tf : Terraform Version
main.tf 파일에는 NKS를 생성하는 코드가 있다.
Node Subnet과 Load Balancer Subnet 2개를 생성해야 한다.
- 로그인 관련 코드가 들어간 이유는 NKS는 쿠버네티스를 만들게 되면 Cluster가 생성이 되고, Master와 Worknode가 생성되게 된다. 그리고 해당 node들에 있는 실제 서버들이 Naver Cloud Platform에서 제공하는 우분투 서버로 생성이 되기 때문에 로그인 키가 실제 서버 접속 키라고 생각하면된다. 따라서, NKS 정보와 서버 정보가 포함되어있다.
- 서버 스펙에 따라서 Cluster 타입을 정하면 된다.
apply를 하게 되면 앞에서 선언한 값들이 생성된다.
실제로 생성한 값들은 적용된다.
Kubernetes 설정을 확인할 수 있다.
노드풀도 확인 가능하다.
nginx 설정
cluster 접속 방법
Kuberctl 설치
먼저 Kuberctl을 설치해준다.
접속을 하기 위해서는 인증 정보 획득이 필요하다.
따라서, ncp-iam-authenticator를 설치하고 인증 정보를 획득해야 정상적으로 Kuberctl을 local에서 실행할 수 있다.
이 모듈은 Naver Cloud 사용자 가이드에 나와있기 때문에 참고하면 좋다.
kubeconfig 설정 및 yaml 파일 생성 확인 후에 NKS Nodes 정보 확인
nginx 관련 설정
OSSCA Terraform on NAVER Cloud
"장창환 멘토님"의 Terraform 구조 설명 및 사용법 가이드 세미나 내용을
직접 실습을 통해 공부한 내용을 정리한 글입니다.
'💻 개발 > Terraform on NaverCloud' 카테고리의 다른 글
오픈 소스 기여하기 : panic 원인 파악하기 (0) | 2023.08.01 |
---|---|
오픈 소스 기여하기 : terraform-provider-ncloud 이슈 선정 (0) | 2023.08.01 |
Terraform으로 NAVER Cloud Server 만들기 (0) | 2023.07.25 |
Terraform 프로바이더 개발 세미나 2 (0) | 2023.07.22 |
Terraform 프로바이더 개발 세미나 1 (0) | 2023.07.19 |