Post

Terraform Study #2

โ€˜ํ…Œ๋ผํผ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” IaCโ€™ ์ฑ…์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” Terraform ์Šคํ„ฐ๋””[T101] 2์ฃผ์ฐจ ์ •๋ฆฌ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

2์ฃผ์ฐจ

๋ฐ์ดํ„ฐ ์†Œ์Šค

๋ฐ์ดํ„ฐ ์†Œ์Šค(data)๋Š” ์™ธ๋ถ€์˜ ๋ฆฌ์†Œ์Šค ํ˜น์€ ์ €์žฅ๋œ ์ •๋ณด๋ฅผ ๋‚ด๋ถ€๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์€ 2๊ธฐ ์Šคํ„ฐ๋””์› Ssoon๋‹˜์ด ๋ธ”๋กœ๊ทธ์— ์ž˜ ์ •๋ฆฌํ•ด์ฃผ์…จ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด AMI๋‚˜ AZ์™€ ๊ฐ™์ด ๊ธฐ์กด์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

  • ubuntu AMI ์กฐํšŒ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
data "aws_ami" "ubuntu" {
  most_recent = true

  owners = ["099720109477"] 

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "architecture"
    values = ["x86_64"]
  }

  filter {
    name   = "root-device-type"
    values = ["ebs"]
  }

  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
}
  • AZ ๊ฒ€์ƒ‰
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
data "aws_availability_zones" "available" {
    group_names = [
        "ap-northeast-2",
    ]
    id          = "ap-northeast-2"
    names       = [
        "ap-northeast-2a",
        "ap-northeast-2b",
        "ap-northeast-2c",
        "ap-northeast-2d",
    ]
    state       = "available"
    zone_ids    = [
        "apne2-az1",
        "apne2-az2",
        "apne2-az3",
        "apne2-az4",
    ]
}

์ž…๋ ฅ ๋ณ€์ˆ˜

๋ณ€์ˆ˜๋Š” Terrraform ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ํ…Œ๋ผํผ์—์„œ๋Š” ์ด๊ฒƒ์„ ์ž…๋ ฅ ๋ณ€์ˆ˜ Input Variables ๋กœ ์ •์˜ํ•œ๋‹ค.

  • ์„ ์–ธ ์˜ˆ์‹œ
1
2
3
4
5
6
7
variable "<์ด๋ฆ„>" {
  <์ธ์ˆ˜> = <๊ฐ’>
}

variable "image_id" {
  type = string
}

์œ„์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ๋‹ค์–‘ํ•œ ๋ฉ”ํƒ€์ธ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ด€๋ จ ์ •๋ณด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์šฐ์„ ์ˆœ์œ„

1๋ฒˆ ๋ถ€ํ„ฐ ๋ณ€์ˆ˜๋ฅผ ๋Œ€์ž…ํ•˜๋ฉฐ, ํ›„ ์ˆœ์œ„๊ฐ€ ์ „ ์ˆœ์œ„๋ฅผ ๋ฎ์–ด์“ฐ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ๊ฐ€์žฅ ์•„๋ž˜์— ์žˆ๋Š” ์˜ต์…˜์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค.

OrderOption
1Environment Variables
2terraform.tfvars
3terraform.tfvars.json
4*.auto.tfvars (alphabetical order)
5-var or โ€“var-file (command-line flags)

Local

local์€ ์™ธ๋ถ€์—์„œ ์ž…๋ ฅ๋˜์ง€ ์•Š๊ณ , ์ฝ”๋“œ ๋‚ด์—์„œ๋งŒ ๊ฐ€๊ณต๋˜์–ด ๋™์ž‘ํ•˜๋Š” ๊ฐ’์ด๋‹ค. ์™ธ๋ถ€์—์„œ ์ž…๋ ฅ๋˜์ง„ ์•Š์ง€๋งŒ Local ์„ ์–ธ ์ž์ฒด์— ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. (์•„๋ž˜์˜ ์˜ˆ์‹œ ์ฐธ๊ณ )

local์€ ํšŒ์‚ฌ๋‚ด์˜ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๋•Œ, ๋ฆฌ์†Œ์Šค์— ํƒœ๊ทธ๋ฅผ ๊ฑธ์–ด์•ผํ•œ๋‹ค. ex) Owner, Purpose ๋“ฑ

์ด ๋•Œ Local ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํŽธํ•˜๊ฒŒ ๋ฆฌ์†Œ์Šค์— ํƒœ๊ทธ๋ฅผ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
locals {
  additional_tags = {
    Purpose     = var.purpose
    Owner       = var.owner
  }
}
...
resource "aws_instance" "app" {
...
  tags = merge(
    {
      Name = "web-app"
    },
    local.additional_tags
  )

}

์‹ค์Šต

  • VPC DNS ์˜ต์…˜ ํ™œ์„ฑํ™”
1
2
3
4
5
6
7
8
9
resource "aws_vpc" "myvpc" {
  cidr_block           = "10.10.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "t101-study"
  }
}

[[๋„์ „๊ณผ์ œ1] ๋ฆฌ์ „ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์šฉ์˜์—ญ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ VPC ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์‹ค์Šต ์ง„ํ–‰]

์•„๋ž˜์™€ ๊ฐ™์ด, data ์†Œ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ AZ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
resource "aws_subnet" "mysubnet1" {
  vpc_id     = aws_vpc.myvpc.id
  cidr_block = "10.10.1.0/24"

  availability_zone = data.aws_availability_zones.available.names[2]

  tags = {
    Name = "t101-subnet1"
  }
}

resource "aws_subnet" "mysubnet2" {
  vpc_id     = aws_vpc.myvpc.id
  cidr_block = "10.10.2.0/24"

  availability_zone = "ap-northeast-2c"

  tags = {
    Name = "t101-subnet2"
  }
}

[ec2 ์ƒ์„ฑ ์ฝ˜์†”์—์„œ ํ™•์ธ]

Vscode ์—์„œ ์ถ”์ถœํ•œ Graph์ธ๋ฐ, ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์•„ ๋ณด๊ธฐ ๋ถˆํŽธํ•˜๋‹ค.

[๋ฐฐํฌ ํ™•์ธ] ์ด์ œ ๋ฐฐํฌ๋œ EC2์— ์ ‘์†ํ•˜์—ฌ, ํ…Œ๋ผํผ ์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ๋Š” ์ง€ ํ™•์ธํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
$ MYIP=$(terraform output -raw kane_ec2_public_ip)
$ echo $MYIP                   
3.35.173.67
$ while true; do curl --connect-timeout 1  http://$MYIP/ ; echo "------------------------------"; date; sleep 1; done
<h1>RegionAz(apne2-az1) : Instance ID(i-0ca40805a20604dbe) : Private IP(10.10.1.34) : Web Server</h1>
------------------------------
Mon Sep  4 00:50:56 KST 2023
<h1>RegionAz(apne2-az1) : Instance ID(i-0ca40805a20604dbe) : Private IP(10.10.1.34) : Web Server</h1>
------------------------------
Mon Sep  4 00:50:57 KST 2023
<h1>RegionAz(apne2-az1) : Instance ID(i-0ca40805a20604dbe) : Private IP(10.10.1.34) : Web Server</h1>
------------------------------
Mon Sep  4 00:50:58 KST 2023

Output

terraform apply ์ดํ›„ ํŒŒ์ผ์— ์ ํžŒ ์ถœ๋ ฅ๊ฐ’์„ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ด์ค€๋‹ค. ์ฃผ๋กœ Ec2์˜ ํผ๋ธ”๋ฆญ ip๊ฐ™์ด ๊ผญ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์„ ์ฃผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค. ์ƒ์„ฑ ํ›„์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋ฉฐ ๊ฐ’๋“ค์€ ์ถ”ํ›„ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ, shell script ํ˜น์€ ansible ์— ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.**

๊ธฐ๋ณธ ์˜ˆ์‹œ

1
2
3
4
output "instance_ip_addr" {
  value       = aws_instance.server.private_ip
  description = "The private IP address of the main server instance."
}

์กฐ๊ฑด ๊ฒ€์‚ฌ ์ง„ํ–‰

1
2
3
4
5
6
7
8
9
output "api_base_url" {
  value = "https://${aws_instance.example.private_dns}:8433/"

  # The EC2 instance must have an encrypted root volume.
  precondition {
    condition     = data.aws_ebs_volume.example.encrypted
    error_message = "The server's root volume is not encrypted."
  }
}
  • Option
    • sensitive : CLI ์—์„œ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • **depends_on : ์„ ์ˆ˜๊ด€๊ณ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.(๋จผ์ €, ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.)
1
2
3
4
5
6
7
8
9
10
output "instance_ip_addr" {
  value       = aws_instance.server.private_ip
  description = "The private IP address of the main server instance."

  depends_on = [
    # Security group rule must be created before this IP address could
    # actually be used, otherwise the services will be unreachable.
    aws_security_group_rule.local_access,
  ]
}

๋ฐ˜๋ณต๋ฌธ

Terraform์—์„œ ๋ฐ˜๋ณต๋ฌธ์˜ ์•„๋ž˜์˜ 3๊ฐ€์ง€ ๋ฌธ๋ฒ•์ด ์žˆ๋‹ค.

[count] ์›ํ•˜๋Š” ์ •์ˆ˜ ๊ฐ’๋งŒํผ ๋ฆฌ์†Œ์Šค๋‚˜ ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ฃผ๋กœ ๋ฆฌ์†Œ์Šค์˜ ์†์„ฑ๊ฐ’์ด ๋™์ผํ•œ ๊ฒฝ์šฐ Count๊ฐ€ ์ ์ ˆํ•˜๋‹ค.

count, count.index ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
variable "subnet_ids" {
  type = list(string)
}

resource "aws_instance" "server" {
  # Create one instance for each subnet
  count = length(var.subnet_ids)
  ...
  subnet_id     = var.subnet_ids[count.index]

  tags = {
    Name = "Server ${count.index}"
  }
}

[for_each] MAP ํ˜•์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ {key, value}ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์„ ์–ธ๋œ key ๊ฐ’ ๊ฐœ์ˆ˜๋งŒํผ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

1
2
3
4
5
6
7
8
resource "aws_instance" "example" {
  # One VPC for each element of var.vpcs
  for_each = var.instances

  # each.value here is a value from var.vpcs
  name = each.key
  ami = each.value.ami
}

[for]

๋งŒ์•ฝ [ ]์œผ๋กœ ๋˜์–ด์žˆ์œผ๋ฉด tuple ํ˜•์‹์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , {}์ด๋ฉด ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์ด๋‹ค.

๋˜ํ•œ for ๋’ค์— If ๋ฅผ ํ†ตํ•ด ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.(if ์ธ ๊ฐ’๋งŒ ์‚ฌ์šฉ)

1
2
3
4
[for s in var.list : upper(s) if s != ""]
[for i, v in var.list : "${i} is ${v}"]
# object ํ˜•์‹์ผ๋•Œ
[for k, v in var.map : length(k) + length(v)]

[Dynamic Block]

ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์˜ Dynamic Block์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋ธ”๋Ÿญ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด์˜ for_each, count ๋“ฑ ๋ฐ˜๋ณต๋ฌธ์€ ๋ฆฌ์†Œ์Šค block ๋“ฑ ์ž์‹ ์˜ ๋ฐ”๊นฅ ๋ธ”๋Ÿญ์„ ๋ฐ˜๋ณตํ•ด์„œ ์ฐ์–ด๋‚ด๋Š” ๊ฒƒ์— ๋น„ํ•ด dynamic block์€ block์ž์ฒด๋ฅผ ์ •์˜ํ•˜๋ฉฐ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฐ์–ด๋‚ธ๋‹ค. (resource์™€ ๊ฐ™์€ ๋‹จ์ผ๋ธ”๋ฝ์ด ์•„๋‹Œ ๋‚ด๋ถ€ ๋ธ”๋ฝ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.) ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ Argument๋ฅผ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

์ฐพ์•„๋ณด๋‹ˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•ˆ๋‚ด์‚ฌํ•ญ๋„ ์žˆ์—ˆ๋‹ค.

  • ๊ณผ๋„ํ•œ ์‚ฌ์šฉ์„ ํ”ผํ•œ๋‹ค. (๋™์  ๋ธ”๋ก์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์„ฑ์„ ์ฝ๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.)
  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ์„ ์œ„ํ•œ ๊นจ๋—ํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ˆจ๊ฒจ์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํ•ญ์ƒ ์ค‘์ฒฉ๋œ ๋ธ”๋ก์„ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์จ๋ผ.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
resource "aws_security_group" "backend-sg" {
  name        = "backend-sg"
  vpc_id      = aws_vpc.backend-vpc.id
	dynamic "ingress" {
		for_each = var.ingress_ports
		content {
	      from_port = ingress.value
				to_port = ingress.value
				protocol = "tcp"
				cidr_blocks = ["0.0.0.0/0"]
		}
	}
}
# ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๊ธฐ ์‹ซ์–ด์„œ ์œ„์ฒ˜๋Ÿผ ์ง„ํ–‰
resource "aws_security_group" "backend-sg" {
  name        = "backend-sg"
  vpc_id      = aws_vpc.backend-vpc.id
	ingress {
	      from_port = 22
				to_port = 22
				protocol = "tcp"
				cidr_blocks = ["0.0.0.0/0"]
	}
	ingress {
	      from_port = 8080
				to_port = 8080
				protocol = "tcp"
				cidr_blocks = ["0.0.0.0/0"]
	}
}
		
		

๋„์ „๊ณผ์ œ3

๋„์ „๊ณผ์ œ3 : ์ž…๋ ฅ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค(์–ด๋–ค ๋ฆฌ์†Œ์Šค๋“ ์ง€ ์ƒ๊ด€์—†์Œ)๋ฅผ ๋ฐฐํฌํ•ด๋ณด๊ณ , ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด์ฃผ์„ธ์š”!

์œ„์—์„œ ์ง„ํ–‰ํ•œ EC2 ๋ฐฐํฌ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์„ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.

  • EC2 ๊ตฌ์„ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
resource "aws_instance" "kane_ec2" {

  depends_on = [
    aws_internet_gateway.kane_igw
  ]

  ami                         = data.aws_ami.amazonlinux2.id
  associate_public_ip_address = true
	// ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •!
  instance_type               = var.ec2_instance_type
  vpc_security_group_ids      = ["${aws_security_group.kane_sg.id}"]
  subnet_id                   = aws_subnet.kane_subnet1.id
...
  • variable.tf ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋’ค, ์•„๋ž˜์˜ ๋‚ด์šฉ ์ถ”๊ฐ€
1
2
3
4
variable "ec2_instance_type" {
  type        = string
  description = "The type of EC2 instance to launch"
}
  • terraform.tfvars ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋’ค ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ํ•ด๋‹น ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉด, ํ…Œ๋ผํผ์€ ์ž๋™์œผ๋กœ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€์ ธ๊ฐ„๋‹ค. ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๋ฎ์–ด์จ์งˆ ์ˆ˜ ์žˆ๊ธด ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„  ๋ณ€์ˆ˜ ์ž…๋ ฅ์„ ํ•ด๋‹น ํŒŒ์ผ๋กœ๋งŒ ํ•˜๋‹ˆ ์ƒ๊ด€์—†๋‹ค.
1
ec2_instance_type = "t2.small"

์ด์ œ Terraform apply ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค.

๊ธฐ์กด๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ t2.micro ๊ฐ€ ์•„๋‹Œ t2.small ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋„์ „๊ณผ์ œ4

๋„์ „๊ณผ์ œ4 : local๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค(์–ด๋–ค ๋ฆฌ์†Œ์Šค๋“ ์ง€ ์ƒ๊ด€์—†์Œ)๋ฅผ ๋ฐฐํฌํ•ด๋ณด๊ณ , ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด์ฃผ์„ธ์š”!

local์„ ํ†ตํ•ด, EC2์— ํƒœ๊น… ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.

  • local ์„ ์–ธ
1
2
3
4
5
6
7
locals {
  additional_tags = {
    Environment = "Dev"
    Purpose     = "Test"
    Owner       = "Kane"
  }
}
  • EC2์— ์ถ”๊ฐ€
1
2
3
4
5
6
7
8
9
10
11
12
13
resource "aws_instance" "kane_ec2" {

  depends_on = [
    aws_internet_gateway.kane_igw
  ]

	...

  tags = merge({
    Name = "t101-kane_ec2"
    }
  , local.additional_tags)
}

terraform apply๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ด์ œ AWS ์ฝ˜์†”์— ๋“ค์–ด๊ฐ€ EC2 > Tags ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํƒœ๊น…์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.