Terraform AWS Provider 및 VPC, Subnet 설정
이전 글에서 테라폼 설치와 테라폼 명령어에 대해서 알아봤다. 이번 글에서는 AWS Provider 설정과 네트워크 설정(vpc, subnet)을 모듈화로 적용하는 방법에 대해서 알아보자
Terraform을 사용하여 AWS 리소스를 효과적으로 관리하는 방법에 대해 설명해 보겠다. 특히 AWS Provider 설정, 네트워크 설정, 그리고 모듈 외부에서 실제로 모듈을 사용하는 방법에 초점을 맞춰서 진행했다.
1. provider 설정과 네트워크 설정이 필수적인 이유
테라폼의 provider 설정
테라폼에서 provider 설정은 마치 원격 조종기와 같다고 할 수 있다. 이 설정을 통해 테라폼은 AWS와 같은 클라우드 서비스와 '대화'를 시작한다. 여기서 '대화'란 테라폼이 클라우드 서비스에 리소스 생성, 수정, 삭제 등의 지시를 내리는 것을 말한다. provider 설정에서는 클라우드 서비스의 종류(AWS, Google Cloud, Azure 등)와 함께 해당 서비스에 접근하기 위한 인증 정보(예: 액세스 키, 비밀 키)를 지정한다.
네트워크 설정의 중요성
- 격리 및 보안 (VPC): VPC는 마치 견고한 성벽으로 둘러싸인 도시와 같다. 이 도시 내에서 우리의 데이터와 애플리케이션은 외부 세계와 분리되어 보호받는다. 이 성벽을 통해 외부로부터의 불필요하거나 위험한 접근을 막고, 내부의 중요한 리소스를 안전하게 보관할 수 있다.
- 리소스 관리 및 구성 (서브넷): 서브넷은 VPC 내의 작은 구역이라고 생각할 수 있다. 마치 도시 내의 다양한 지역처럼, 각 서브넷은 특정 목적을 가지고 구성된다. 예를 들어, 하나의 서브넷은 애플리케이션 서버를 위한 공간으로, 또 다른 서브넷은 데이터베이스 서버를 위한 공간으로 설정할 수 있다. 이렇게 구역을 나눔으로써, 보안과 효율성을 높일 수 있다.
- 연결성: VPC와 서브넷 설정은 도시의 교통 시스템과 같다. 이 설정은 어떻게 리소스들이 서로 연결되고, 외부 세계(인터넷, 다른 AWS 서비스, 온프레미스 환경 등)와 어떻게 소통할지를 결정한다. 적절한 네트워크 구성은 데이터의 원활한 흐름과 효율적인 통신을 가능하게 한다.
이처럼 테라폼을 이용해 AWS 인프라를 구축할 때, provider 설정과 네트워크 설정은 매우 중요하다. provider는 테라폼이 클라우드 서비스와 통신할 수 있는 '통로'를 만들어주고, 네트워크 설정은 우리의 리소스가 안전하고 효율적으로 운영될 수 있는 '환경'을 조성한다. 이러한 설정을 통해 우리는 클라우드 환경에서 애플리케이션과 데이터를 효과적으로 운영하고 관리할 수 있는 기초를 마련하게 된다.
2. AWS Provider 설정
Terraform과 AWS의 연동을 위한 기본적인 Provider 설정에 대해 알아보자. Terraform과 AWS의 연동은 provider
블록을 통해 시작한다. 이 설정은 Terraform에게 AWS 리소스를 생성, 관리, 업데이트, 삭제할 수 있는 권한을 부여한다.
provider "aws" {
region = "ap-northeast-2" // AWS 리전 설정
}
region 파라미터는 AWS 리소스가 위치할 지리적인 리전을 지정한다.
"ap-northeast-2"는 AWS의 서울 리전을 의미하며, 이를 통해 Terraform이 서울 리전에 있는 리소스를 관리할 수 있게 한다.
3. 네트워크 모듈 설정 (network 디렉토리라 가정)
Terraform에서 네트워크 설정은 매우 중요한 부분이다. 기존 VPC와 서브넷 정보를 조회하고 참조하는 것은 리소스 배치 및 연결을 위해 필수적이다.
main.tf 파일에서는 aws_vpc와 aws_subnet 데이터 소스를 사용하여 특정 VPC와 서브넷의 정보를 가져온다. 이 코드는 모듈 외부에서 변수 vpc_id 및 subnet_ids를 통해 입력받은 VPC와 서브넷 정보를 조회한다.
data "aws_vpc" "main" {
id = var.vpc_id // VPC ID 조회
}
data "aws_subnet" "subnets" {
count = length(var.subnet_ids) // 서브넷 ID 개수
id = var.subnet_ids[count.index] // 각 서브넷 ID 조회
}
outputs.tf 파일에서는 모듈의 출력값을 정의한다. 이러한 출력값은 모듈을 사용하는 다른 Terraform 코드에서 참조될 수 있다. 이 파일에서는 조회된 VPC의 ID와 서브넷 ID들을 반환한다.
output "vpc_id" {
value = data.aws_vpc.main.id // 조회된 VPC의 ID 반환
}
output "subnet_ids" {
value = [for s in data.aws_subnet.subnets : s.id] // 조회된 서브넷 ID들 반환
}
vpc_id 출력값은 조회된 VPC의 ID를 제공하며, 다른 리소스(예: 보안 그룹, 네트워크 리소스)를 구성할 때 VPC를 참조하는 데 사용된다.
subnet_ids 출력값은 조회된 서브넷의 ID들을 배열 형태로 제공한다. 이는 EC2 인스턴스, 로드 밸런서 등이 특정 서브넷에 연결되도록 하는 데 사용된다.
variables.tf 파일에서는 모듈에 필요한 입력 변수들을 정의한다. 여기서는 VPC ID와 서브넷 ID들을 입력받기 위한 변수를 정의한다. 이 변수들은 모듈 사용 시 필요한 네트워크 정보를 전달하는 역할을 한다.
variable "vpc_id" {
description = "The ID of the VPC"
type = string
}
variable "subnet_ids" {
description = "List of subnet IDs"
type = list(string)
}
이 파일에서 정의된 변수들만이 모듈 외부 main.tf에서 값을 입력받을 수 있다. 즉, variables.tf에 선언된 변수들은 모듈 외부에서 주입할 수 있는 매개변수의 목록을 구성한다.
모듈 내부의 main.tf(/network/main.tf) 파일에서 이 변수들을 사용하여 리소스를 설정하거나 데이터 소스를 조회할 수 있다. 변수가 variables.tf에 정의되지 않으면, 모듈 외부에서 해당 변수에 값을 주입할 수 없다.
이는 모듈의 재사용성과 유연성을 높이는 데 중요한 역할을 한다.
4. 모듈 외부 디렉토리에서 모듈 사용
아래는 네트워크 설정 모듈을 사용하는 모듈 외부(즉, network 디렉토리 외부)의 main.tf의 예시 코드다. 이 코드는 모듈에서 정의된 변수들을 사용하여 특정 VPC와 서브넷 정보를 모듈에 전달한다.
provider "aws" {
region = "ap-northeast-2" // AWS 리전 설정
}
module "network_module" {
source = "./modules/network" // 네트워크 모듈 경로
vpc_id = "vpc-1234abcd" // 사용할 VPC의 ID
subnet_ids = ["subnet-5678efgh", "subnet-9012ijkl"] // 사용할 서브넷 ID들
}
output "vpc_id_used" {
value = module.network_module.vpc_id
}
output "subnet_ids_used" {
value = module.network_module.subnet_ids
}
이 코드는 module "network_module" 블록을 통해 네트워크 모듈을 호출하고, source 속성으로 모듈의 위치를 지정한다. vpc_id와 subnet_ids는 모듈에 전달할 VPC ID와 서브넷 ID들을 지정한다.
output 블록은 Terraform 코드가 생성한 리소스의 정보를 외부로 출력하는 데 사용된다. 모듈 내부에서 정의된 output 값은 해당 모듈을 사용하는 다른 Terraform 코드에서 참조할 수 있다.
💡 output 블록
모듈 외부 main.tf에서 output 블록을 사용하는 것은 선택 사항이다.
이를 통해 모듈이 생성하거나 조회한 리소스의 정보(예: VPC ID, 서브넷 ID 등)를 확인할 수 있다. output 블록은 Terraform 실행 결과를 확인하거나, 모듈이 제공하는 정보를 다른 리소스나 모듈에서 활용할 때 유용하다. 하지만 반드시 필요한 것은 아니며, 필요에 따라 사용하면 된다.
이러한 설정을 통해 Terraform 모듈을 사용하여 네트워크 설정을 효율적으로 재사용하고, 다른 Terraform 코드와 쉽게 통합할 수 있다. 이는 코드의 재사용성을 높이고, 프로젝트의 유지 관리를 용이하게 한다.
5. 모듈 재사용 시 주의 사항
모듈은 가능한 한 범용적이고 유연하게 설계되어야 한다. 너무 특정한 경우에만 적용되는 로직은 재사용성을 떨어뜨린다. 그리고 입력 변수와 출력값은 명확하고 직관적이어야 한다. 이를 통해 모듈을 사용하는 사용자가 모듈의 기능을 쉽게 이해하고 적용할 수 있다.
이렇게 테라폼을 모듈화로 적용하는 첫 발걸음을 떼었다. 이제 다음 글에서는 ECS 클러스터를 위한 launch template와 auto scaling group을 설정하는 모듈에 대해서 설명하도록 하겠다.
🔻 MacOs에서 테라폼 설치 방법과 terraform 명령어 사용법이 궁금하다면 아래 링크에 정리되어 있다. 🔻
엉금엉금 테라폼 적용하기 (2) - MacOS에서 테라폼 설치 및 terraform 명령어 사용법
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '개발자의 서랍'님의 블로그도 한번 봐주세요 :)
'테라폼(Terraform)' 카테고리의 다른 글
엉금엉금 테라폼 적용하기 (6) - Dynamic 블록으로 AWS 서비스와 태스크 정의하기 (0) | 2023.12.13 |
---|---|
엉금엉금 테라폼 적용하기 (5) - 테라폼으로 ECS Cluster를 생성할때 사용되는 용량 공급자(capacity provider) 이해하고 적용하기 (1) | 2023.12.11 |
엉금엉금 테라폼 적용하기 (4) - Terraform에서 Launch Template, 오토 스케일링 설정하기 (0) | 2023.12.08 |
엉금엉금 테라폼 적용하기 (2) - MacOS에서 테라폼 설치 및 terraform 명령어 사용법 (0) | 2023.12.08 |
엉금엉금 테라폼 적용하기 (1) - 비용 절감을 위한 테라폼 알아보기 (0) | 2023.12.06 |