< Lab >
Lab into : Using Terraform to Create Clients and Servers
실습: Terraform을 사용하여 클라이언트 및 서버 만들기
- Terraform을 사용해 공용 및 사설 네트워크 모두에서 클라이언트 및 서버 VM을 생성
- 서로 통신할 수 있도록 이들 간의 통신을 설정
Using Terraform to Create Clients and Servers
Terraform을 사용하여 클라이언트 및 서버 만들기
- 클라이언트 및 서버 VM 만들기
(데이터베이스 서버 역할을 하기 위해 사설 네트워크에 Linux 가상 머신을 프로비저닝하고
관리자로 데이터베이스 서버에 연결하기 위한 배스천 호스트로 사용할 수 있는 가상 머신을 생성)
- Project info에서 프로젝트 ID를 복사
+) 프로젝트 ID : qwiklabs-gcp-04-017a6df4c63a - 클라우드 쉘을 열어서 실습의 완료된 버전이 포함된 GitHub 리포지토리를 복제 후 폴더 변경
git clone https://github.com/GoogleCloudPlatform/training-data-analyst cd ~/training-data-analyst/courses/db-migration/terraform-clients-servers/
- 이 폴더에 마지막 실습에서 완료된 Terraform 파일이 있는 것 확인
ls
- Open Editor를 클릭해 terraform.tfvars 파일을 열어 project_id 변수를 프로젝트의 ID와 일치하도록 변경
# GCP Settings project_id = "qwiklabs-gcp-04-017a6df4c63a" gcp_region_1 = "us-central1" gcp_zone_1 = "us-central1-a" # GCP Network Variables subnet_cidr_public = "10.1.1.0/24" subnet_cidr_private = "10.2.2.0/24"
- 사설 네트워크에 Debian Linux 머신을 생성하기 위해 vm-mysql-server.tf라는 파일에 Terraform 코드를 추가
# Create a MySQL Server in Private VPC resource "google_compute_instance" "mysql-server" { name = "mysql-server-${random_id.instance_id.hex}" machine_type = "f1-micro" zone = var.gcp_zone_1 tags = ["allow-ssh", "allow-mysql"] boot_disk { initialize_params { image = "debian-cloud/debian-9" } } network_interface { network = google_compute_network.private-vpc.name subnetwork = google_compute_subnetwork.private-subnet_1.name # access_config { } } } output "mysql-server" { value = google_compute_instance.mysql-server.name } output "mysql-server-external-ip" { value = "NONE" } output "mysql-server-internal-ip" { value = google_compute_instance.mysql-server.network_interface.0.network_ip }
- 해당 서버를 관리하는 데 사용하는 공용 네트워크에 시스템을 만들기 위해 vm-mysql-client.tf 파일에 Terraform 코드를 추가
이 서버는 공용 네트워크에 있으므로 SSH로 연결할 수 있음
# Create MySQL Client in Public VPC resource "google_compute_instance" "mysql-client" { name = "mysql-client-${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" } } network_interface { network = google_compute_network.public-vpc.name subnetwork = google_compute_subnetwork.public-subnet_1.name access_config { } } } output "mysql-client" { value = google_compute_instance.mysql-client.name } output "mysql-client-external-ip" { value = google_compute_instance.mysql-client.network_interface.0.access_config.0.nat_ip } output "mysql-client-internal-ip" { value = google_compute_instance.mysql-client.network_interface.0.network_ip }
- 공용 네트워크에서 MySQL 서버로의 통신을 허용하는 방화벽 규칙을 생성하기 위해
vpc-firewall-rules-private.tf 파일 끝에 Terraform 코드를 추가
# allow MySQL only from public subnet resource "google_compute_firewall" "private-allow-mysql" { name = "${google_compute_network.private-vpc.name}-allow-mysql" network = google_compute_network.private-vpc.name allow { protocol = "tcp" ports = ["3306"] } source_ranges = [ "${var.subnet_cidr_public}" ] target_tags = ["allow-mysql"] }
- Terraform을 초기화하고 계획을 생성
terraform init terraform plan
- 리소스를 생성
terraform apply -auto-approve
- 데이터베이스 서버 관리 (원격 연결을 위해 데이터베이스 서버를 구성하고 사용자 계정을 추가)
- 콘솔에서 Compute Engine을 클릭해 머신이 나열된 것 확인
- mysql-server- 머신을 찾고 내부 IP 주소를 기록해둠
+) 내부 IP 주소 : 10.2.2.3 - mysql-client- 머신을 찾고 해당 머신에 SSH 연결
- 클라이언트에 연결되면 해당 컴퓨터에서 서버로 SSH를 수행하여 IP 주소가 올바른지 확인
ssh 10.2.2.3
- 인터넷에 액세스하려고 할 때 실패하는 것을 확인 후 Ctrl + c를 입력해 명령을 종료
sudo apt install -y mysql-server
- 콘솔에서 네트워크 서비스 - Cloud NAT 클릭 후 시작하기를 눌러 NAT 생성할 수 있으나
Terrafor에서 이 작업을 수행하기 위해 취소 - 클라우드 쉘에서 cloud-nat.tf 파일을 추가하고 Terraform 코드를 추가
resource "google_compute_router" "nat-router" { name = "nat-router" region = google_compute_subnetwork.private-subnet_1.region network = google_compute_network.private-vpc.id bgp { asn = 64514 } } resource "google_compute_router_nat" "private-nat" { name = "private-nat" router = google_compute_router.nat-router.name region = google_compute_router.nat-router.region nat_ip_allocate_option = "AUTO_ONLY" source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES" log_config { enable = true filter = "ERRORS_ONLY" } }
- 오류가 없는지 확인 후 NAT를 생성
terraform plan terraform apply -auto-approve
- MySQL 서버에 연결된 SSH창으로 돌아가 MySQL 재설치시 제대로 동작하는 것 확인 가능
sudo apt-get update sudo apt-get install -y mysql-server
- MySQL이 실행 중인지 확인 및 루트 사용자 암호 생성 후 데이터베이스에 로그인
sudo systemctl status mysql sudo mysql_secure_installation sudo mysql -u root -p
- 클라이언트 시스템에서 로그인하기 위해 password라는 암호를 가진 fred 사용자 계정 생성 후 MySQL 클라이언트 종료
CREATE USER 'fred'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON * . * TO 'fred'@'%'; FLUSH PRIVILEGES; exit
- 기본적으로 데이터베이스 서버는 로컬 시스템의 연결만 수신 대기하므로 구성 파일을 수정 후 Ctrl + x를 입력해 종료 후 저장
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf bind-address = 127.0.0.1 # 이를 주석 처리
- 데이터베이스를 다시 시작한 후 서버를 종료하고 클라이언트 VM으로 돌아감
sudo /etc/init.d/mysql restart exit
- 클라이언트에서 데이터베이스에 연결
(클라이언트 시스템에서 데이터베이스 서버에 연결하기 위해 MySQL 클라이언트 소프트웨어를 설치)
- 클라이언트 시스템에서 MySQL 데이터베이스에 연결
sudo apt-get update sudo apt-get install -y mysql-client
- 데이터베이스에 연결
mysql -h 10.2.2.3 -u fred -p'password'
- SSH 세션을 닫고 Cloud Shell 터미널로 돌아간 후 실습의 앞부분에서 생성한 모든 항목을 삭제
terraform destroy -auto-approve