티스토리 뷰
반응형
- vpc를 모듈화하여 환경별로 다르게 vpc를 생성할 수 있도록 해보자.
- 아래의 파일 명, 리소스 명 등은 임의로 변경하여도 완전히 무방하다!
1. module 작성하기
- 먼저 테라폼 디렉토리에 하위 디렉토리를 만들어준다.
- 해당 디렉토리 명은 이후 모듈에서 사용할 것임!
[terraform] tree
terraform
├── ec2.tf
├── main.tf
├── variables.tf
└── vpc_module
├── gateway.tf
├── outputs.tf
├── route.tf
├── variables.tf
└── vpc.tf
- vpc_module의 tf 파일들의 내용은 일반적인 작성 방법과 다르지 않다.
- 다만 cidr 블록 등은 유동적으로 변경할 수 있도록, 다음과 같이 vpc_module/variable.tf와 vpc.tf로 작성한다.
// vpc_module/variable.tf
variable "az_a" {
type = string
}
variable "az_c" {
type = string
}
variable "cidr_vpc" {
type = string
}
variable "cidr_private_a" {
type = string
description = "Private Subnet Primary"
}
variable "cidr_private_b" {
type = string
description = "Private Subnet Secondary"
}
variable "cidr_public_a" {
type = string
description = "Public Subnet"
}
// vpc_module/vpc.tf
resource "aws_vpc" "vpc" {
cidr_block = var.cidr_vpc
instance_tenancy = "default"
tags = {
Name = "ingnoh-VPC"
}
}
resource "aws_subnet" "private_subnet_a" {
cidr_block = var.cidr_private_a
vpc_id = aws_vpc.vpc.id
availability_zone = var.az_a
tags = {
Name = "ingnoh-Private-Subnet-Primary"
}
}
- module 내부에서 만들어진 리소스는 밖에서 접근하기 위해 outputs.tf를 작성해야 한다.
- 파일 명은 바뀌어도 무방하다. ingnoh.tf던... 다만 vpc_module 디렉토리 내부에 작성해야 한다.
// vpc_module/outputs.tf
output "vpc_id" {
value = aws_vpc.vpc.id
}
output "private_subnet_a_id" {
value = aws_subnet.private_subnet_a.id
}
output "private_subnet_b_id" {
value = aws_subnet.private_subnet_b.id
}
output "public_subnet_a_id" {
value = aws_subnet.public_subnet_a.id
}
2. module 외부에서 사용하기
- 해당 내용은 main.tf와 terraform/variable.tf를 조합하여 다음과 같이 적용해볼 수 있다.
// terraform/variables.tf
variable "az_a" {
type = string
default = "ap-northeast-2a"
}
variable "az_c" {
type = string
default = "ap-northeast-2c"
}
variable "cidr_vpc" {
type = string
}
variable "cidr_private_a" {
type = string
}
variable "cidr_private_b" {
type = string
}
variable "cidr_public_a" {
type = string
}
// terraform/main.tf
module "network" {
source = "./vpc_module"
az_a = var.az_a
az_c = var.az_c
cidr_vpc = var.cidr_vpc
cidr_private_a = var.cidr_private_a
cidr_private_b = var.cidr_private_b
cidr_public_a = var.cidr_public_a
}
- source 값은 모듈로 사용할 파일들이 저장된 디렉토리를 명시한다.
- 여기서 ./vpc_module/vpc.tf 하는 식으로 시도하는 삽질은 하지 말자. vpc_module이라는 디렉토리 이름 자체를 입력해준다.
- terraform 디렉토리에서 terraform init > plan > apply 과정을 거치되, 이제부터는 cidr 블록을 입력받게 된다.
3. 적용 방법
- ec2 인스턴스에서 vpc_module 내부에 작성된 서브넷을 사용하는 경우, 다음과 같이 작성해볼 수 있다.
terraform/ec2.tf
resource "aws_instance" "ec2" {
// ... 중략
subnet_id = module.network.public_subnet_a_id
// ... 후략
}
- module 키워드로 terraform/main.tf에서 작성한 network 모듈을 불러오고,
network 모듈 내부의 outputs.tf에 선언해둔 서브넷 id를 가져오는 예시이다.
- 이렇게 작성된 tf 파일들을 terraform apply에 매개변수를 넣어 사용하려면 다음과 같이 적용해볼 수 있다.
- ${} 내부의 값은 원하는 CIDR 값으로 변경하여 사용한다.
terraform apply -var="cidr_private_a=${cidr_private_a}" -var="cidr_private_b=${cidr_private_b}" \
-var="cidr_public_a=${cidr_public_a}" -var="cidr_vpc=${cidr_vpc}"
'HashiCorp. > terraform' 카테고리의 다른 글
[Terraform] terraform init에서 local provider 사용(plugin dir) (0) | 2021.03.16 |
---|---|
[Terraform] S3 버킷 및 초기 폴더 생성 (0) | 2021.02.23 |
[Terraform] IoT Assume Role이 적용된 Role 생성 및 정책 추가 (0) | 2021.01.05 |
[Terraform] AWS EC2 count 변수 및 CLB 연결 (0) | 2020.12.20 |
[Terraform] IAM Role - MalformedPolicyDocument: Has prohibited field Resource 에러 (0) | 2020.12.03 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- JEST
- 코딩테스트
- etc
- Spring Cloud Config
- JPA
- Gradle
- pgloader
- AWS IoT
- Git
- Database
- Puppeteer
- Node.js
- hashicorp
- postgresql
- javascript
- IntelliJ
- Docker
- kotlin
- dev
- shell
- Linux
- terraform
- Vault
- Java
- jQuery
- eureka
- spring boot
- mysql
- AWS
- react
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함