목표 :
GCP에서 On-premise와 HA VPN연결 후 테스트할 부분이 많습니다.
On-premise to GCP간 VPN연결은 On-premise장비나 오픈소스를 이용해 설치하고 테스트 해야됩니다.
하여, gcloud CLI로 VPC와 subnet을 확인하고, 기존 것을 사용하거나 신규로 사용할 변수명을 입력받아 terrform 파일을 생성합니다.
그리고 main.tf, variables.tf, terraform.tfvars 파일을 생성하여 둡니다.
terrform apply 실행까지 이어서 진행되므로 바로 VPN구성 후 테스트가 가능합니다.
테스트가 끝난 후에는 terraform destroy -auto-approve 명령을 통해 리소스 삭제를 하면 됩니다.
소스코드 / 각 진행사항별 변수 입력방안 순서대로 설명합니다.
- 쉘스크립트 코드
#!/bin/bash
# ==============================================================================
# GCP VPC-to-VPC HA VPN 자동 생성 스크립트 (v3)
#
# 기능:
# 1. 'gcloud' 확인
# 2. 'terraform' 확인 및 미설치 시 자동 설치 기능 추가 (sudo 권한 필요)
# 3. 프로젝트 ID 및 리전 확인
# 4. VPC 1, Subnet 1 설정 (기존 리소스 목록 표시 및 신규/선택)
# 5. VPC 2, Subnet 2 설정 (기존 리소스 목록 표시 및 신규/선택)
# 6. BGP ASN 설정
# 7. 'main.tf', 'variables.tf', 'terraform.tfvars' 파일 자동 생성
# 8. 'terraform init' 및 'terraform apply' 자동 실행 (apply 취소 시 재시도)
# ==============================================================================
# --- 색상 정의 (출력용) ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${BLUE}=== GCP HA VPN 생성 스크립트 시작 ===${NC}"
# --- 1. 종속성 확인 ---
echo -e "\n${YELLOW}[1/7] 종속성 확인 중...${NC}"
# gcloud 확인
if ! command -v gcloud &> /dev/null; then
echo -e "${RED}오류: 'gcloud' CLI가 설치되어 있지 않습니다.${NC}"
echo "Cloud Shell을 사용하거나 https://cloud.google.com/sdk/docs/install 에서 설치하세요."
exit 1
fi
# terraform 확인 (자동 설치 기능 추가)
if ! command -v terraform &> /dev/null; then
echo -e "${YELLOW}Terraform이 설치되어 있지 않습니다.${NC}"
read -p "지금 Terraform을 자동으로 설치하시겠습니까? (y/n) [y]: " INSTALL_TF
INSTALL_TF=${INSTALL_TF:-y}
if [[ "$INSTALL_TF" == "y" || "$INSTALL_TF" == "Y" ]]; then
echo "Terraform 설치를 시작합니다... (sudo 권한 필요)"
# 1. 필수 패키지 설치
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
if [ $? -ne 0 ]; then echo -e "${RED}필수 패키지 설치에 실패했습니다.${NC}"; exit 1; fi
# 2. HashiCorp GPG 키 추가
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null
if [ $? -ne 0 ]; then echo -e "${RED}GPG 키 추가에 실패했습니다.${NC}"; exit 1; fi
# 3. HashiCorp 저장소 추가
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
if [ $? -ne 0 ]; then echo -e "${RED}APT 저장소 추가에 실패했습니다.${NC}"; exit 1; fi
# 4. Terraform 설치
sudo apt-get update
sudo apt-get install terraform
if [ $? -ne 0 ]; then echo -e "${RED}Terraform 설치에 실패했습니다.${NC}"; exit 1; fi
echo -e "${GREEN}Terraform 설치가 완료되었습니다.${NC}"
terraform --version
else
echo -e "${RED}Terraform 설치가 취소되었습니다. 스크립트를 종료합니다.${NC}"
exit 1
fi
fi
echo -e "${GREEN}gcloud 및 terraform이 확인되었습니다.${NC}"
# --- 2. 기본 정보 입력 ---
echo -e "\n${YELLOW}[2/7] 기본 정보 설정${NC}"
# 프로젝트 ID
PROJECT_ID_DEFAULT=$(gcloud config get-value project)
read -p "사용할 GCP Project ID [${PROJECT_ID_DEFAULT}]: " PROJECT_ID
PROJECT_ID=${PROJECT_ID:-$PROJECT_ID_DEFAULT}
# 리전
REGION_DEFAULT=$(gcloud config get-value compute/region 2>/dev/null)
[ -z "$REGION_DEFAULT" ] && REGION_DEFAULT="asia-northeast3" # 기본값 (서울)
read -p "리소스를 생성할 리전 [${REGION_DEFAULT}]: " REGION
REGION=${REGION:-$REGION_DEFAULT}
gcloud config set project $PROJECT_ID
echo -e "${GREEN}Project: $PROJECT_ID, Region: $REGION 으로 설정되었습니다.${NC}"
# --- 3. VPC 1 / Subnet 1 설정 ---
echo -e "\n${YELLOW}[3/7] VPC 1 및 서브넷 설정${NC}"
echo "--- 사용 가능한 VPC 목록 ---"
gcloud compute networks list --project=$PROJECT_ID --format="table(name, SUBNET_MODE)"
echo "--------------------------"
read -p "VPC 1을(를) 새로 생성하시겠습니까? (y/n) [y]: " CREATE_VPC1_CHOICE
CREATE_VPC1_CHOICE=${CREATE_VPC1_CHOICE:-y}
if [[ "$CREATE_VPC1_CHOICE" == "n" || "$CREATE_VPC1_CHOICE" == "N" ]]; then
CREATE_VPC1="false"
read -p "사용할 기존 VPC 1의 이름을 입력하세요: " VPC1_NAME
else
CREATE_VPC1="true"
read -p "새 VPC 1의 이름을 입력하세요 [vpn-vpc-1]: " VPC1_NAME
VPC1_NAME=${VPC1_NAME:-vpn-vpc-1}
fi
echo -e "\n--- '$VPC1_NAME'의 서브넷 목록 (리전: $REGION) ---"
gcloud compute networks subnets list --project=$PROJECT_ID --network=$VPC1_NAME --filter="region:($REGION)" --format="table(name, ipCidrRange)" 2>/dev/null
echo "------------------------------------------"
read -p "Subnet 1을(를) 새로 생성하시겠습니까? (y/n) [y]: " CREATE_SUBNET1_CHOICE
CREATE_SUBNET1_CHOICE=${CREATE_SUBNET1_CHOICE:-y}
if [[ "$CREATE_SUBNET1_CHOICE" == "n" || "$CREATE_SUBNET1_CHOICE" == "N" ]]; then
CREATE_SUBNET1="false"
read -p "사용할 기존 Subnet 1의 이름을 입력하세요: " VPC1_SUBNET_NAME
VPC1_SUBNET_CIDR="" # 기존 서브넷 사용 시 CIDR 값은 불필요
else
CREATE_SUBNET1="true"
read -p "새 Subnet 1의 이름을 입력하세요 [subnet-1]: " VPC1_SUBNET_NAME
VPC1_SUBNET_NAME=${VPC1_SUBNET_NAME:-subnet-1}
read -p "새 Subnet 1의 CIDR을 입력하세요 [10.1.0.0/24]: " VPC1_SUBNET_CIDR
VPC1_SUBNET_CIDR=${VPC1_SUBNET_CIDR:-10.1.0.0/24}
fi
# --- 4. VPC 2 / Subnet 2 설정 ---
echo -e "\n${YELLOW}[4/7] VPC 2 및 서브넷 설정${NC}"
echo "--- 사용 가능한 VPC 목록 ---"
gcloud compute networks list --project=$PROJECT_ID --format="table(name, SUBNET_MODE)"
echo "--------------------------"
read -p "VPC 2을(를) 새로 생성하시겠습니까? (y/n) [y]: " CREATE_VPC2_CHOICE
CREATE_VPC2_CHOICE=${CREATE_VPC2_CHOICE:-y}
if [[ "$CREATE_VPC2_CHOICE" == "n" || "$CREATE_VPC2_CHOICE" == "N" ]]; then
CREATE_VPC2="false"
read -p "사용할 기존 VPC 2의 이름을 입력하세요: " VPC2_NAME
else
CREATE_VPC2="true"
read -p "새 VPC 2의 이름을 입력하세요 [vpn-vpc-2]: " VPC2_NAME
VPC2_NAME=${VPC2_NAME:-vpn-vpc-2}
fi
echo -e "\n--- '$VPC2_NAME'의 서브넷 목록 (리전: $REGION) ---"
gcloud compute networks subnets list --project=$PROJECT_ID --network=$VPC2_NAME --filter="region:($REGION)" --format="table(name, ipCidrRange)" 2>/dev/null
echo "------------------------------------------"
read -p "Subnet 2을(를) 새로 생성하시겠습니까? (y/n) [y]: " CREATE_SUBNET2_CHOICE
CREATE_SUBNET2_CHOICE=${CREATE_SUBNET2_CHOICE:-y}
if [[ "$CREATE_SUBNET2_CHOICE" == "n" || "$CREATE_SUBNET2_CHOICE" == "N" ]]; then
CREATE_SUBNET2="false"
read -p "사용할 기존 Subnet 2의 이름을 입력하세요: " VPC2_SUBNET_NAME
VPC2_SUBNET_CIDR="" # 기존 서브넷 사용 시 CIDR 값은 불필요
else
CREATE_SUBNET2="true"
read -p "새 Subnet 2의 이름을 입력하세요 [subnet-2]: " VPC2_SUBNET_NAME
VPC2_SUBNET_NAME=${VPC2_SUBNET_NAME:-subnet-2}
read -p "새 Subnet 2의 CIDR을 입력하세요 [10.2.0.0/24]: " VPC2_SUBNET_CIDR
VPC2_SUBNET_CIDR=${VPC2_SUBNET_CIDR:-10.2.0.0/24}
fi
# --- 5. BGP 설정 ---
echo -e "\n${YELLOW}[5/7] BGP 설정${NC}"
read -p "Router 1의 BGP ASN (64512-65534) [64512]: " ROUTER1_ASN
ROUTER1_ASN=${ROUTER1_ASN:-64512}
read -p "Router 2의 BGP ASN (64512-65534) [64513]: " ROUTER2_ASN
ROUTER2_ASN=${ROUTER2_ASN:-64513}
# --- 6. Terraform 파일 생성 ---
echo -e "\n${YELLOW}[6/7] Terraform 파일 생성 중...${NC}"
# 6-1. variables.tf
cat <<EOF > variables.tf
# ------------------------------------------------------------------------------
# 기본 설정 (COMMON)
# ------------------------------------------------------------------------------
variable "project_id" {
type = string
description = "GCP 프로젝트 ID"
}
variable "region" {
type = string
description = "리소스를 생성할 리전"
}
# ------------------------------------------------------------------------------
# VPC 1 설정
# ------------------------------------------------------------------------------
variable "create_vpc1" {
type = bool
description = "true이면 vpc1을 새로 생성하고, false이면 기존 vpc1_name을 사용합니다."
}
variable "vpc1_name" {
type = string
description = "VPC 1의 이름 (신규 생성 시 이 이름으로, 기존 사용 시 이 이름의 VPC를 찾음)"
}
variable "create_subnet1" {
type = bool
description = "true이면 subnet1을 새로 생성하고, false이면 기존 vpc1_subnet_name을 사용합니다."
}
variable "vpc1_subnet_name" {
type = string
description = "VPC 1의 서브넷 이름"
}
variable "vpc1_subnet_cidr" {
type = string
description = "VPC 1의 서브넷 CIDR (신규 생성 시에만 사용)"
}
# ------------------------------------------------------------------------------
# VPC 2 설정
# ------------------------------------------------------------------------------
variable "create_vpc2" {
type = bool
description = "true이면 vpc2를 새로 생성하고, false이면 기존 vpc2_name을 사용합니다."
}
variable "vpc2_name" {
type = string
description = "VPC 2의 이름"
}
variable "create_subnet2" {
type = bool
description = "true이면 subnet2를 새로 생성하고, false이면 기존 vpc2_subnet_name을 사용합니다."
}
variable "vpc2_subnet_name" {
type = string
description = "VPC 2의 서브넷 이름"
}
variable "vpc2_subnet_cidr" {
type = string
description = "VPC 2의 서브넷 CIDR (신규 생성 시에만 사용)"
}
# ------------------------------------------------------------------------------
# VPN 설정 (BGP)
# ------------------------------------------------------------------------------
variable "router1_asn" {
type = number
description = "VPC 1 쪽 Cloud Router의 BGP ASN (64512-65534 또는 4200000000-4294967294)"
}
variable "router2_asn" {
type = number
description = "VPC 2 쪽 Cloud Router의 BGP ASN"
}
EOF
echo "variables.tf 생성 완료."
# 6-2. main.tf
cat <<EOF > main.tf
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "~> 5.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.0"
}
}
}
provider "google" {
project = var.project_id
region = var.region
}
provider "random" {}
# ------------------------------------------------------------------------------
# VPC 1 리소스 (신규 생성 또는 데이터 조회)
# ------------------------------------------------------------------------------
# var.create_vpc1이 true이면 새로 생성
resource "google_compute_network" "vpc1" {
count = var.create_vpc1 ? 1 : 0
name = var.vpc1_name
auto_create_subnetworks = false
routing_mode = "GLOBAL"
}
# var.create_vpc1이 false이면 기존 VPC 조회
data "google_compute_network" "vpc1" {
count = var.create_vpc1 ? 0 : 1
name = var.vpc1_name
project = var.project_id
}
# VPC 1의 최종 self_link를 결정 (생성된 리소스 또는 조회된 데이터)
locals {
vpc1_link = var.create_vpc1 ? google_compute_network.vpc1[0].self_link : data.google_compute_network.vpc1[0].self_link
}
# VPC 1의 서브넷 (신규 생성 또는 데이터 조회)
resource "google_compute_subnetwork" "subnet1" {
count = var.create_subnet1 ? 1 : 0
name = var.vpc1_subnet_name
ip_cidr_range = var.vpc1_subnet_cidr
network = local.vpc1_link
region = var.region
}
data "google_compute_subnetwork" "subnet1" {
count = var.create_subnet1 ? 0 : 1
name = var.vpc1_subnet_name
region = var.region
project = var.project_id
}
# VPC 1 서브넷의 최종 CIDR 결정
locals {
subnet1_cidr = var.create_subnet1 ? google_compute_subnetwork.subnet1[0].ip_cidr_range : data.google_compute_subnetwork.subnet1[0].ip_cidr_range
}
# ------------------------------------------------------------------------------
# VPC 2 리소스 (VPC 1과 동일한 로직)
# ------------------------------------------------------------------------------
resource "google_compute_network" "vpc2" {
count = var.create_vpc2 ? 1 : 0
name = var.vpc2_name
auto_create_subnetworks = false
routing_mode = "GLOBAL"
}
data "google_compute_network" "vpc2" {
count = var.create_vpc2 ? 0 : 1
name = var.vpc2_name
project = var.project_id
}
locals {
vpc2_link = var.create_vpc2 ? google_compute_network.vpc2[0].self_link : data.google_compute_network.vpc2[0].self_link
}
resource "google_compute_subnetwork" "subnet2" {
count = var.create_subnet2 ? 1 : 0
name = var.vpc2_subnet_name
ip_cidr_range = var.vpc2_subnet_cidr
network = local.vpc2_link
region = var.region
}
data "google_compute_subnetwork" "subnet2" {
count = var.create_subnet2 ? 0 : 1
name = var.vpc2_subnet_name
region = var.region
project = var.project_id
}
locals {
subnet2_cidr = var.create_subnet2 ? google_compute_subnetwork.subnet2[0].ip_cidr_range : data.google_compute_subnetwork.subnet2[0].ip_cidr_range
}
# ------------------------------------------------------------------------------
# 방화벽 규칙: 각 VPC가 상대방 서브넷과 통신(ICMP, TCP, UDP)할 수 있도록 허용
# ------------------------------------------------------------------------------
resource "google_compute_firewall" "allow_vpc1_ingress" {
name = "fw-allow-from-\${var.vpc2_name}"
network = local.vpc1_link
allow {
protocol = "all"
}
source_ranges = [local.subnet2_cidr]
}
resource "google_compute_firewall" "allow_vpc2_ingress" {
name = "fw-allow-from-\${var.vpc1_name}"
network = local.vpc2_link
allow {
protocol = "all"
}
source_ranges = [local.subnet1_cidr]
}
# ------------------------------------------------------------------------------
# HA VPN 생성
# ------------------------------------------------------------------------------
# VPN 터널용 공유 비밀키 생성
resource "random_string" "shared_secret_1" {
length = 24
special = true
}
resource "random_string" "shared_secret_2" {
length = 24
special = true
}
# VPC 1용 HA VPN 게이트웨이
resource "google_compute_ha_vpn_gateway" "gw1" {
name = "\${var.vpc1_name}-ha-gw"
network = local.vpc1_link
region = var.region
}
# VPC 2용 HA VPN 게이트웨이
resource "google_compute_ha_vpn_gateway" "gw2" {
name = "\${var.vpc2_name}-ha-gw"
network = local.vpc2_link
region = var.region
}
# VPC 1용 Cloud Router
resource "google_compute_router" "router1" {
name = "\${var.vpc1_name}-router"
network = local.vpc1_link
region = var.region
bgp {
asn = var.router1_asn
}
}
# VPC 2용 Cloud Router
resource "google_compute_router" "router2" {
name = "\${var.vpc2_name}-router"
network = local.vpc2_link
region = var.region
bgp {
asn = var.router2_asn
}
}
# ----------------- 터널 4개 생성 (GCP-GCP HA VPN 표준) -----------------
# 터널 1-0 (GW1 if0 <-> GW2 if0)
resource "google_compute_vpn_tunnel" "tunnel1_0" {
name = "tunnel-1-0"
region = var.region
vpn_gateway = google_compute_ha_vpn_gateway.gw1.self_link
peer_gcp_gateway = google_compute_ha_vpn_gateway.gw2.self_link
shared_secret = random_string.shared_secret_1.result
router = google_compute_router.router1.self_link
vpn_gateway_interface = 0
}
# 터널 1-1 (GW1 if1 <-> GW2 if1)
resource "google_compute_vpn_tunnel" "tunnel1_1" {
name = "tunnel-1-1"
region = var.region
vpn_gateway = google_compute_ha_vpn_gateway.gw1.self_link
peer_gcp_gateway = google_compute_ha_vpn_gateway.gw2.self_link
shared_secret = random_string.shared_secret_2.result
router = google_compute_router.router1.self_link
vpn_gateway_interface = 1
}
# 터널 2-0 (GW2 if0 <-> GW1 if0)
resource "google_compute_vpn_tunnel" "tunnel2_0" {
name = "tunnel-2-0"
region = var.region
vpn_gateway = google_compute_ha_vpn_gateway.gw2.self_link
peer_gcp_gateway = google_compute_ha_vpn_gateway.gw1.self_link
shared_secret = random_string.shared_secret_1.result # 1-0과 동일
router = google_compute_router.router2.self_link
vpn_gateway_interface = 0
}
# 터널 2-1 (GW2 if1 <-> GW1 if1)
resource "google_compute_vpn_tunnel" "tunnel2_1" {
name = "tunnel-2-1"
region = var.region
vpn_gateway = google_compute_ha_vpn_gateway.gw2.self_link
peer_gcp_gateway = google_compute_ha_vpn_gateway.gw1.self_link
shared_secret = random_string.shared_secret_2.result # 1-1과 동일
router = google_compute_router.router2.self_link
vpn_gateway_interface = 1
}
# ----------------- BGP 설정 (라우터 인터페이스 및 피어) -----------------
# Router 1 BGP 설정
resource "google_compute_router_interface" "if1_0" {
name = "if-tunnel-1-0"
router = google_compute_router.router1.name
region = var.region
ip_range = "169.254.1.1/30" # BGP용 Link-local IP
vpn_tunnel = google_compute_vpn_tunnel.tunnel1_0.name
}
resource "google_compute_router_peer" "peer1_0" {
name = "peer-tunnel-1-0"
router = google_compute_router.router1.name
region = var.region
peer_ip_address = "169.254.1.2" # 상대방(Router 2) BGP IP
peer_asn = var.router2_asn
interface = google_compute_router_interface.if1_0.name
}
resource "google_compute_router_interface" "if1_1" {
name = "if-tunnel-1-1"
router = google_compute_router.router1.name
region = var.region
ip_range = "169.254.2.1/30"
vpn_tunnel = google_compute_vpn_tunnel.tunnel1_1.name
}
resource "google_compute_router_peer" "peer1_1" {
name = "peer-tunnel-1-1"
router = google_compute_router.router1.name
region = var.region
peer_ip_address = "169.254.2.2"
peer_asn = var.router2_asn
interface = google_compute_router_interface.if1_1.name
}
# Router 2 BGP 설정
resource "google_compute_router_interface" "if2_0" {
name = "if-tunnel-2-0"
router = google_compute_router.router2.name
region = var.region
ip_range = "169.254.1.2/30" # Router 1의 peer_ip_address와 일치
vpn_tunnel = google_compute_vpn_tunnel.tunnel2_0.name
}
resource "google_compute_router_peer" "peer2_0" {
name = "peer-tunnel-2-0"
router = google_compute_router.router2.name
region = var.region
peer_ip_address = "169.254.1.1" # Router 1의 BGP IP
peer_asn = var.router1_asn
interface = google_compute_router_interface.if2_0.name
}
resource "google_compute_router_interface" "if2_1" {
name = "if-tunnel-2-1"
router = google_compute_router.router2.name
region = var.region
ip_range = "169.254.2.2/30"
vpn_tunnel = google_compute_vpn_tunnel.tunnel2_1.name
}
resource "google_compute_router_peer" "peer2_1" {
name = "peer-tunnel-2-1"
router = google_compute_router.router2.name
region = var.region
peer_ip_address = "169.254.2.1"
peer_asn = var.router1_asn
interface = google_compute_router_interface.if2_1.name
}
EOF
echo "main.tf 생성 완료."
# 6-3. terraform.tfvars (대화형 입력 기반으로 생성)
cat <<EOF > terraform.tfvars
project_id = "$PROJECT_ID"
region = "$REGION"
create_vpc1 = $CREATE_VPC1
vpc1_name = "$VPC1_NAME"
create_subnet1 = $CREATE_SUBNET1
vpc1_subnet_name = "$VPC1_SUBNET_NAME"
vpc1_subnet_cidr = "$VPC1_SUBNET_CIDR"
create_vpc2 = $CREATE_VPC2
vpc2_name = "$VPC2_NAME"
create_subnet2 = $CREATE_SUBNET2
vpc2_subnet_name = "$VPC2_SUBNET_NAME"
vpc2_subnet_cidr = "$VPC2_SUBNET_CIDR"
router1_asn = $ROUTER1_ASN
router2_asn = $ROUTER2_ASN
EOF
echo -e "${GREEN}terraform.tfvars 생성 완료.${NC}"
# --- 7. Terraform 실행 ---
echo -e "\n${YELLOW}[7/7] Terraform 실행${NC}"
echo "Terraform 초기화 ('terraform init')..."
terraform init
if [ $? -ne 0 ]; then
echo -e "${RED}오류: Terraform 초기화에 실패했습니다.${NC}"
exit 1
fi
# Terraform apply를 위한 반복 루프
while true; do
echo -e "\nTerraform 적용 ('terraform apply')..."
echo "생성될 리소스를 확인하고 ${YELLOW}yes${NC}를 입력하여 승인하세요."
terraform apply
# apply의 성공 여부 확인
if [ $? -eq 0 ]; then
echo -e "\n${GREEN}=== HA VPN 구성이 성공적으로 완료되었습니다. ===${NC}"
echo "테스트가 완료되면, 리소스 삭제를 잊지 마세요."
echo -e "리소스 삭제 명령어: ${YELLOW}terraform destroy -auto-approve${NC}"
break # 성공 시 루프 탈출
else
# 실패 또는 'yes' 이외의 입력으로 취소된 경우
echo -e "\n${YELLOW}Terraform 적용이 취소되었거나 오류가 발생했습니다.${NC}"
read -p "다시 시도하시겠습니까? (y/n) [y]: " RETRY_CHOICE
RETRY_CHOICE=${RETRY_CHOICE:-y}
if [[ "$RETRY_CHOICE" == "n" || "$RETRY_CHOICE" == "N" ]]; then
echo -e "\n${RED}=== Terraform 적용에 실패했습니다. ===${NC}"
echo "오류 메시지를 확인하고 'main.tf' 또는 'terraform.tfvars' 파일을 수정하세요."
break # 사용자가 취소를 선택, 루프 탈출
fi
# 'y' 또는 Enter를 누르면 루프가 다시 시작되어 terraform apply 재실행
fi
done
- 스크립트 설치시작
테라폼이 설치 되었는지 부터 확인합니다.
테라폼이 없으면 설치를 진행합니다.
Gcloud 명령어를 통해 기존 VPC목록과 Subnet을 보여줍니다.
새로 생성에 "Y"를 누르면 신규 생성할 이름을 받고 테라폼에 변수로 넣어 신규 생성하게 됩니다.
그외 BGP ASN등을 물어보나 기본적으로 64512, 64513으로 해두었으니 그냥 넘어가도 됩니다.
이후 테라폼 파일들 (variables.tf, main.tf)들을 생성하고 terraform init을 통해 초기화합니다.
모든 변수 값을 입력 받고, 테라폼 초기화까지 끝나면 "terraform apply"을 통해 리소스 생성을 진행합니다.
최종적으로 리소스 생성이 완료되며, 테스트 후 리소스 삭제 할 수있도록 "terraform destroy -auto-approve" 명령어를 추가하였습니다.
해당 스크립트는 gcloud를 통해 기존 VPC, Subnet을 조회하고 변수 값들을 입력받아 terraform 파일을 만들어서 실행하는 스크립트입니다.
이후에는 해당디렉토리에서 terraform apply통해 리소스를 바로 만들 수도 있습니다.
'Cloud > GCP' 카테고리의 다른 글
GCP 의 PSC 사용시 On-Premise DNS 설정방안 (0) | 2025.10.10 |
---|---|
GCP 프로젝트의 VPC 와 종속된 리소스 삭제 스크립트 (1) | 2025.09.18 |
Gemini CLI 인증 방안에 따른 차이점 (2) | 2025.08.25 |
Google Calendar 기반 GCE(VM) Managed Instance Group 오토스케일 자동화 (4) | 2025.08.18 |
GCP VPN과 PSC를 통한 Vertex AI (Gemini-API) Private 연결 가이드 (2) | 2025.08.12 |
Slack 기반 GCE Managed Instance Group 오토스케일링 자동화 구축 가이드 (Pub/Sub 연동, 상태 알림 포함) (4) | 2025.08.08 |
GCP 프로젝트 로그 분석 리포트 생성 자동화하기 – n8n, AI Agent, Gemini, MCP Server (GCP) (4) | 2025.07.31 |