이제 하나의 블록에서 다른 사람이 작성한 인프라 코드를 사용해보는 작업을 하겠습니다.
https://github.com/tedilabs/terraform-aws-network
GitHub - tedilabs/terraform-aws-network: 🌳 A sustainable Terraform Package which creates Network resources on AWS
🌳 A sustainable Terraform Package which creates Network resources on AWS - GitHub - tedilabs/terraform-aws-network: 🌳 A sustainable Terraform Package which creates Network resources on AWS
github.com
이 깃허브 주소에 많은 terraform aws provider가 제공하는 aws인프라 모듈코드들이 존재합니다. 저희는 이를 이용해서 aws VPC를 간단히 만들고 없애는 실습을 해보겠습니다.
https://github.com/tedilabs/fastcampus-devops/blob/main/2-terraform/04-module/main.tf
GitHub - tedilabs/fastcampus-devops: 🚀 패스트캠퍼스 데브옵스 초격차 코스 자료
🚀 패스트캠퍼스 데브옵스 초격차 코스 자료. Contribute to tedilabs/fastcampus-devops development by creating an account on GitHub.
github.com
코드는 강의자료를 참고하였습니다.
/main.tf
provider "aws" {
region = "ap-northeast-2"
}
module "vpc" {
source = "tedilabs/network/aws//modules/vpc"
version = "0.24.0"
name = "fastcampus"
cidr_block = "10.0.0.0/16"
internet_gateway_enabled = true
dns_hostnames_enabled = true
dns_support_enabled = true
tags = {}
}
module "subnet_group__public" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
map_public_ip_on_launch = true
subnets = {
"${module.vpc.name}-public-001/az1" = {
cidr_block = "10.0.0.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-public-002/az2" = {
cidr_block = "10.0.1.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
module "subnet_group__private" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
map_public_ip_on_launch = false
subnets = {
"${module.vpc.name}-private-001/az1" = {
cidr_block = "10.0.10.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-private-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
module "route_table__public" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
subnets = module.subnet_group__public.ids
ipv4_routes = [
{
cidr_block = "0.0.0.0/0"
gateway_id = module.vpc.internet_gateway_id
},
]
tags = {}
}
module "route_table__private" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
subnets = module.subnet_group__private.ids
ipv4_routes = []
tags = {}
}
매우 길지만 이해만한다면 그렇게 복잡한 것은 아닙니다.
https://registry.terraform.io/modules/tedilabs/network/aws/0.26.1/submodules/vpc?tab=inputs
Terraform Registry
registry.terraform.io
우선 git에서 제공하는 링크를 타고 들어가면 module block을 작성하는 법이 나옵니다. 이를 토대로 일단 vpc를 하나 만들어 보겠습니다.
...
provider "aws" {
region = "ap-northeast-2"
}
module "vpc" {
source = "tedilabs/network/aws//modules/vpc"
version = "0.24.0"
name = "fastcampus"
cidr_block = "10.0.0.0/16"
internet_gateway_enabled = true
dns_hostnames_enabled = true
dns_support_enabled = true
tags = {}
}
...
일단 aws provider를 불러오고 region을 설정해 주었습니다. 그리고 공식문서를 보면 다양한 종류의 provider를 참고하여 module을 불러올 수 있습니다.
https://www.terraform.io/language/modules/sources#terraform-registry
Module Sources | Terraform by HashiCorp
The source argument tells Terraform where to find child modules's configurations in locations like GitHub, the Terraform Registry, Bitbucket, Git, Mercurial, S3, and GCS.
www.terraform.io
크게 Local paths, Terraform Registry, GitHub... 등이 있는데, 우리는 이번에 terraform registry를 활용했습니다. 왜냐하면 위위 링크가 registry이기 때문입니다.
그리고 required input인 name을 통해서 vpc의 이름을 지정해 주었습니다. 그 외에도 optional input인 cidr_block, internet_gateway_enabled, dns_hostnames_enabled, dns_support_enabled, tags등을 적어주었습니다. 모두 다 공식문서에 어떤기능을 제공하는 것인지 설명이 나와있습니다.
...
module "subnet_group__public" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
map_public_ip_on_launch = true
subnets = {
"${module.vpc.name}-public-001/az1" = {
cidr_block = "10.0.0.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-public-002/az2" = {
cidr_block = "10.0.1.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
module "subnet_group__private" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
map_public_ip_on_launch = false
subnets = {
"${module.vpc.name}-private-001/az1" = {
cidr_block = "10.0.10.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-private-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
...
다음은 subnet group입니다.
https://github.com/tedilabs/terraform-aws-network/tree/main/modules/subnet-group
Terraform Registry
registry.terraform.io
subnet_group__public은 public subnet을 관리하는 그룹이라고 보시면 됩니다. 이는 각각의 가용영역마다 같은 기능을 하는 subnet을 만들게 됩니다. 이런 구성을 위해서 만든 것이라고 보시면 됩니다. 그리고 여기서 또 string interpolation이 사용되었는데 다른 모듈을 참조하려면 module.(모듈이름).(용도)로 해주시면 됩니다. 위에서 module.vpc.name = fastcampus입니다.
또한 vpc_id를 보면 여기서 id는 VPC의 id라고 ouput에 명시되어 있음로, 즉 저 코드의 의미는 위에서 만든 vpc와 subnet을 연결하라는 의미와 같습니다. 또한 해당 subnet에 연결되는 인스턴스는 Public IP를 Elastic하게 할당해 달라고 map_public_ip_on_lanuch를 true로 주었습니다.
그리고 subnet에 "${module.vpc.name}-public-001/az1", "${module.vpc.name}-public-002/az2"의 cidr_block을 설정하고 가용 구역을 정해주었습니다.
이를 subnet_group__private에서도 동일하게 진행하면 됩니다.
...
module "route_table__public" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
subnets = module.subnet_group__public.ids
ipv4_routes = [
{
cidr_block = "0.0.0.0/0"
gateway_id = module.vpc.internet_gateway_id
},
]
tags = {}
}
module "route_table__private" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
subnets = module.subnet_group__private.ids
ipv4_routes = []
tags = {}
}
...
또한 이 외에도 route table을 설정해 주었습니다.
https://github.com/tedilabs/terraform-aws-network/tree/main/modules/route-table
GitHub - tedilabs/terraform-aws-network: 🌳 A sustainable Terraform Package which creates Network resources on AWS
🌳 A sustainable Terraform Package which creates Network resources on AWS - GitHub - tedilabs/terraform-aws-network: 🌳 A sustainable Terraform Package which creates Network resources on AWS
github.com
여기에 잘 나와있으니까 이건 그냥 각자 해석해보면 좋을 것 같습니다. 그다음에는 진짜로 만들어 봅시다.
$ terraform init
$ terraform plan
$ terraform apply
다 완벽히 만들어 진 것을 확인할 수 있습니다.
그리고 모듈의 코드를 확인하려면
https://github.com/tedilabs/terraform-aws-network/blob/main/modules/route-table/main.tf
GitHub - tedilabs/terraform-aws-network: 🌳 A sustainable Terraform Package which creates Network resources on AWS
🌳 A sustainable Terraform Package which creates Network resources on AWS - GitHub - tedilabs/terraform-aws-network: 🌳 A sustainable Terraform Package which creates Network resources on AWS
github.com
여기 레포에서 main.tf를 다 확인하면 되는데, 이는 locals, variables를 사용해서 하드코딩을 하지 않고 다 재사용 가능하게 짜는 것을 보실 수 있습니다. 이제 terraform destroy를 하고, 다음시간에 이를 어떻게 구현할지 생각해 보는 시간을 가져보도록 하겠습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL count와 for_each (0) | 2022.07.21 |
---|---|
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL variable & local & output (0) | 2022.07.21 |
[ DevOps ] - (VPC) VPC를 구성하는 기본 원리 ( 복습 ) (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL resource와 data (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL 기초 문법 (0) | 2022.07.21 |