๐กcloudNet@ ํ์ ๊ฐ์๋ค ๋์ด ์งํํ๋ Terraform 101 Study 4๊ธฐ 5์ฃผ์ฐจ ๋ด์ฉ์ผ๋ก,
[ํ ๋ผํผ์ผ๋ก ์์ํ๋ IaC] ๋์๋ฅผ ์ฐธ์กฐํ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค..
Module
ํ ๋ผํผ์ผ๋ก ์ธํ๋ผ์ ์๋น์ค๋ฅผ ๊ด๋ฆฌํ๋ฉด ์๊ฐ์ด ์ง๋ ์๋ก ๊ตฌ์ฑ์ด ๋ณต์กํด์ง๊ณ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค๊ฐ ๋์ด๋๊ฒ ๋๋ค. ํ ๋ผํผ์ ๊ตฌ์ฑ ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ ๊ตฌ์ฑ์๋ ์ ์ฝ์ด ์๊ธฐ ๋๋ฌธ์ ๋จ์ผ ํ์ผ ๊ตฌ์กฐ์์์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ ์ ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ํ ๋ผํผ ๊ตฌ์ฑ์์ ์ํ๋ ํญ๋ชฉ์ ์ฐพ๋ ๊ฒ์ด ์ ์ ์ด๋ ค์์ง
- ๋ฆฌ์์ค๋ค ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๊ฐ ๋ณต์กํด์ง์๋ก ๋ณ๊ฒฝ ์์ ์ ์ํฅ๋๋ฅผ ๋ถ์ํ๊ธฐ ์ํ ๋ ธ๋ ฅ์ด ๋์ด๋จ
- ๊ฐ๋ฐ/์คํ ์ด์ง/ํ๋ก๋์ ํ๊ฒฝ์ผ๋ก ๊ตฌ๋ถ๋ ๊ฒฝ์ฐ ๋น์ทํ ํํ์ ๊ตฌ์ฑ์ด ๋ฐ๋ณต๋์ด ์ ๋ฌด ํจ์จ์ด ์ค์ด๋ฌ
- ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ ๊ธฐ์กด ๊ตฌ์ฑ์์ ์ทจํด์ผ ํ ๋ฆฌ์์ค ๊ตฌ์ฑ๊ณผ ์ข ์์ฑ ํ์ ์ด ์ด๋ ค์
๋ชจ๋์ ๋ฃจํธ ๋ชจ๋๊ณผ ์์ ๋ชจ๋๋ก ๊ตฌ๋ถ๋๋ค
- ๋ฃจํธ ๋ชจ๋ Root Module : ํ ๋ผํผ์ ์คํํ๊ณ ํ๋ก๋น์ ๋ํ๋ ์ต์์ ๋ชจ๋
- ์์ ๋ชจ๋ Chile Module : ๋ฃจํธ ๋ชจ๋์ ๊ตฌ์ฑ์์ ํธ์ถ๋๋ ์ธ๋ถ ๊ตฌ์ฑ ์งํฉ
1. ๋ชจ๋ ์์ฑ ๊ธฐ๋ณธ ์์น
๋ชจ๋์ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจํค์ง์ ์ญํ ์ด ๋น์ทํ๋ค. ๋ชจ๋ ์์ฑ ๋ฐฉ์์ ์ฌ์ฉ์๋ง๋ค ๋ค๋ฅผ ์ ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ์์ฑ ์์น์ ์ ์ํ๋ค.
- ๋ชจ๋ ๋๋ ํฐ๋ฆฌ ํ์์
terraform-<ํ๋ก๋ฐ์ด๋ ์ด๋ฆ>-<๋ชจ๋ ์ด๋ฆ>
ํ์์ ์ ์ํ๋ค. - ํ
๋ผํผ ๊ตฌ์ฑ์ ๊ถ๊ทน์ ์ผ๋ก ๋ชจ๋ํ๊ฐ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ก ์์ฑํ ๊ฒ์ ์ ์ํ๋ค.
(์ฒ์๋ถํฐ ๋ชจ๋ํ๋ฅผ ๊ฐ์ ํ๊ณ ๊ตฌ์ฑํ์ผ์ ์์ฑํ๋ฉด ๋จ์ผ ๋ฃจํธ ๋ชจ๋์ด๋ผ๋ ํ์ ๋ค๋ฅธ ๋ชจ๋์ด ํธ์ถํ ๊ฒ์ ์์ํ๊ณ ๊ตฌ์กฐํํ ์ ์๋ค.) - ๊ฐ๊ฐ์ ๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ๋ฅผ ์ ์ํ๋ค.
- ๊ณต๊ฐ๋ ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ์ ๋ชจ๋์ ์ฐธ๊ณ ํ๋ค. ๋ฌผ๋ก ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค๋ ํ๋ก๋น์ ๋ํ๋ ค๋ ์ํฉ์ ๋ง๊ฒ ์ฐธ๊ณ ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์ฑํ ๋ ๋ชจ๋์ ์ํ ๋ณ๋ ๊ณต๊ฐ์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค. ํน์ ๋ฃจํธ ๋ชจ๋ ํ์์ ์์ ๋ชจ๋์ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ ๋จ์ํ ๋ณต์กํ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋ ์๋๋ก ๋ช ์๋๋ฉฐ ์ข ์์ฑ์ด ๋ฐ์ํ๋ฏ๋ก ๋ฃจํธ ๋ชจ๋ ์ฌ์ด์ ๋ชจ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ๋ค.
2. ๋ชจ๋ํํด๋ณด๊ธฐ
๋ชจ๋ํ ์๊ฐ
๋ชจ๋์ ๊ธฐ๋ณธ์ ๊ตฌ์กฐ๋ ํ ๋ผํผ ๊ตฌ์ฑ์ผ๋ก ์ ๋ ฅ ๋ณ์๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ๋ค.
‘๋ชจ๋ํ’๋ผ๋ ์ฉ์ด๋ ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฌํ์ฉํ๊ธฐ ์ํ ํ ํ๋ฆฟ ์์ ์ ๋งํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๋ ์์ฃผ ์ฌ์ฉ๋๋ ์ฉ์ด๋ก ํ ๋ผํผ์ ์์ฑ๋ ๋ชจ๋์ ๋ค๋ฅธ ๋ฃจํธ ๋ชจ๋์์ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ฉฐ ์ด๋ฅผ ํตํด ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์คํ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
๊ธฐ์กด์ ์์ฑ๋ ๋ชจ๋์ ๋ค๋ฅธ ๋ชจ๋์์ ์ฐธ์กฐํด ์ฌ์ฉํ ์ ์๋ค. ์ฌ์ฉ ๋ฐฉ์์ ๋ฆฌ์์ค์ ๋น์ทํ๋ค.
๋ชจ๋์์ ํ์ํ ๊ฐ์ variable๋ก ์ ์ธํด ์ค์ ํ๊ณ ๋ชจ๋์์ ์์ฑ๋ ๊ฐ ์ค ์ธ๋ถ ๋ชจ๋์์ ์ฐธ์กฐํ๊ณ ์ถ์ ๊ฐ์ output์ผ๋ก ์ค์ ํ๋ค.
์ด์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ํฌ์คํ ์์๋ ์ค๋ช ํ๋ฏ, ์๋ฐ ๊ฐ๋ฐ ์ getter, setter๋ก ์บก์ํ๋ ํด๋์ค๋ฅผ ํ์ฉํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.
๋ชจ๋ ์์ฑ ์ค์ต
ํ๋์ ํ๋ก๋น์ ๋์์ ์ฌ์ฉ์์ ํจ์ค์๋๋ฅผ ์ฌ๋ฌ ๋ฒ ๊ตฌ์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์์ ์๋๋ฆฌ์ค๋ก ์ผ์ ๋ชจ๋ํ๋ฅผ ์งํํด๋ณด๊ฒ ๋ค.
- random_pet๋ ์ด๋ฆ์ ์๋์ผ๋ก ์์ฑํ๊ณ , random_password๋ ์ฌ์ฉ์์ ํจ์ค์๋๋ฅผ ์ค์ ํ๋ค.
- random_password๋ random ํ๋ก๋ฐ์ด๋ ๋ฆฌ์์ค๋ก ๋์ ํํ๋ก ํจ์ค์๋๋ฅผ ๋ง๋ค ์ ์๋ค.
์์ ๋ชจ๋ ์์ฑ
๋ค์๊ณผ ๊ฐ์ด main.tf, variable.tf, output.tf ํ์ผ์ ์์ฑํ๋ค.
# **main.tf**
resource "random_pet" "name" {
keepers = {
ami_id = timestamp()
}
}
resource "random_password" "password" {
length = var.isDB ? 16 : 10
special = var.isDB ? true : false
override_special = "!#$%*?"
}
# **variable.tf**
variable "isDB" {
type = bool
default = false
description = "ํจ์ค์๋ ๋์์ DB ์ฌ๋ถ"
}
# **output.tf**
output "id" {
value = random_pet.name.id
}
output "pw" {
value = nonsensitive(random_password.password.result)
}
ํ ์คํธ๋ฅผ ์ํด terraform init๋ฅผ ์ํํ๊ณ apply๋ฅผ ์ํํ ๋ ๋ณ์๋ฅผ ์ง์ ํ๋ค.
terraform init && terraform plan
# ํ
์คํธ๋ฅผ ์ํด apply ์ ๋ณ์ ์ง์
**terraform apply -auto-approve -var=isDB=true**
์์ ๋ชจ๋ ํธ์ถ ์ค์ต
๋ค์์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฆฌ์์ค ์๋งํผ ๋ฐ๋ณตํด ๊ตฌ์ฑ ํ์ผ์ ์ ์ํด์ผ ํ๊ณ ์ด๋ฆ๋ ๊ณ ์ ํ๊ฒ ์ค์ ํด์ค์ผ ํ๋ ๋ถ๋ด์ด ์์ง๋ง, ๋ชจ๋์ ํ์ฉํ๋ฉด ๋ฐ๋ณต๋๋ ๋ฆฌ์์ค ๋ฌถ์์ ์ต์ํํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด main.tf ํ์ผ์ ๋ค๋ฅธ ๋๋ ํฐ๋ฆฌ์ ์์ฑํ๋ค.
module "mypw1" {
source = "../modules/terraform-random-pwgen"
}
module "mypw2" {
source = "../modules/terraform-random-pwgen"
isDB = true
}
output "mypw1" {
value = module.mypw1
}
output "mypw2" {
value = module.mypw2
}
์ด์ init์ apply๋ฅผ ์คํํ์ฌ ์์ ๋ชจ๋์ ํธ์ถํด ๋ฐ๋ณต ์ฌ์ฌ์ฉํ๋ ๋ฃจํธ ๋ชจ๋์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๊ฒ ๋ค.
terraform init๋ฅผ ์คํ ์ modules.json์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ชจ๋๋ก ๋ฌถ์ฌ์ง ๋ฆฌ์์ค๋ module์ด๋ผ๋ ์ ์๋ฅผ ํตํด ๋จ์ํ๊ฒ ์ฌํ์ฉํ๊ณ ๋ฐ๋ณต ์ฌ์ฉํ ์ ์๋ค.
๋ชจ๋์ ๊ฒฐ๊ณผ ์ฐธ์กฐ ํ์์ module.<๋ชจ๋ ์ด๋ฆ>.<output ์ด๋ฆ>์ผ๋ก ์ ์๋๋ค.
3. ๋ชจ๋ ์ฌ์ฉ ๋ฐฉ์
๋ชจ๋ ์ฌ์ฉ ์ ํ๋ก๋ฐ์ด๋ ์ ์์ ๋ฐ๋ณต๋ฌธ ์ฒ๋ฆฌ์ ๋ํด ํ์ธํด๋ณด๊ฒ ๋ค.
๋ชจ๋๊ณผ ํ๋ก๋ฐ์ด๋
๋ชจ๋์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฆฌ์์ค๋ ๊ด๋ จ ํ๋ก๋ฐ์ด๋์ ์ ์๊ฐ ํ์ํ๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ์๋ ํ๋ก๋ฐ์ด๋ ์ ์๋ฅผ ๋ชจ๋ ์์ ๋์ด์ผ ํ ์ง ๋ฐ์ ๋์ด์ผ ํ ์ง ๊ตฌ์ฑ์ ๊ณ ๋ฏผํ ์ ์๋ค.
์ ํ 1. ์์ ๋ชจ๋์์ ํ๋ก๋ฐ์ด๋ ์ ์
๋ชจ๋์์ ์ฌ์ฉํ๋ ํ๋ก๋ฐ๋์ด ๋ฒ์ ๊ณผ ๊ตฌ์ฑ ์์ธ๋ฅผ ์์ ๋ชจ๋์์ ๊ณ ์ ํ๋ค.
- ํ๋ก๋ฐ์ด๋ ๋ฒ์ ๊ณผ ๊ตฌ์ฑ์ ๋ฏผ๊ฐํ๊ฑฐ๋, ๋ฃจํธ ๋ชจ๋์์ ํ๋ก๋ฐ์ด๋ ์ ์ ์์ด ์์ ๋ชจ๋์ด ๋ ๋ฆฝ์ ์ธ ๊ตฌ์กฐ์ผ ๋ ๊ณ ๋ คํ ๋ฐฉ๋ฒ์ด๋ค
- ํ์ง๋ง ๋์ผํ ํ๋ก๋ฐ์ด๋๊ฐ ๋ฃจํธ์ ์์ ์์ชฝ์ ๋๋ ์๋ก ๋ค๋ฅธ ์์ ๋ชจ๋์ ๋ฒ์ ์กฐ๊ฑด ํฉ์๊ฐ ์ ๋๋ฉด, ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ๋ชจ๋์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค๋ ๋จ์ ์ด ์์ผ๋ฏ๋ก ์ ์ฌ์ฉํ์ง ์๋๋ค.
์ ํ 2. ๋ฃจํธ ๋ชจ๋์์ ํ๋ก๋ฐ์ด๋ ์ ์
์์ ๋ชจ๋์ ๋ฃจํธ ๋ชจ๋์ ํ๋ก๋ฐ์ด๋ ๊ตฌ์ฑ์ ์ข ์๋๋ ๋ฐฉ์์ด๋ค.
- ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ๋ก๋ ๋ถ๋ฆฌ๋์ด ์์ง๋ง ํ ๋ผํผ ์คํ ๋จ๊ณ์์ ๋์ผ ๊ณ์ธต์ผ๋ก ํด์๋๋ฏ๋ก ํ๋ก๋ฐ์ด๋ ๋ฒ์ ๊ณผ ๊ตฌ์ฑ์ ๋ฃจํธ ๋ชจ๋์ ์ค์ ์ด ์ ์ฉ๋๋ค.
- ์์ ๋ชจ๋์ ํ๋ก๋ฐ์ด๋ ์กฐ๊ฑด์ ๋ํด ๊ธฐ๋กํ๊ณ , ์์ ๋ชจ๋์ ์ฌ์ฉํ๋ ๋ฃจํธ ๋ชจ๋์์ ์ ์ํ๋ ํ๋ก๋ฐ์ด๋์ ๋ง๊ฒ ์ ๋ฐ์ดํธ ํด์ผ ํ๋ค.
์ค์ต์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ํ์ผ์ ์์ฑํ๋ค.
# **main.tf**
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
}
}
}
resource "aws_default_vpc" "default" {}
data "aws_ami" "default" {
most_recent = true
owners = ["amazon"]
filter {
name = "owner-alias"
values = ["amazon"]
}
filter {
name = "name"
values = ["amzn2-ami-hvm*"]
}
}
resource "aws_instance" "default" {
depends_on = [aws_default_vpc.default]
ami = data.aws_ami.default.id
instance_type = var.instance_type
tags = {
Name = var.instance_name
}
}
**# variable.tf**
variable "instance_type" {
description = "vm ์ธ์คํด์ค ํ์
์ ์"
default = "t2.micro"
}
variable "instance_name" {
description = "vm ์ธ์คํด์ค ์ด๋ฆ ์ ์"
default = "my_ec2"
}
# **output.tf**
output "private_ip" {
value = aws_instance.default.private_ip
}
์์ฑ๋ ๋ชจ๋์ ์ฌ์ฉํ ๋ฃจํธ(๋ถ๋ชจ) ๋ชจ๋ ํ์ผ ์์ฑ
**# main.tf**
provider "aws" {
region = "ap-southeast-1"
}
provider "aws" {
alias = "seoul"
region = "ap-northeast-2"
}
module "ec2_singapore" {
source = "../modules/terraform-aws-ec2"
}
module "ec2_seoul" {
source = "../modules/terraform-aws-ec2"
providers = {
aws = aws.seoul
}
instance_type = "t3.small"
}
**# output.tf**
output "module_output_singapore" {
value = module.ec2_singapore.private_ip
}
output "module_output_seoul" {
value = module.ec2_seoul.private_ip
}
๋ชจ๋๋ง๋ค ๋ค๋ฅธ ํ๋ก๋ฐ์ด๋ ์ค์ ์ ์งํํ์์ง๋ง ์ ์์ ์ผ๋ก ๋์ํ๋ค.
apply ์คํ ๊ฒฐ๊ณผ
๋ชจ๋์ ๋ฐ๋ณต๋ฌธ
๋ชจ๋ ๋ํ ๋ฆฌ์์ค์์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ฏ ๊ตฌ์ฑํ ์ ์๋ค. ๋ชจ๋์ด๋ผ๋ ๋ฆฌ์์ค ์ ์ ๋ฌถ์์ ์ํ๋ ์๋์ผ๋ก ํ๋ก๋น์ ๋ํ ์ ์์ผ๋ฏ๋ก ๋ชจ๋ ์์ด ๊ตฌ์ฑํ๋ ๊ฒ๊ณผ ๋๋นํด ๋ฆฌ์์ค ์ข ์์ฑ ๊ด๋ฆฌ์ ์ ์ง ๋ณด์์ ์ฅ์ ์ด ์๋ค
์ค์ต์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ํ์ผ์ ์์ฑ ํ apply๋ฅผ ์งํํ๋ค.
provider "aws" {
region = "ap-northeast-2"
}
module "ec2_seoul" {
**count = 2**
source = "../modules/terraform-aws-ec2"
instance_type = "t3.small"
}
output "module_output" {
value = module.ec2_seoul[*].private_ip
}
๋ชจ๋ ๋ฌถ์์ ์ผ๊ด๋ ๊ตฌ์ฑ๊ณผ ๊ตฌ์กฐ๋ก ํ๋ก๋น์ ๋์ด ๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด count๊ฐ ๊ฐํธํ ๋ฐฉ์์ด์ง๋ง, ๋์ผํ ๋ชจ๋ ๊ตฌ์ฑ์ ํ์ํ ์ธ์ ๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด for_each๋ฅผ ํ์ฉํ๋ค.
๋ค์์ ๋์ผํ ๋ชจ๋์ ๊ฐ๋ฐ๊ณผ ์์ฉ์ ๋ํ ์ ๋ ฅ ๋ณ์๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ํ์ธํด๋ณด๊ฒ ๋ค.
**locals** {
env = {
**dev** = {
type = "t3.micro"
name = "dev_ec2"
}
**prod** = {
type = "t3.medium"
name = "prod_ec2"
}
}
}
module "ec2_seoul" {
**for_each = local.env**
source = "../modules/terraform-aws-ec2"
instance_type = **each**.value.type
instance_name = **each**.value.name
}
output "module_output" {
value = [
for k in module.ec2_seoul: k.private_ip
]
}
apply ๋ฐ tfstate์ ๋ชจ๋ ์ ๋ณด ํ์ธ
4. ๋ชจ๋ ์์ค ๊ด๋ฆฌ
Module ๋ธ๋ก์ ์ ์๋ ์์ค ๊ตฌ์ฑ์ผ๋ก ๋ชจ๋์ ์ฝ๋ ์์น๋ฅผ ์ ์ํ๋ค. terraform init๋ฅผ ์ํํ ๋ ์ง์ ๋ ๋ชจ๋์ ๋ค์ด๋ก๋ํด ์ฌ์ฉํ๋ค.
๋ชจ๋ ์์ค์ ์ ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก
- ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ Terraform Registry
- ๊นํ๋ธ Github
- ๋นํธ๋ฒํท Bitbucket
- ๊น Generic Git Repository
- HTTP URLs
- S3 Bucket
- GCS Bucket google cloud storage
ํ ๋ผํผ ๊ณต์ ๋ฌธ์ ์๋ด์ ๊ฐ์ด ๋ฃจํธ ๊ฒฝ๋ก์ ๋ชจ๋์ ๋ฐฐ์นํ๋ ๊ฒ ์ธ์ ํจํค์ง ํ์ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ๋ ํ๋์ ๋ฐฉ์์ด๋ค.
๋ก์ปฌ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก
๋ก์ปฌ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ๋๋ ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ํ์ ๋๋ ํฐ๋ฆฌ๋ ./๋ก, ์์ ๋๋ ํฐ๋ฆฌ๋ ../๋ก ์์ํ๋ค.
๋์ ๋ชจ๋์ ์ด๋ฏธ ๊ฐ์ ๋ก์ปฌ ํ์ผ ์์คํ ์ ์กด์ฌํ๋ฏ๋ก ๋ค์ด๋ก๋ ์์ด ๋ฐ๋ก ์ฌ์ฉํ๋ค. ์์ ์ธ๊ธํ ๋๋ก ์ฌ์ฌ์ฉ์ฑ์ด ๊ณ ๋ ค๋๋ค๋ฉด ์์ ๋๋ ํฐ๋ฆฌ์ ๋ณ๋ ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ , ํญ์ ๋ฃจํธ ๋ชจ๋๊ณผ ํจ๊ป ๋์ํด์ผ ํ๋ ๊ฒฝ์ฐ ํ์ ๋๋ ํฐ๋ฆฌ์ ๋ชจ๋์ ์ ์ํ๋ค.
์์ ํ๊ฒฝ์ ๊ธฐ์ค์ผ๋ก ํ๋ ๋ก์ปฌ ๊ฒฝ๋ก ์์์ ์์นํ ๋ชจ๋ ๊ฒฝ๋ก ์ ์ธ
module "local_module" {
source = "../modules/my_local_module"
}
ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ
ํ ๋ผํผ ๋ชจ๋ ๋ ์ง์คํธ๋ฆฌ๋ ํ ๋ผํผ์ ํ๋กํ ์ฝ์ ์ฌ์ฉํด ๋ชจ๋์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
๊ณต๊ฐ๋ ํ ๋ผํผ ๋ชจ๋์ ์ฌ์ฉํ๊ฑฐ๋ Terraform Cloud, Terraform Enterprise์์ ์ ๊ณต๋๋ ๋น๊ณต๊ฐ ํ ๋ผํผ ๋ชจ๋์ ์ฌ์ฉํ ๋ ์ค์ ํ๋ ์์ค ์ง์ ๋ฐฉ์์ด๋ค.
๊ณต๊ฐ๋ ๋ชจ๋์ ๋ค์ ๋งํฌ์์ ํ์ธํ ์ ์๋ค.
https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest
๊ณต๊ฐ๋ ํ ๋ผํผ ๋ชจ๋์ source์ ์ ์ธํ ๋๋ <๋ค์์คํ์ด์ค>/<์ด๋ฆ>/<ํ๋ก๋ฐ์ด๋> ํํ๋ก ์ค์ ํ๋ค.
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "3.14.2"
}
๊นํ๋ธ
๊น์ ์๊ฒฉ ์ ์ฅ์๋ก ๋๋ฆฌ ์๋ ค์ง ๊นํ๋ธ๋ ํ ๋ผํผ ๊ตฌ์ฑ์ ๋ํ CI๋ฅผ ์ํ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๊ณ , ์ฌ๊ธฐ์ ์ ์ฅ๋ ๊ตฌ์ฑ์ ํ ๋ผํผ ๋ชจ๋์ ์์ค๋ก ์ ์ธํ ์๋ ์๋ค.
ํ ๋ผํผ ์์ค๋ฅผ ๊นํ๋ธ์ ์ ๋ก๋ํ๋ ๊ณผ์
- ๊นํ๋ธ์ ๋ก๊ทธ์ธ
- ์๋ก์ด ๊นํ๋ธ ์ ์ฅ์ ์์ฑ [New repository]
- Owner : ์ํ๋ ์์ ์ ์ ํ
- Repository name : ์์) terraform-module-repo
- Public ์ ํ
- Add .gitignore์ ๋๋กญ๋ฐ์ค์์ [Terraform]์ ์ ํ
- ๋งจ ์๋ [Create repository] ํด๋ฆญ
- ํด๋น ์ ์ฅ์์ ์์) ‘terraform-aws-ec2’ ๋๋ ํฐ๋ฆฌ ์์ฑ ํ main.tf , variable.tf, output.tf ์ถ๊ฐ ํ ์ ๋ก๋
๊นํ๋ธ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด๋ณด๊ฒ ๋ค. ๋ค์๊ณผ ๊ฐ์ด tfํ์ผ์ ์์ฑํ๋ค.
# main.tf
provider "aws" {
region = "ap-southeast-1"
}
module "ec2_seoul" {
source = "github.com/chanW-pack***/terraform-module-repo/terraform-aws-ec2***"
instance_type = "t3.small"
}
๋ค์๊ณผ ๊ฐ์ด ๊นํ๋ธ์ ์๋ ํ์ผ์ด ๋ค์ด๋ก๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ค์์ terraform์ ๊ด๋ฆฌํ๋ runner์ด์ workflow์ธ ์ํ๋ํฐ์ค๋ก ์์ ๋ฐฐํฌ๋ฅผ ์งํํด๋ณด๊ฒ ๋ค.