API를 통해 클라우드 인프라를 안전하고 효율적으로 구축, 변경, 버전관리 하기 위한 자동화 툴이다.(라고 본인들을 소개한다.)
하시코프(Hashicorp)에서 클라우드 인프라 스트럭처 자동화를 위해 개발한 IaC(Infrastructure as Code)툴 이다.
IaC은 수동으로 인프라를 관리하는것이 아닌 코드를 통해 인프라를 관리한다는 개념으로 인프라스트럭처 = 코드, 코드 = 인프라스트럭처 가 된다.
코드로 인프라 스트럭처를 개발한다고 했는데 테라폼에서는 하시코프 설정 언어(HCL / Hashicorp Configuration Language)을 사용하여 인프라스트럭처를 선언한다.
테라폼은 AWS, GCP, Azure, OracleCloud, NCP, Heroku등 다양한 프로바이더를 지원한다.
다양한 클라우드 서비스를 사용하더라도 통합 인프라 관리에 용이하다.
이를 통해 테라폼만으로 멀티 클라우드의 리소스들을 선언하고 코드로 관리하는 것도 가능하다. (하지만 그것만은 피하고싶다.)
aws에서 iac를 사용하기 위해 cloudformation을 따로 공부할 필요가 없다는 말이 된다.
테라폼의 동작 과정과 용어를 살펴보자
먼저 provider선언 및 resource선언 한다.
# provider선언
provider "<PROVIER_NAME>" {
access_key = "<ACCESS_KEY>"
secret_key = "<SECRET_KEY>"
region = "ap-northeast-2"
}
# 사용할 리소스 선언
resource "aws_key_pair" "ssh_key" {
key_name = "web_admin"
public_key = file("~/.ssh/web_admin.pub")
}
resource "aws_security_group" "security_group" {
name = "web-admin-ec2-sg"
description = "Allow SSH port from my home"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["xxx.xxx.xxx.xxx/32"]
}
}
resource "aws_instance" "instance" {
ami = "ami-03221589fd7c8f183" # aws machine image (ubuntu, amazon linux)
#instance_type = "t2.micro"
key_name = aws_key_pair.ssh_key.key_name
vpc_security_group_ids = [
aws_security_group.security_group.id,
]
}
추가, 업데이트, 삭제 리소스를 모두 확인가능하고 필수 옵션을 빼먹거나 잘못 작성한 경우에 바로 확인이 가능하다.
terraform plan
..............
# aws_key_pair.ssh_key will be created
+ resource "aws_key_pair" "ssh_key" {
+ arn = (known after apply)
+ fingerprint = (known after apply)
+ id = (known after apply)
+ key_name = "web_admin"
+ key_name_prefix = (known after apply)
+ key_pair_id = (known after apply)
+ key_type = (known after apply)
+ public_key = "{}"
+ tags_all = (known after apply)
}
..............
Plan: 3 to add, 0 to change, 0 to destroy.
적용 결과를 보여준다.
terraform apply
.............
Plan: 3 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: yes
aws_key_pair.ssh_key: Creating...
aws_security_group.security_group: Creating...
aws_key_pair.ssh_key: Creation complete after 0s [id=web_admin]
aws_security_group.security_group: Creation complete after 1s [id=****]
aws_instance.instance: Creating...
aws_instance.instance: Still creating... [10s elapsed]
aws_instance.instance: Creation complete after 12s [id=****]
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
위처럼 간단하게 EC2를 만드는 구성정도는 쉬운데 실제 프로덕션 환경에서 사용하는것은 쉽지 않았다.
개인적으로 Plan, Apply기능이 조금 신선했다. 만약 AWS Console, CLI, SDK등 다른 방법으로 인프라를 구성할때는 인프라 구성 순서가 필요했다.
securiry group을 만들때 security group간 종속성을 위해 번거로운 작업들이 있었는데 이러한 작업들도 쉽게 처리가 된다.
코드로 관리하다보니 버전관리가 된다는점과 PR단계에서 리뷰를 받아 문제가 될만한 부분을 사전에 찾을수 있었다.
장점도 명확하지만 사용하면서 불편했던 점들도 분명 있었다.
기존에 이미 있던 서비스들을 terraform으로 마이그레이션 하는 작업들이 유독 힘들었다.
기회가 된다면 같이 과정 정리도 하면 좋을듯 하다.