CloudNet@ 팀의 가시다님께서 Leading 하시는 Terraform T101 Study 내용 요약
해당 Terraform Study 는 Terraform Up and Running 책을 기반으로 진행 중입니다.
1. 웹 서버를 위한 main.tf 파일 생성
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0e9bfdb247cc8de84"
instance_type = "t2.micro"
// user_data는 EC2 Instance가 처음 배포될 때 실행되는 스크립트 내용
user_data = <<-EOF
#!/bin/bash
echo "Hello, Terraform Study" > index.html
nohup busybox httpd -f -p 80 &
EOF
tags = {
Name = "Web-Server-01"
}
}
위 main.tf 파일만으로는 웹 서버가 동작하지 않습니다.
※ 웹 서버를 위한 Port를 오픈해주지 않았기 때문입니다.
AWS 에서는 Security Group (보안 그룹) 이라고 하는 네트워크 인터페이스에서 작동하는 보안 서비스가 있는데,
해당 리소스를 통해 웹 서비스를 위한 80 포트를 오픈해주어야 합니다.
아래의 내용으로 main.tf 파일을 변경해줍니다.
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0e9bfdb247cc8de84"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.web_sg.id]
user_data = <<-EOF
#!/bin/bash
echo "Hello, Terraform Study" > index.html
nohup busybox httpd -f -p 80 &
EOF
tags = {
Name = "Web-Server-01"
}
}
resource "aws_security_group" "web_sg" {
name = var.security_group_name
// Inbound Port
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-example-instance"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
이후 Terraform apply 를 통해 코드를 실행하고 실제 서버의 IP로 들어가봅니다.
간단한 웹 서버를 배포하였습니다.
2. 코드 파헤치기
이번 웹서버를 배포 하면서 variable, output 등의 생소한 표현들이 등장하였습니다.
2.1. 참조 (Reference)
코드의 다른 부분의 값에 액세스할 수 있게 해주는 표현식
EC2 리소스 중에 다음과 같은 표현이 등장하였습니다.
resource "aws_instance" "example" {
// 생략
vpc_security_group_ids = [aws_security_group.web_sg.id]
}
원래라면 ami 나 instance_type 처럼 고정된 값이 있어야 하는데, 다른 값이 들어가있습니다.
EC2의 보안 그룹을 적용시켜주는 데, web_sg의 값을 참조하겠다는 의미입니다.
테라폼에서는 다음과 같이 Reference 표현식을 나타낼 수 있다.
<PROVIDER>_<TYPE>.<NAME>.<ATTRIBUTE>
- PROVIDER : ‘aws’ 같은 공급자의 이름
- TYPE : ‘security_group’ 같은 리소스의 유형
- NAME : 보안 그룹 이름인 ‘instance’ 같은 리소스의 이름
- ATTRIBUTE : ‘name’ 과 같은 리소스의 인수 중 하나이거나 리소스가 내보낸 속성 중 하나
그렇다면 왜 참조가 필요할까요??
EC2에 보안 그룹을 적용하기 위해서는 해당 보안 그룹의 ID 값을 넣어줘야 합니다.
하지만, 보안 그룹 ID 값은 생성되기 전까지는 알 수 없으므로,
Reference 표현을 통해 Terraform에서 필요한 Dependency를 자동으로 지정하도록 하는 것입니다.
2.2. Variable (입력 변수)
- Terraform 에서는 Variable 이라는 입력 변수를 이용해 리소스 생성 시, 고정값이 아닌 변동값을 부여해 줄 수 있다.
- 보통 입력 변수 관리만을 위한 variables.tf 파일로 분리하여 사용한다.
- Variable에 부여될 수 있는 type은 string, number, bool, map, list, set, object, tuple 등이 있다.
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-example-instance"
}
2.3. Output (출력 변수)
- Terraform 에서 Output 이라는 출력 변수를 이용해 리소스 생성 후, 특정 값을 원하는 변수값에 부여해 줄 수 있다.
- 보통 출력 변수 관리만을 위한 output.tf 파일로 분리하여 사용한다.
- output 값을 다른 Terraform 코드에서 불러와서 사용하는 것도 가능하다.
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
Terraform 테스트가 끝났다면 리소스를 삭제해주는 것을 습관화하는 것이 좋습니다.
terraform destroy -auto-approve
이번에는 테라폼을 이용해 간단한 웹 서버를 배포해보았습니다.
다음에는 테라폼을 이용해 웹 서버 AutoScaling Group 을 구성하고, LoadBalancer 를 통해 서비스를 구현해보겠습니다.