https://haksuperman.tistory.com/50
이전 게시물에 이어 진행.
1. DRY 원칙
8080 코드 중복되어 있음
DRY(Don't Repeat Yourself) 원칙, 반복하지 말라는 원칙을 위반하고 있는 상황.
코드 내에서 모든 지식은 유일하고, 모호하지 않으며, 믿을 만한 형태로 존재해야 한다. 두 곳에 포트 번호가 있는 경우 한 곳에서 포트 번호를 변경하면 다른 곳도 같이 변경해야 한다.
-> user_data에서 8080 포트 번호를 사용한다고 명시했으니, 해당 8080번을 허용해주는 보안 그룹(Security gruop)을 생성한 것(둘은 서로 같이 구성되어 움직여야 함)
이를 입력 변수를 정의해 코드가 중복되지 않도록 구성하여 관리할 수 있다.
<입력 변수의 값 전달 방법>
1) decription
- 변수 사용 방법을 문서화하려면 이 매개 변수를 사용한다. 코드를 읽을 때 뿐만 아니라 plan 또는 apply 시에도 확인할 수 있다.
2) default
- 변수에 값을 전달하는 방법으로 명령줄(-var 옵션)로 보내거나 파일(-var-file 옵션) 또는 환경 변수(TF_VAR_<variable_name>)로 전달되지 않으면 기본 값으로 해당 값이 전달된다. 이 기본 값이 없으면 대화식으로 변수에 대한 정보를 묻는다.
3) type
- 전달하는 변수의 유형을 지정할 수 있다. string(문자열), number(숫자), bool(불), list(리스트), map(맵), set(집합), object(객체), tuple(튜플) 등의 제약 조건이 있다. 유형을 지정하지 않으면 any로 간주한다.
// 전달할 값이 nubmer인지 확인하는 입력 변수
variable "number_example" {
description = "An example of a number variable in Terraform"
type = number
default = 42
}
// 전달할 값이 list인지 확인하는 입력 변수
variable "list_example" {
description = "An example of a number variable in Terraform"
type = list
default = ["a", "b", "c"]
}
/* 제약 조건의 결합 */
// 리스트의 모든 항목이 number인 list의 예
variable "list_numeric_example" {
description = "An example of a numeric list in Terraform"
type = list(number)
default = [1, 2, 3]
}
// 모든 값이 string인 map의 예
variable "map_example" {
description = "An example of a map in Terraform"
type = map(string)
default = {
key1 = "value1"
key2 = "value2"
key3 = "value3"
}
}
/* object 또는 tuple 제약 조건을 사용하여 보다 복잡한 구조적 유형 작성 */
variable "object_example" {
description = "An example of a structural type in Terraform"
type = object({
name = string
age = number
tags = list(string)
enabled = bool
})
default = {
name = "value1"
age = 42
tags = ["a", "b", "c"]
enabled = true
}
}
입력 변수가 name(문자열이어야 함), age(숫자여야 함), tags(문자열로 된 리스트여야 함), enabled(불리언 값이어야 함)로 구성되어 있는 object를 지정한다.
C언어의 구조체와 비슷하다고 생각하면 될 것 같다.
만약 이 변수에 유형이 일치하지 않는 값을 설정하려고 하면 테라폼은 즉시 유형 오류를 표시한다.
bool 타입을 요구한다.
2. 입력 변수 사용
variables.tf
variable "server_port" {
description = "The port the server will use for HTTP requests"
type = number
default = 8080
}
8080의 기본 값을 가진 입력 변수 사용
main.tf
resource "aws_instance" "example" {
ami = "ami-0deb35a8202ca99c1" // Ubuntu 20.04 amd64 AMI ID
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"]
}
}
server_port 이름의 변수를 사용 ( var.server_port )
스크립트 내에서 해당 동일한 변수를 사용하기 위해 보간이라는 새로운 유형의 표현식을 사용 ( ${var.server_ip} )
3. 출력 변수 사용
2가지의 선택적 매개 변수 포함 가능하다.
1) description
- 출력 변수에 어떤 유형의 데이터가 포함되어 있는지 설명하는 용도로 사용
2) sensitive
- sensitive 매개변수의 값을 true로 설정하여 terraform apply 실행이 끝날 때 출력을 기록하지 않도록 테라폼에 지시 가능
- 출력 변수에 패스워드나 개인 키와 민감한 자료 또는 시크릿(secret)이 포함되어 있는 경우 유용
output "public_ip" {
description = "The Public IP address of the web server"
value = aws_instance.example.public_ip
}
속성 참조를 사용하여 생성한 인스턴스인 aws_instance.example의 public_ip 값을 사용한다.
terraform output 명령어를 사용하여 변경 사항을 적용하지 않고 모든 결괏값을 나열할 수도 있다.
출력할 OUTPUT_NAME을 지정해 특정 변수의 값 출력 가능
-> 이러한 OUTPUT은 스크립트 작성할 때 유용하다!
'Language > Terraform' 카테고리의 다른 글
[Terraform] ASG를 통한 웹 서버 클러스터 배포 (0) | 2024.06.01 |
---|---|
[Terraform] 단일 서버, 단일 웹 서버 배포 (0) | 2024.05.31 |
[Terraform] terraform.tfvars를 통한 변수 값 저장(feat. AWS Credentials) (0) | 2024.05.28 |
[Terraform] IAM Group 생성 후 정책 적용 및 IAM User 추가 (0) | 2024.05.28 |
[Terraform] terraform 기본 명령어 및 프로바이더 선언(feat. init, plan, apply, destory) (0) | 2024.05.21 |
개인 공부 목적으로 사용하는 블로그입니다 :)
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!