< Lab >
Lab into : Using Terraform to Create Networks and Firewalls
실습: Terraform을 사용하여 네트워크 및 방화벽 만들기
- Terraform을 사용해 네트워크 인프라 생성을 자동화
- 두 개의 VPCs를 하나는 공공 서비스용으로, 다른 하나는 데이터베이스 서버용으로 생성
- 각 네트워크에 대한 방화벽 규칙 생성
Using Terraform to Create Networks and Firewalls
Terraform을 사용하여 네트워크 및 방화벽 만들기
- Terraform을 사용하여 네트워크 생성 자동화 (Terraform을 사용해 네트워크와 서브넷을 생성)
- Project info에서 프로젝트 IP를 복사
+) Project ID : qwiklabs-gcp-04-61b5b1315520 - 클라우드 셸을 열어서 terraform-networks라는 디렉토리를 만들고 디렉토리 변경
mkdir terraform-networks cd terraform-networks
- 실습에 필요한 Terraform 파일을 생성 후 파일이 생성되었는지 확인
touch provider.tf touch terraform.tfvars touch test-server-linux.tf touch variables.tf touch vpc-network-public.tf touch vpc-firewall-rules-public.tf touch public-test-server-linux.tf touch random-id-generator.tf ls
- Open Editor를 클릭한 후 terraform-networks 폴더의 provider.tf 파일 코드 입력을 통해
Google Cloud Terraform 공급자를 구성
terraform { required_version = ">= 0.12" } provider "google" { project = var.project_id region = var.gcp_region_1 zone = var.gcp_zone_1 }
- variable.tf 파일을 열고 변수와 기타 변수를 생성
# GCP Project ID variable "project_id" { type = string description = "GCP Project ID" } # Region to use for Subnet 1 variable "gcp_region_1" { type = string description = "GCP Region" } # Zone used for VMs variable "gcp_zone_1" { type = string description = "GCP Zone" } # Define subnet for public network variable "subnet_cidr_public" { type = string description = "Subnet CIDR for Public Network" }
- terraform.tfvars 파일을 열고 여러 변수를 설정
# GCP Settings project_id = "your-project-id" // 즉, qwiklabs-gcp-04-61b5b1315520 gcp_region_1 = "us-central1" gcp_zone_1 = "us-central1-a" # GCP Network Variables subnet_cidr_public = "10.1.1.0/24"
- vpc-network-public.tf 파일을 열어 다음 추가
하나의 서브넷이 있는 VPC를 생성하고 서브넷에서 ip_cidr_range 및 region 에 대한 두 변수를 확인
또한 네트워크 속성이 서브넷 이전에 생성된 VPC를 다시 참조하는 방법을 확인
resource "google_compute_network" "public-vpc" { name = "public-vpc" auto_create_subnetworks = "false" routing_mode = "GLOBAL" } resource "google_compute_subnetwork" "public-subnet_1" { name = "public-subnet-1" ip_cidr_range = var.subnet_cidr_public network = google_compute_network.public-vpc.name region = var.gcp_region_1 }
- 구글 콘솔에서 VPC 네트워크 클릭을 통해 defualt 네트워크 확인
- 클라우드 셸에서 Open Terminal을 클릭한 후 올바른 폴더에 있는지 확인
cd ~/terraform-networks
- Terraform 초기화
terraform init
- Terraform 계획을 빌드
오류가 없는지 확인하고 어떤 리소스가 생성되는지 확인
terraform plan
- 리소스를 생성
terraform apply -auto-approve
- 스크립트가 완성된 후 콘솔의 콘솔의 VPC 네트워크를 새로고침하여 새 네트워크와 서브넷 표시 확인
- 방금 생성한 것을 삭제
terraform destroy -auto-approve
- Terraform을 사용하여 방화벽 규칙 만들기
- Open Editor을 클릭한 후 vpc-firewall-rules-public.tf 파일에 SSH를 허용하는 방화벽 규칙 추가
이 규칙은 모든 곳에서 SSH를 허용하지만 "allow-ssh" 태그가 있는 시스템에만 허용
# allow ssh resource "google_compute_firewall" "public-allow-ssh" { name = "${google_compute_network.public-vpc.name}-allow-ssh" network = google_compute_network.public-vpc.name allow { protocol = "tcp" ports = ["22"] } source_ranges = [ "0.0.0.0/0" ] target_tags = ["allow-ssh"] }
- Windows 시스템에는 SSH가 아닌 RDP가 필요하므로 SSH 규칙 아래에 다음 RDP 규칙을 추가
# allow rdp resource "google_compute_firewall" "public-allow-rdp" { name = "${google_compute_network.public-vpc.name}-allow-rdp" network = google_compute_network.public-vpc.name allow { protocol = "tcp" ports = ["3389"] } source_ranges = [ "0.0.0.0/0" ] target_tags = ["allow-rdp"] }
- Ping은 테스트에 유용하도록 이전 규칙 아래에 다음 규칙을 추가
# allow ping only from everywhere resource "google_compute_firewall" "public-allow-ping" { name = "${google_compute_network.public-vpc.name}-allow-ping" network = google_compute_network.public-vpc.name allow { protocol = "icmp" } source_ranges = [ "0.0.0.0/0" ] }
- Open Terminal을 클릭한 후 오류를 확인하고 생성될 내용을 확인
terraform plan
- Terraform 명령을 실행하고 콘솔을 사용하여 네트워크, 서브넷 및 방화벽 규칙이 모두 생성되고 있는지 확인
terraform apply -auto-approve
- Terraform을 사용하여 가상 머신 생성 (네트워크에 테스트 서버를 추가하고 방화벽 규칙이 작동하는지 확인)
- Open Editor를 클릭하고 random-id-generator.tf 파일에 코드를 추가
이 Terraform 플러그인은 프로그래밍 방식으로 추가된 VM의 고유한 이름을 생성하는 데 사용
# Terraform plugin for creating random ids resource "random_id" "instance_id" { byte_length = 4 }
- 공용 네트워크에서 가상 머신을 생성하려면 test-server-linux.tf 파일을 열고 다음 코드를 추가
출력 변수는 생성된 시스템의 이름과 내부 및 외부 IP 주소를 반환하며
이 시스템에는 "allow-ssh" 태그가 지정되어 있으므로 연결할 수 있음
마지막으로 이 시스템이 이전에 생성한 공용 네트워크에 있도록 구성하는 network_interface 섹션의 코드를 살펴봄
# Create Test Server in Public VPC resource "google_compute_instance" "test-server-linux" { name = "public-test-server-linux-${random_id.instance_id.hex}" machine_type = "f1-micro" zone = var.gcp_zone_1 tags = ["allow-ssh"] boot_disk { initialize_params { image = "debian-cloud/debian-9" } } metadata_startup_script = "sudo apt-get update;" network_interface { network = google_compute_network.public-vpc.name subnetwork = google_compute_subnetwork.public-subnet_1.name access_config { } } } output "test-server-linux" { value = google_compute_instance.test-server-linux.name } output "test-server-linux-external-ip" { value = google_compute_instance.test-server-linux.network_interface.0.access_config.0.nat_ip } output "test-server-linux-internal-ip" { value = google_compute_instance.test-server-linux.network_interface.0.network_ip }
- Terraform 계획을 실행하고 이전에 이 머신을 생성하기 위해 했던 것처럼 명령을 적용
오류가 나타나면 다른 두 명령을 실행하기 전에 terraform init를 다시 실행
teraform init terraform plan terraform apply -auto-approve
- 명령이 완료되면 VM 이름과 내부 및 외부 IP 주소가 표시된 것 확인 후
해당 머신의 외부 IP 주소를 ping 할 수 있는지 확인 - 콘솔에서 Compute Engine 서비스로 이동하여 방금 만든 VM을 확인한 후
SSH를 클릭하여 방화벽 규칙이 작동하는지 확인한 다음 SSH 세션을 종료
- Terraform을 사용하여 사설 네트워크 만들기 (링크 파일 사용)
- 공용 네트워크의 구성을 가이드로 사용하고 두 번째 개인 네트워크를 만듦
variables.tf 파일에서 프라이빗 서브넷 IP CIDR 범위에 대한 변수를 추가하고 terraform.tfvars 파일에서 값을 설정
# define subnet for private network variable "subnet_cidr_private" { type = string description = "Subnet CIDR for Private Network" }
# GCP Network Variables subnet_cidr_public = "10.1.1.0/24" subnet_cidr_private = "10.2.2.0/24"
- vpc-network-public.tf 파일을 복제하고 이름과 변수를 적절하게 변경하여 vpc-network-private.tf 파일 생성
# create the Private VPC resource "google_compute_network" "private-vpc" { name = "private-vpc" auto_create_subnetworks = "false" routing_mode = "GLOBAL" } # create the private subnet resource "google_compute_subnetwork" "private-subnet_1" { name = "private-subnet-1" ip_cidr_range = var.subnet_cidr_private network = google_compute_network.private-vpc.name region = var.gcp_region_1 }
- 공용 방화벽 규칙을 가이드로 사용하여 개인 네트워크에 대한 방화벽 규칙을 vpc-firewall-rules-private.tf 파일 추가
source_ranges 섹션에서 모든 소스의 트래픽을 허용하지 말아야 하며 퍼블릭 서브넷 IP CIDR 범위의 트래픽만 허용
# allow ssh only from public subnet resource "google_compute_firewall" "private-allow-ssh" { name = "${google_compute_network.private-vpc.name}-allow-ssh" network = google_compute_network.private-vpc.name allow { protocol = "tcp" ports = ["22"] } source_ranges = [ "${var.subnet_cidr_public}" ] target_tags = ["allow-ssh"] } # allow rdp only from public subnet resource "google_compute_firewall" "private-allow-rdp" { name = "${google_compute_network.private-vpc.name}-allow-rdp" network = google_compute_network.private-vpc.name allow { protocol = "tcp" ports = ["3389"] } source_ranges = [ "${var.subnet_cidr_public}" ] target_tags = ["allow-rdp"] } # allow ping only from public subnet resource "google_compute_firewall" "private-allow-ping" { name = "${google_compute_network.private-vpc.name}-allow-ping" network = google_compute_network.private-vpc.name allow { protocol = "icmp" } source_ranges = [ "${var.subnet_cidr_public}" ] }
- 공용 서버를 가이드로 사용하여 사설 네트워크에 테스트 서버를 private-test-server-linux.tf 생성
# Create Test Server in Private VPC resource "google_compute_instance" "private-test-server-linux" { name = "private-test-server-linux-${random_id.instance_id.hex}" machine_type = "f1-micro" zone = var.gcp_zone_1 tags = ["allow-ssh"] boot_disk { initialize_params { image = "debian-cloud/debian-9" } } metadata_startup_script = "sudo apt-get update;" network_interface { network = google_compute_network.private-vpc.name subnetwork = google_compute_subnetwork.private-subnet_1.name access_config { } # Comment out this line to remove external IP address } } output "private-test-server-linux" { value = google_compute_instance.private-test-server-linux.name } output "private-test-server-linux-external-ip" { value = google_compute_instance.private-test-server-linux.network_interface.0.access_config.0.nat_ip } output "private-test-server-linux-internal-ip" { value = google_compute_instance.private-test-server-linux.network_interface.0.network_ip }
- 모든 것이 생성되면 공개 테스트 서버로 SSH를 시도
teraform init terraform plan terraform apply -auto-approve