본 포스트는, Terraform Up & Running 테라폼 - OREILLY를 참고했습니다.
IaC는 infrastructure as Code의 약어로, 인프라를 코드화 하는 걸 나타내는 말입니다.
기존 클라우드 등에서 UI를 통해 리소스를 생성하면 어떤 리소스가 있는지 파악하기 힘든 상황이 많습니다.
이를 코드화 하여 팀원들과 공유하고, 협업하는 데 사용하면 높은 만족도를 가지게 됩니다.
TMI) Low Code, No Code를 도전하고 있는 현재 프로그래밍과 비교되게 모든 인프라를 코드화 한다는 것이 참 역설적인 것 처럼 느껴집니다.
이러한 IaC에서 가장 유명하고 많이 사용 중인 것 중 하나가 Terraform 입니다.
HashiCorp사에서 만든 Terraform은 AWS, GCP, Azure를 포함한 다양한 퍼블릭 클라우드환경을 지원하여 IaC를 대표하고 있습니다.
사용 환경
- Terraform
- AWS
- Pycharm
본 포스트에서는 AWS를 이용하여 Terraform을 실습합니다.
제가 공부하면서 사용한 책 Terraform Up & Running 테라폼의 코드를 참고하고 싶으면 해당 깃헙을 참고해주세요.
AWS SDK 및 IAM 셋팅은 생략합니다. 다른 블로그를 참고해주세요.
폴더 구조
terrafrom
.
└── main.tf
└── var.tf
terraform이라는 폴더를 생성하고 안에 terraform 파일을 정의하는 main.tf를 생성했습니다.
var.tf에서는 이후 변수를 정의하기 위해 생성하였습니다.
Terraform 설치하기
본 포스트를 작성할 때 당시 Terraform의 최신버전은 1.2.7입니다.
Terraform 공식홈페이지를 들어가면 쉽게 다운로드 할 수 있습니다.
설치 완료 이후, 잘 설치되었나 간단한 커맨드로 확인해 보세요.
terraform -help
terraform -v
Provider 정의
Terraform은 다양한 퍼블릭 클라우드를 지원하는데, 어떤 클라우드를 사용할 지 정의하는 Provider입니다.
# main.tf
provider "aws" {
region = "ap-northeast-2"
}
위와 같이, aws Provider를 사용한다고 정의하고, 추가로 region을 정의해줬습니다.
이러한 설정에 대해서는 외울 필요 없이, Terraform docs를 보면서 작성하면됩니다.
Provider 작성을 완료하고 초기화 설정을 해줍니다.
terraform init
터미널 창에 위와 같이 terraform init을 입력하면 해당 provider환경으로 초기화 설정을 해줍니다.
그럼 .terraform 폴더와, .terraform.lock.hcl 파일이 생긴 것을 볼 수 있습니다.
해당 폴더와 해당 파일을 이용해서 terraform 상태를 저장합니다. (리소스를 비교하고 제거 및 생성 하는 등 )
EC2 생성해보기
Terraform이 잘 동작하는지 확인해보기 위해 EC2(AWS의 인스턴스)를 생성해봅니다.
resource "aws_instance" "ec2" {
ami = "ami-0ea5eb4b05645aa8a"
instance_type = "t3.nano"
tags = {
Name = "terraform-example"
}
}
필수적인 요소는 ami(os 이미지로, ubuntu 20.04LTS의 ami id값으로 설정), 와 instance_type입니다.
추가로 tags.Name을 정의했는데, 이는 AWS상에서 해당 인스턴스에 설정하는 Name입니다.
위와 같이 코드를 작성하고, 이를 테스트할 수 있는 plan 명령어를 실행해 봅니다.
terraform plan
plan 명령어를 통해서 이전 상태와 변경 점을 출력합니다.
깃과 동일하게 새로 생기는 내용은 +, 삭제되는 내용은 -로 표시합니다.
plan 명령어를 사용해서 코드가 잘 작성되었는지 테스트 할 수 있어서 좋습니다.
해당 내용이 원하는 동작이면 이제 이를 적용해줍니다.
terraform apply
중간에 Do you want to perform these actions? 라고 묻는데, yes 라고 입력해주면 terraform이 apply를 적용합니다.
해당 명령이 성공적으로 끝났다면, AWS UI를 통해서 새로운 인스턴스가 생성되었음을 알 수 있습니다.
security_group
AWS를 사용해보신 분들은 아시겠지만, 인스턴스를 생성하고 이에 접속하기 위해서는 security group을 설정해야 합니다.
당연히 이또한 Terraform을 통해서 정의할 수 있으며, 생성하고 이를 인스턴스에 연결해보려고 합니다.
resource "aws_security_group" "instance" {
name = "terraform-example-instance"
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
위와 같이, security group을 정의했습니다.
사용할 port를 설정하고 cidr 블록을 설정했습니다.
이제 생성한 security group을 인스턴스에 연결합니다.
resource "aws_instance" "ec2" {
ami = "ami-0ea5eb4b05645aa8a"
instance_type = "t3.nano"
tags = {
Name = "terraform-example"
}
user_data = <<-EOF
#!/bin/bash
echo "Hello, world" > index.html
nohup busybox httpd -f -p 8080 &
EOF
vpc_security_group_ids = [aws_security_group.instance.id]
}
위에서 생성했던 ec2에서 user_data 및 vpc_security_group_ids를 추가했습니다.
user_data는 인스턴스를 시작할 때 위와 같은 동작을 하겠다를 정의하는 내용입니다. (이후 잘 연결되나 테스트 하기 위해 간단한 코드 작성)
마지막으로 생성한 security_group을 연결합니다. 테라폼에서는 따로 변수를 생성하지 않아도 생성한 리소스로 부터 id 값을 설정할 수 있습니다.
이제 정의한 코드로 다시 리소스를 생성해봅니다.
terraform apply
이후 생성한 인스턴스에 잘 동작하는지 확인합니다.
curl http://[public ip]:8080
생성한 user_data의 “Hello, world”가 출력되면 성공입니다.
실습이 끝났다면, 과금을 막기 위헤서 생성한 리소스를 삭제해주세요.
삭제 방법은 생성한 리소스들을 주석처리하고 apply를 적용하면 됩니다.
terraform destroy
destroy명령어를 통해서 지울 수도 있습니다. (단 undo가 불가능 하니 신중하게 동작하세요.)
기타 삽질한 내용
이상하게 기존에 인스턴스가 있는 상태에서 apply로 업데이트 했을 때, 8080포트로 접속이 안되더라구요. 그래서 기존의 리소스를 아예 지워버리고 다시 만들었는데, 이 때는 정상적으로 동작했습니다.
이 내용에 대해서는 조금 더 공부 해봐야 겠습니다.