cloudNet@ 팀의 가시다 님이 진행하는 테라폼 102 스터디 2주차 정리입니다.
2주차 내용:
테라폼 기본사용법
- data블록이란?
- variable 변수를 어떻게 사용할까?
- local 변수?
- vpc 관련 테라폼 실습을 통해 data블록과 variable 변수를 더 알아보자
data블록
- 데이터 소스는 테라폼으로 정의되지 않은 외부 리소스 또는 저장된 정보를 테라폼 내에서 참조할 때 사용
- 소스를 보면서 이해해보자.
- local_file ( 프로바이더 = 로컬, 리소스 유형 = 파일 )
- abc ( 고유한 이름 , 고정된 값인지 아시는분들도 있음!? )
- { 구성 인수들 }
- { 구성인수 안필요해도 } ---> {}
data "local_file" "abc" {
filename = "${path.module}/abc.txt"
}
# 데이터 소스 블록은 data로 시작, 이후 ‘데이터 소스 유형’을 정의 ← Resource 블록 정의와 유사
##
- 데이터 소스 유형은 첫 번째 _를 기준으로 앞은 프로바이더 이름, 뒤는 프로바이더에서 제공하는 리소스 유형을 의미한다.
- 데이터 소스 유형을 선언한 뒤에는 고유한 이름을 붙인다. 리소스의 이름과 마찬가지로 이름은 동일한 유형에 대한 식별자 역할을 하므로 중복될 수 없다.
- 이름 뒤에는 데이터 소스 유형에 대한 구성 인수들은 { } 안에 선언한다. 인수가 필요하지 않은 유형도 있지만, 그때에도 { } 는 입력한다
테라폼 변수
- 테라폼 HCL에서 선언하는 내용 중 변경될수 있는 요소는 변수를 사용하는것이 좋습니다.
- 변수를 정의 하여 테라폼 파일을 손쉽게 재사용 가능합니다.
# 먼저 variable.tf 파일을 만들어봅시다.
variable "server_port" {
description = "The port the server will use for HTTP requests"
type = number
default = 8080
}
- 해당 파일을 main.tf의 resource 블록에서 다시 사용하려면 어떻게 할까요?
- 이와 같이 ${var.선언한 값} 으로 사용할수 있습니다.
- = ${var.server_port}
# 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.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "My Web Server - var test" > index.html
nohup busybox httpd -f -p ${var.server_port} &
EOF
user_data_replace_on_change = true
tags = {
Name = "Single-MyWebSrv"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-my-instance"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
- terraform init & plan & apply
aws_security_group.instance: Creating...
aws_security_group.instance: Creation complete after 2s [id=sg-0831a50908e47eb1d]
aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Still creating... [20s elapsed]
aws_instance.example: Creation complete after 21s [id=i-023c425a128de7c45]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
public_ip = "13.209.13.189"
여기까지 변수를 사용하는 방법에 대해서 알아봤습니다. 조금 더 디테일 한 부분을 살펴보겠습니다.
변수 유형
변수 유형에는 2가지 ( 단순 변수 유형과 복합 변수 유형 )이 있습니다.
- JAVA와 같은 프로그래밍 언어의 데이터 타입과 같이 String, Number,Bool 과 같은 고유한 형태의 단순 변수유형
# 단순 변수 유형 ( number )
variable "number_example" {
description = "An example of a number variable in Terraform"
type = number
default = 42
}
# 단순 변수 유형 ( string )
variable "string_example" {
description = "An example of a number variable in Terraform"
type = string
default = "koo"
}
# 단순 변수 유형 ( Bool )
variable "bool-example" {
type = bool
}
- List, Set ,Map, Object ,Tuple과 같은 복합 변수 유형이 있습니다.
# map 복합 변수 유형
variable mymap {
type = map(string)
default = {
mykey = "my value"
yourkey = "your value"
}
}
# list 복합 변수 유형
variable mylist {
type = list
default = [1,2,3]
}
# Set 복합 변수 유형
# List와 같은 형태이지만, 순서를 유지하지 않고 고유한 값만 유지
# [5,1,1,2] 리스트 -> [1,2,5] Set
variable mySet {
type = list
default = [1,2,3]
}
# Tuple 복합 변수 유형
# List와 같은 형태이지만, 요소 별로 다른 유형을 포함할수 있음
# 예 = 0,string,bool
variable myTuple {
type = list
default = [1,"koo",false]
}
Local 변수
- 코드 내에서 사용자가 지정한 값 또는 속성 값을 가공해 참조 가능한 local (지역 값)은 외부에서 입력되지 않고, 코드 내에서만 가공되어 동작하는 값을 선언한다.
- ‘local’은 입력 변수와 달리 선언된 모듈 내에서만 접근 가능하고, 변수처럼 실행 시에 입력받을 수 없다.
- 로컬은 사용자가 테라폼 코드를 구현할 때 값이나 표현식을 반복적으로 사용할 수 있는 편의를 제공한다.
- 로컬에서 필요한 파일이나 스크립트 만들어서 ec2나 kuberenetes로 밀어넣을때 유용하겠군.
variable "prefix" {
default = "hello"
}
locals {
name = "terraform"
content = "${var.prefix} ${local.name}"
my_info = {
age = 20
region = "KR"
}
my_nums = [1, 2, 3, 4, 5]
}
locals {
content = "content2" # 중복 선언되었으므로 오류가 발생한다.
}
- 로컬이 선언되는 블록은 locals로 시작한다. 선언되는 인수에 표현되는 값은 상수만이 아닌 리소스의 속성, 변수의 값들도 조합해 정의할 수 있다.
- 동일한 tf 파일 내에서 여러 번 선언하는 것도 가능하고 여러 파일에 걸쳐 만드는 것도 가능하다.
- 다만 lcoals에 선언한 로컬 변수 이름은 전체 루트 모듈 내에서 유일해야 한다.
- 정의되는 속성 값은 지정된 값의 형태에 따라 다양한 유형으로 정의할 수 있다.
variable "prefix" {
default = "hello"
}
locals {
name = "terraform"
content = "${var.prefix} ${local.name}"
my_info = {
age = 20
region = "KR"
}
my_nums = [1, 2, 3, 4, 5]
}
# content 중복 제거
output 변수
- 출력 변수
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP address of the web server"
}
- 배포시 출력 내용
#
...
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
public_ip = "43.201.71.161"
# 직접 확인
terraform output
public_ip = "43.201.71.161"
terraform output public_ip
"43.201.71.161"
# 실습 환경 삭제
terraform destroy -auto-approve
terraform init
- public_ip 나온것을 환경변수로 넣어서 또 다시 다른 명령어에 집어넣을수 있겠네!
- abspath ?
- (참고) abspath : 파일 시스템 경로를 포함하는 문자열을 가져와 절대 경로로 변환하는 함수 - 참고
resource "local_file" "abc" {
content = "abc123"
filename = "${path.module}/abc.txt"
}
output "file_id" {
value = local_file.abc.id
}
output "file_abspath" {
value = abspath(local_file.abc.filename)
}
여기까지 2주차 테라폼 기본 사용법에 대한 개념정리를 했다.
배운 개념을 이용하여 vpc와 vpc를 구성하는 리소스를 만드는 실습들을 해보자.
'DevOps > Terraform' 카테고리의 다른 글
[T102 2주차] (6) 테라폼 반복문 (0) | 2023.07.10 |
---|---|
[T102 2주차] (5) 테라폼 VPC (1) | 2023.07.06 |
[T102 1주차] (3) 테라폼 기본 사용법(1) (1) | 2023.07.04 |
[T102 1주차] (2) 테라폼 설치 (0) | 2023.07.02 |
[T102 1주차] (1) 테라폼과 IAC ? (1) | 2023.07.02 |