📋 학습 요약
- 주제: Azure 가상 네트워크(VNet) 기반의 다중 아키텍처 설계 및 테라폼(Terraform)을 활용한 인프라 에즈 코드(IaC) 자동화 배포
- 인프라 구성 요소:
- Network: VNet 2개 분리, 서브넷(Bastion, Load Balancer, Web) 설계
- Compute: VM 총 4대 (Bastion 2대, Web 2대)
- Public IP: 총 4개 개설 (Bastion용 2개, LB용 2개)
- 핵심 목표: 테라폼을 활용하여 선언적 코드로 Azure 리소스를 안전하고 일관되게 배포 및 관리하는 메커니즘을 마스터한다.
🌐 1. Azure 클라우드 네트워크 아키텍처 설계
실제 엔터프라이즈 환경에서 보안을 강화하기 위해 외부망 접근 허용 영역(Bastion/LB)과 내부 비공개 영역(Web Server)을 서브넷 단위로 격리하여 구성했습니다.
- Bastion 인프라 분리: 외부 SSH/RDP 접근을 차단하기 위해 중계 서버 역할을 할 Bastion VM을 대역별로 각각 배치(10.0.0.4 및 192.168.0.4)하였습니다.
- 공용 IP(Public IP) 최소화 정책: 인프라의 외부 노출면을 줄이기 위해 Public IP는 총 4개(Bastion 2개, 로드밸런서 2개)만 생성하고, 실제 백엔드 웹 서버(web1-1, web2-1)는 사설 IP만 할당하여 인바운드 보안을 강화했습니다.
🛠️ 2. Terraform (IaC) 핵심 이론
IaC (Infrastructure as Code)란 코드를 통해 인프라를 정의, 배포, 업데이트, 관리하는 기술군을 의미합니다.
2.1 IaC 도입의 4대 핵심 가치
- 자동화 (Automation): GUI를 통한 수동 클릭 없이 대규모 인프라를 명령어 한 줄로 즉시 프로비저닝.
- 멱등성 (Idempotency): 동일한 설정 코드를 몇 번이고 반복해서 실행하더라도 항상 같은 결과값(인프라 상태)을 보장함.
- 휴먼 에러 방지 (Human Error Reduction): 인프라 변경 사항을 문서화 및 코드화하여 작업자의 수동 설정 실수를 근본적으로 차단.
- 경제적 이득 증가: 인프라 구성 및 트러블슈팅에 소요되는 시간과 자원을 획득하여 생산성 극대화.
2.2 IaC 도구 분류 및 비교
- 프로비저닝 도구 (인프라 구성)
- Terraform: 오픈소스 멀티 클라우드 도구. AWS, Azure, GCP 등 다양한 플랫폼을 단일 문법(HCL)으로 일관되게 제어 가능.
- AWS CloudFormation: AWS 환경에 완벽히 최적화된 독립형 프로비저닝 도구.
- 구성 관리 도구 (소프트웨어 및 서버 세팅)
- 서버가 생성된 이후 내부 패키지 설치 및 환경 구성을 담당하는 도구: Ansible, Puppet, Chef, Saltstack 등.
💻 3. Terraform 실습 소스 코드 (Azure VNet 및 Subnet 구성)
테라폼의 Azure 전용 프로바이더(azurerm)를 선언하고 리소스 그룹, 가상 네트워크, 그리고 각 목적에 맞는 4개의 서브넷을 구축하는 HCL 코드를 구현했습니다.
Terraform
# 1. 테라폼 및 프로바이더 필수 버전 정의
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "4.74.0"
}
}
}
# 2. AzureRM 프로바이더 설정 및 구독 ID 매핑
provider "azurerm" {
features {}
subscription_id = "99b79efe-ebd6-468c-b39f-5669acb259e1"
}
# 3. 인프라 자원을 묶어줄 리소스 그룹(Resource Group) 생성
resource "azurerm_resource_group" "smchi_rg" {
name = "06-chsm-rg"
location = "Korea Central"
}
# 4. 가상 네트워크(VNet) 생성 및 주소 공간 할당
resource "azurerm_virtual_network" "smchi_vnet" {
name = "smchi-vnet1"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.smchi_rg.location
resource_group_name = azurerm_resource_group.smchi_rg.name
# 리소스 그룹이 먼저 생성되어야 하므로 명시적 의존성 지정
depends_on = [azurerm_resource_group.smchi_rg]
}
# 5. 외부 통신용 Bastion 서브넷 (Outbound 허용)
resource "azurerm_subnet" "smchi_bas1" {
name = "smchi-bas1"
virtual_network_name = azurerm_virtual_network.smchi_vnet.name
resource_group_name = azurerm_resource_group.smchi_rg.name
address_prefixes = ["10.0.0.0/24"]
default_outbound_access_enabled = true
}
# 6. 부하 분산용 Load Balancer 서브넷 (Outbound 허용)
resource "azurerm_subnet" "smchi_load1" {
name = "smchi-load1"
virtual_network_name = azurerm_virtual_network.smchi_vnet.name
resource_group_name = azurerm_resource_group.smchi_rg.name
address_prefixes = ["10.0.1.0/24"]
default_outbound_access_enabled = true
}
# 7. 내부 백엔드 Web 서버 서브넷 1 (보안을 위한 Outbound 차단)
resource "azurerm_subnet" "smchi_web1_1" {
name = "smchi-web1-1"
virtual_network_name = azurerm_virtual_network.smchi_vnet.name
resource_group_name = azurerm_resource_group.smchi_rg.name
address_prefixes = ["10.0.2.0/24"]
default_outbound_access_enabled = false
}
# 8. 내부 백엔드 Web 서버 서브넷 2 (보안을 위한 Outbound 차단)
resource "azurerm_subnet" "smchi_web1_2" {
name = "smchi-web1-2"
virtual_network_name = azurerm_virtual_network.smchi_vnet.name
resource_group_name = azurerm_resource_group.smchi_rg.name
address_prefixes = ["10.0.3.0/24"]
default_outbound_access_enabled = false
}
🛠️ 주요 체크포인트 및 요약 표
| 테라폼 명령어 | 기능 및 설명 | 비고 |
| terraform init | 프로바이더 및 플러그인 로드 및 초기화 | .terraform 디렉터리 생성 |
| terraform plan | 인프라 생성 전 변경 사항 사전 예측 및 검사 | 드라이 런(Dry-run) 기능 |
| terraform apply | 코드를 분석하여 실제 Azure 클라우드에 리소스 생성 | terraform.tfstate에 상태 기록 |
| 속성: depends_on | 리소스 간의 생성 순서 강제 정의 (의존성 제어) | RG가 만들어진 후 VNet이 생성되도록 유도 |
| 보안 설정 | Web 서브넷의 default_outbound_access_enabled = false | 내부 자원의 무분별한 외부 유출 방지 및 격리 |
📝 오늘의 회고
오늘은 가상화 및 리눅스 인프라를 넘어 실제 퍼블릭 클라우드인 Azure 환경의 고도화된 네트워크 구조를 아키텍처링하고, 이를 코드로서 관리하는 **테라폼(Terraform)**의 기본기를 닦았다.
이전까지 포털 마우스 클릭으로 일일이 구성하던 리소스 그룹, VNet, 용도별 서브넷들을 HCL 코드로 명시하여 일괄 배포해 보니 IaC가 가진 '자동화'와 '인프라 자산화'의 위력을 즉각적으로 체감할 수 있었다. 특히 인프라 관리의 핵심인 '멱등성' 개념을 배우며 몇 번을 실행해도 설정 파일과 동일한 클라우드 상태를 유지해 주는 안정성에 신뢰가 갔다. 웹 서버 서브넷의 아웃바운드 통신을 비활성화하여 기밀성을 확보한 것처럼, 앞으로 인프라 코드를 작성할 때에도 항상 보안 아키텍처 설계를 최우선으로 투영하는 연습을 이어나가야겠다.
'매일 배운 것 정리' 카테고리의 다른 글
| [260526] 클라우드(Cloud) 컴퓨팅 핵심 이론 (0) | 2026.05.26 |
|---|---|
| [260521] 모의해킹 실습: MS17-010(EternalBlue) 취약점 진단 및 Msfvenom을 이용한 페이로드 제작·우회 (0) | 2026.05.21 |
| [260529] Azure 테라폼(Terraform) 실습: NSG 보안 규칙, NAT 게이트웨이 연동 및 Rocky Linux VM 자동화 배포 (0) | 2026.05.21 |
| [260528] Azure 클라우드 아키텍처: VNet 피어링(Peering)을 통한 가상 네트워크 간 연동 실습 (0) | 2026.05.21 |
| [260515] Windows Server: 그룹 정책(GPO) 심화 및 로밍 프로필(Roaming Profile) 실습 (0) | 2026.05.15 |
