목차
- IaC (Infrastructure as Code) 개념
- Terraform 개념
들어가기 앞서
테라폼(Terraform)이란?
코드를 통해 인프라 서버를 구축/운영 할 수 있게 해주는 도구이다
Infrastructure as Code
IaC 개념
🙋♀️ IaC 란
코드를 통해 인프라를 구축하는 방법을 IaC (Infrastructure as Code) 라고 한다.
🙋♀️ IaC 는 왜 생겨났는가?
서버 가상화 기술의 발전이 큰 영향을 줬다. (i.e. AWS, GCP, Azure)
VM ware, Hyper-V 와 같은 기술 발전하면서 여러 대의 웹 서버를 더 쉽게 더 많이 만들 수 있게 되었다.
⇒ 🎈쉽게 서버를 구축 할 수 있게 되었다.
이로 인해 기하급수적으로 서버가 늘어나면서 서버에 관한 프로비저닝과 운영에 대한 이슈가 발생하였다.
이를 해결 하기 위해 서버 구축과 운영에 대한 자동화 기술이 필요하게 됐다.
이러한 배경을 통해 코드로 인프라를 구축/운영할 수 있는 IaC(Infra as a code)가 생겨나게 되었다.
🙋♀️ IaC 종류
코드형 인프라를 가능하게 하는 도구들
- Terraform
- Chef
- Puppet
- Ansible
- AWS Cloudformation
잡지식🥝) Provisioning (프로비저닝) 이란
프로비저닝은 인프라 에서 자주 나오는 용어로 사전적인 의미로는 공급, 준비, 대비, 식량 이란 의미로
IT 에서 의미는 특정 서비스를 제공받기 위하여 서비스 실행부터 시작해 서비스를 제공받기 전 단계까지 처리되는 일련의 절차를 말한다.
프로비저닝은 서버등 인프라를 배포하는 과정에서 초기 단계에 해당합니다.
테라폼
Terraform
🤔 Q: 어디서 만들었나?
HashiCorp 라는 미국 캘리포니아 샌프란시스코에 있는 소프트웨어 회사에서 만든 오픈 소스 툴입니다.
🤔 Q: 누가 세운 회사인가요?
2012년 미셸 하시모토, 아몬 데드거가 창업한 회사입니다.
Terraform 개념
- 테라폼은 IaC(Infrastructure as Code)의 툴이다.
- 인프라를 코드를 통해 관리 가능
- 테라폼은 HCL(Hashicorp Configuration Language) 라는 테라폼 특유의 문법을 사용한다
- 선언적 언어: Declarative Language
- HCL은 JSON 형식과 비슷하다. (JSON 문법이 원형이기 때문이다)
-
.tf
파일 :.tf
의 확장자를 사용한다.
- 테라폼 코드는 모두 HCL 문법으로 선언적으로 작성한다.
Terraform 장점
코드를 통해 인프라를 관리할 수 있다
예시) AWS Console로 인프라를 관리할 경우
기존의 인프라를 AWS console으로 관리했다면, 누가, 어떻게, 언제 작업한 건지 확인하기 어렵다.
하지만 코드를 통해 인프라를 관리한다면 이러한 기록들이 모두 남기 때문에 확인하기 쉽다.
그리고 현재 인프라를 어떻게 설계한 건지 코드만 안다면 쉽게 이해할 수 있다.
Terraform으로 다양한 클라우드를 사용할 수 있다
Terraform 지원 가능한 클라우드 서비스 (Provider)
- Amazon Web Services (AWS)
- Microsoft Azure
- Google Cloud Platform (GCP)
- Oracle Cloud Infrastructure (OCI)
- ... etc
같은 테라폼 코드 구성으로 다른 클라우드를 쉽게 작동시킬 수 있다. (물론 AWS의 테라폼 코드로는 Azure를 작동시킬 수 없다) 하지만 기본적으로 AWS나 Azure의 클라우드 구성이 같기 때문에 코드의 이름과 설정만 살짝 바꾸면 작동시킬 수 있다.
📌 예시) 이름만 바꿔주면 된다.
AWS의 가성머신 = EC2
Azure의 가성머신 = Virtual Compute Service
Terraform 특징
.tfstate 상태 파일
🎈 테라폼 명령어를 실행하여 인프라 반영하면 테라폼에 의해 자동으로 생성되는 특별한 파일
- .tfstate 파일을 통해 테라폼이 관리하는 인프라의 📝현재 상태를 담고 있다.
- 인프라가 어떻게, 어떤 상태로 만들어져 있는지 추적 가능하다.
- .tfstate 파일은 주로 JSON 형식으로 저장
📢 예시) 테라폼으로 클라우드에 가상 머신 생성할 경우
- .tfstate 파일에는 가상 머신의 IP 주소나 크기, 다른 리소스와의 관계에 대한 정보들이 저장
- .tfstate 파일은 로컬 컴퓨터 또는 클라우드 컴퓨터에 안전하게 저장
- AWS을 사용할 경우 S3에 주로 저장한다.
Terraform 기본 명령어
Terraform이 대표적인 4개의 명령어
$ terraform init # Initializes the Terraform
$ terraform plan # Plans the current state and changes.
$ terraform apply # Applies changes to create or update infrastructure.
$ terraform destroy # Destroys the currently configured infrastructure.
주로 init → plan → apply 순으로 실행한다.
terraform init
.tf
파일을 읽고 필요한 Provider Plugin을 다운로드 설치한다.
✨ 새로운 프로젝트를 시작하거나 종속성이 변경된 경우에 주로 사용된다.
위 명령어를 실행하면 실행한 디렉토리에 .terraform
디렉토리를 생성하여 지정한 Provider에 해당하는 파일을 다운로드한다.
<project_root>
├── .terraform
│ ├── plugins (생성되는 디렉토리와 파일들)
│ │ └── <platform>
│ │ └── <arch>
│ │ └── terraform-provider-<provider>
│ ├── modules (생성되는 디렉토리와 파일들)
│ │ └── <module_name>
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── ...
│ ├── terraform.tfstate (생성되는 파일)
│ ├── terraform.tfstate.backup (생성되는 파일)
│ └── terraform.lock.hcl (생성되는 파일)
├── main.tf
├── variables.tf
├── terraform.tfvars
├── outputs.tf
└── ...
사용 예시)
main.tf 라는 파일 작성
provider "aws" {
access_key = "자신의 ACCESS_KEY"
secret_key = "자신의 SECRET_KEY"
region = "ap-northeast-1" #자신의 지역
}
# 새로운 VPC생성
resource "aws_vpc" "jibin-example-vpc" {
cidr_block = "10.0.0.0/16"
}
실행 결과
PS > terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v5.12.0...
- Installed hashicorp/aws v5.12.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
terraform plan
인프라스트럭처 변경 사항을 미리 확인하는 데 사용된다.
.tf
파일로 작성한 인프라에 대한 생성 계획을 보여주며, 이를 통해 미리 변경 사항을 확인 할 수 있다.
terraform apply
를 실행하기 전에 어떤 리소스가 생성, 변경 또는 삭제될지에 대한 정보가 포함된다.
변경 사항 및 계획 정보는 터미널 또는 콘솔 출력에 나타낸다.
사용 예시) 변경 사항을 보여준다.
PS> terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_vpc.myvpc will be created
+ resource "aws_vpc" "myvpc" {
+ arn = (known after apply)
+ cidr_block = "10.0.0.0/16"
+ default_network_acl_id = (known after apply)
+ default_route_table_id = (known after apply)
+ default_security_group_id = (known after apply)
+ dhcp_options_id = (known after apply)
+ enable_dns_hostnames = (known after apply)
+ enable_dns_support = true
+ enable_network_address_usage_metrics = (known after apply)
+ id = (known after apply)
+ instance_tenancy = "default"
+ ipv6_association_id = (known after apply)
+ ipv6_cidr_block = (known after apply)
+ ipv6_cidr_block_network_border_group = (known after apply)
+ main_route_table_id = (known after apply)
+ owner_id = (known after apply)
+ tags_all = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
terraform apply
.tf
파일의 Terraform 코드(변경사항)를 클라우드 서비스에 배포하는 명령어
사용 예시) 변경 사항을 실제 인프라에 적용한다
PS > terraform apply
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_vpc.jibin-example-vpc will be created
+ resource "aws_vpc" "myvpc" {
+ arn = (known after apply)
+ cidr_block = "10.0.0.0/16"
+ default_network_acl_id = (known after apply)
+ default_route_table_id = (known after apply)
+ default_security_group_id = (known after apply)
+ dhcp_options_id = (known after apply)
+ enable_dns_hostnames = (known after apply)
+ enable_dns_support = true
+ enable_network_address_usage_metrics = (known after apply)
+ id = (known after apply)
+ instance_tenancy = "default"
+ ipv6_association_id = (known after apply)
+ ipv6_cidr_block = (known after apply)
+ ipv6_cidr_block_network_border_group = (known after apply)
+ main_route_table_id = (known after apply)
+ owner_id = (known after apply)
+ tags_all = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
terraform destroy
만들어진 인프라를 삭제한다
terraform apply
와 반대로 삭제되는 리소스들을 조회한 후, yes를 입력하게 되면 삭제를 진행한다.
'Terraform' 카테고리의 다른 글
terraform fmt란? (0) | 2024.04.22 |
---|---|
[Terraform] terraform.lock.hcl 파일이란 (.terraform 파일) (1) | 2024.03.19 |
[Terraform] variables.tf 파일과 *.tfvars 파일 차이는? (0) | 2024.03.15 |
[Terraform] 테라폼의 "Backend"란? (tfstate 상태 파일을 저장하는 곳) (0) | 2024.03.11 |
[Terraform #02] 테라폼의 기본 구성과 용어 쉽게 정리 (Provider, Resource, Variable, Local, State, Output, Provisioner, Module, Data) (1) | 2023.12.31 |