참조 : 책 Terraform Up & Running
코드 깃헙 주소 : github.com/stitchlabio/terraform-up-and-running-code
테라폼 기본 설정은 지난 글을 참조하자
Requirements
- AmazonEC2FullAccess 권한이 있는 IAM User
- 기본 VPC (버지니아 북부 : us-east-1)
생성할 리소스
- 특정 포트를 열어놓는 보안 그룹
- EC2
- 해당 포트로 접속하면 Hello, World를 보여주는 User Data
- 위에서 설명한 보안 그룹 연결
목차
1. 채움 참조(interpolation)를 사용해 리소스 생성
2. 변수를 사용해 리소스 생성
3. 더 다양한 variable
1. 채움 참조를 사용해 리소스 생성
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "example" {
ami = "ami-40d28157"
instance_type = "t2.micro"
vpc_security_group_ids = ["${aws_security_group.instance.id}"]
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = {
Name = "terraform-example"
}
}
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"]
}
}
output "public_ip" {
value = aws_instance.example.public_ip
}
먼저 "instance"란 이름의 aws_security_group
리소스 구문을 보자
name은 보안 그룹의 이름이며, ingress로 인바운드 규칙을 설정해주었다
이 보안 그룹이 연결된 EC2를 생성하기 위해, "example" 이름의 aws_instance
리소스 구문에서 채움 참조(interpolation)을 사용하였다
채움 참조 구문의 문법은 아래와 같다
"${TYPE.NAME.ATTRIBUTE}"
따라서 밑의 리소스 구문에서 정의된 보안그룹의 ID를 가져오기 위해 "${aws_security_group.instance.id}"
가 사용된 것이다
또한 output 구문에서도 aws_instance.example.public_ip
란 참조를 사용해, 테라폼 실행 시 생성되는 EC2의 퍼블릭 IP를 출력할 수 있다
user_data의 <<-EOF
와 EOF
표시는 여러 줄을 하나의 단락으로 처리하는 테라폼의 히어닥(heredoc) 문법이다
terraform apply
로 실행시켜보면
output 구문에서 설정한 퍼블릭 IP가 출력된다
콘솔에서도 확인해보면
설정한 대로 보안 그룹과 EC2가 잘 생성되었다
EC2의 IP와 설정한 8080 포트로 접속해보자
curl 52.90.144.92:8080
Hello, World도 멀쩡하게 잘 뜬다
2. 변수를 사용해 리소스 생성
위의 코드에서 8080이란 숫자가 반복이 된다
이를 변수로 처리해 8080이 아닌 다른 포트를 사용하게 될 때 바로바로 적용할 수 있도록 해보겠다
provider "aws" {
region = "us-east-1"
}
variable "server_port" {
description = "The port the server will use for HTTP requests"
default = 8080
}
resource "aws_instance" "example" {
ami = "ami-40d28157"
instance_type = "t2.micro"
vpc_security_group_ids = ["${aws_security_group.instance.id}"]
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p "${var.server_port}" &
EOF
tags = {
Name = "terraform-example"
}
}
resource "aws_security_group" "instance" {
name = "terraform-example-instance"
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
output "public_ip" {
value = aws_instance.example.public_ip
}
variable 구문이 추가되었다
server_port
란 변수에 default값으로 8080을 설정해두어, 8080을 사용하던 user_data와 security group 구문들에 각각 적용할 수 있게 되었다
terraform apply
를 해보면
user data가 바뀌느라 EC2도 새로 생성되었지만, 전체적으로 달라진 건 없다
8080이 아닌 다른 포트넘버를 사용해야 할 땐, variable 구문의 default값만 고쳐 쓰면 된다
그러나 default값도 아닌 테라폼 실행 때 마다 새로운 값을 입력받아 사용하고 싶다면, 아래와 같이 default 구문을 빼주자
variable "server_port" {
description = "The port the server will use for HTTP requests"
}
이대로 terraform apply
를 해주면
description 구문의 설명이 뜨면서 value를 입력하라고 한다
여기에 원하는 변수 값을 입력하면서 사용할 수 있다
또는, terraform apply -var server_port="8080"
과 같이 명령 줄 옵션으로 바로 변수를 지정하며 테라폼을 실행시킬수도 있다
+++
variable과 output은 파일을 따로 만들어서 사용하는게 좋다
vars.tf
와 outputs.tf
파일을 같은 폴더 내에 만들어서 각각의 구문들만 이동시켜서 사용하자
참고로 꼭 이 파일 이름들을 써야 하는건 아니다
terraform 명령을 실행 == 해당 폴더 내의 모든 tf 파일을 실행
이므로 아무렇게나 .tf 파일을 만들어서 사용하면 된다
3. 더 다양한 variable
variable 구문의 본문엔 3개의 매개변수가 포함될 수 있다
description
default
type
위에서도 봤듯이 description은 변수를 설명하는 문구이고, default는 입력받지 않을 때 기본 설정되는 값이다
이 때 type은 따로 설정하지 않으면 string으로 자동 설정되기 때문에 위에선 딱히 건드리지 않았다 (또한 defualt값이 존재한다면 그 값의 속성을 자동으로 선택한다)
하지만 string 외에도 list, map, object 등 다양한 속성이 있기 때문에 잘 알아두고 필요할 때 써먹자
끝
'공부 > IaC' 카테고리의 다른 글
[Terraform on AWS] 테라폼 backend, 상태 잠금 설정해보기 (0) | 2021.03.21 |
---|---|
[Terraform] 테라폼 backend의 이해 (0) | 2021.03.19 |
[Terraform on AWS] 테라폼 입문 (in Window) (0) | 2021.03.15 |
[AWS CloudFormation] #7 Auto Scaling Group 만들기 ( + Launch Configuration, ALB ) (0) | 2021.01.08 |
[AWS CloudFormation] #6 IAM User, Policy 생성 (0) | 2021.01.06 |
댓글