Cloud/GCP

gcloud + shell script로 Windows VM 빠르게 생성하기

달빛궁전- 2025. 10. 23. 10:00
목표 : GCP에서 빠르게 Windows VM 생성
Cloud Shell에서 바로 실행하여 Windows VM을 생성하여 테스트에 사용하기 위함

 

- 스크립트 실행
VPC, Subnet, Zone, 머신타입을 입력받습니다.

- 방화벽 정책 생성

- VM생성

 

- 윈도우 사용자 및 비밀번호 설정

위 캡쳐에서는 VM생성시간이 오래걸려, 비밀번호 설정에 실패했습니다.
자동으로 패스워드 리셋 명령어를 출력하도록 했으며, “gcloud compute reset-windows-password vm명 --zone asia-northeast3-a --user admin” 실행하면 아래와 같이 IP, Passowrd, username이 리셋되어 출력됩니다.

 

 
  • 쉘스크립트
 
#!/bin/bash

# ==============================================================================
# GCP 윈도우(Windows) VM 생성 스크립트
#
# 기능:
# 1. 사용자로부터 VM 이름, 리전, VPC/서브넷 등 정보를 입력받습니다.
# 2. RDP(3389) 접속을 위한 방화벽 규칙을 생성합니다.
# 3. 윈도우 서버 VM(Desktop Experience)을 생성합니다.
# 4. VM의 관리자 비밀번호 설정을 안내하고 접속 정보를 출력합니다.
# ==============================================================================

# --- 색상 정의 (출력용) ---
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 윈도우 VM 생성 스크립트 시작 ===${NC}"

# --- 1. 기본 정보 입력 ---
echo -e "\n${YELLOW}[1/5] 윈도우 VM 정보 입력${NC}"

# 이전 VPN 테스트의 '온프레미스' VPC를 기본값으로 제안합니다.
read -p "VM을 생성할 VPC 이름 [vpn-vpc-2]: " VPC_NAME
VPC_NAME=${VPC_NAME:-vpn-vpc-2}

read -p "VM을 생성할 서브넷 이름 [subnet-2]: " SUBNET_NAME
SUBNET_NAME=${SUBNET_NAME:-subnet-2}

read -p "새 윈도우 VM의 이름 [windows-dev-vm]: " INSTANCE_NAME
INSTANCE_NAME=${INSTANCE_NAME:-windows-dev-vm}

read -p "VM을 생성할 Zone (예: asia-northeast3-a) [asia-northeast3-a]: " ZONE
ZONE=${ZONE:-asia-northeast3-a}

# 윈도우는 e2-medium보다 높은 사양이 권장됩니다.
read -p "VM의 머신 타입 [e2-standard-2]: " MACHINE_TYPE
MACHINE_TYPE=${MACHINE_TYPE:-e2-standard-2}

# --- 2. 윈도우 RDP 방화벽 설정 ---
echo -e "\n${YELLOW}[2/5] 윈도우 RDP 방화벽 설정${NC}"
echo "VM에 RDP(원격 데스크톱)로 접속하기 위해 방화벽(TCP:3389)을 설정합니다."
read -p "접속을 허용할 IP 주소 (본인의 공인 IP, 모르면 0.0.0.0/0) [0.0.0.0/0]: " SOURCE_IP
SOURCE_IP=${SOURCE_IP:-0.0.0.0/0}

if [ "$SOURCE_IP" == "0.0.0.0/0" ]; then
    echo -e "${YELLOW}경고: 모든 IP에서 RDP 접속을 허용합니다. 보안에 유의하세요.${NC}"
fi

FIREWALL_RULE_NAME="allow-rdp-${INSTANCE_NAME}"
RDP_TAG="rdp-access-${INSTANCE_NAME}"

echo "방화벽 규칙($FIREWALL_RULE_NAME)을 생성 중..."
gcloud compute firewall-rules create $FIREWALL_RULE_NAME \
    --network=$VPC_NAME \
    --action=ALLOW \
    --direction=INGRESS \
    --rules=tcp:3389 \
    --source-ranges=$SOURCE_IP \
    --target-tags=$RDP_TAG

if [ $? -ne 0 ]; then
    echo -e "${RED}오류: 방화벽 규칙 생성에 실패했습니다.${NC}"
    exit 1
fi
echo -e "${GREEN}방화벽 규칙 생성이 완료되었습니다.${NC}"

# --- 3. 윈도우 VM 생성 ---
echo -e "\n${YELLOW}[3/5] 윈도우 VM 생성${NC}"
echo "'$INSTANCE_NAME' VM 생성을 시작합니다. (시간이 몇 분 정도 소요될 수 있습니다)"

# 윈도우 서버 2022 (GUI 포함) 이미지를 사용합니다.
IMAGE_PROJECT="windows-cloud"
IMAGE_FAMILY="windows-2022" # 'core'가 아닌 GUI(Desktop Experience) 버전

gcloud compute instances create $INSTANCE_NAME \
    --zone=$ZONE \
    --machine-type=$MACHINE_TYPE \
    --network=$VPC_NAME \
    --subnet=$SUBNET_NAME \
    --image-project=$IMAGE_PROJECT \
    --image-family=$IMAGE_FAMILY \
    --boot-disk-size=50GB \
    --tags=$RDP_TAG

if [ $? -ne 0 ]; then
    echo -e "${RED}오류: 윈도우 VM 생성에 실패했습니다.${NC}"
    # 실패 시 방금 만든 방화벽 규칙 롤백
    gcloud compute firewall-rules delete $FIREWALL_RULE_NAME --quiet
    exit 1
fi
echo -e "${GREEN}VM 생성이 완료되었습니다.${NC}"

# --- 4. 윈도우 사용자 및 비밀번호 설정 ---
echo -e "\n${YELLOW}[4/5] 윈도우 사용자 및 비밀번호 설정${NC}"
read -p "윈도우 VM에서 사용할 사용자 이름을 입력하세요 [admin]: " USERNAME
USERNAME=${USERNAME:-admin}

echo -e "\n${RED}중요: 지금부터 윈도우 비밀번호 설정 프로세스를 시작합니다.${NC}"
echo "잠시 후 VM이 준비되면, 새 비밀번호가 화면에 출력됩니다."
echo "표시되는 ${GREEN}비밀번호를 즉시 복사하여 안전한 곳에 보관${NC}하세요!"
echo -e "${YELLOW}준비가 되었으면 Enter 키를 눌러 계속하세요...${NC}"
read -p ""

# 이 명령어는 대화형으로 비밀번호를 생성하고 보여줍니다.
gcloud compute reset-windows-password $INSTANCE_NAME \
    --zone=$ZONE \
    --user=$USERNAME

if [ $? -ne 0 ]; then
    echo -e "${RED}오류: 비밀번호 설정에 실패했습니다. VM이 아직 부팅 중일 수 있습니다.${NC}"
    echo "잠시 후 'gcloud compute reset-windows-password $INSTANCE_NAME --zone $ZONE --user $USERNAME' 명령어를 수동으로 실행해 보세요."
    exit 1
fi

echo -e "\n${GREEN}비밀번호 설정이 완료되었습니다.${NC} (화면에 표시된 비밀번호를 복사했는지 확인하세요)"

# --- 5. 접속 정보 안내 ---
echo -e "\n${YELLOW}[5/5] 접속 정보 안내${NC}"

# VM의 IP 주소 가져오기
echo "VM의 IP 주소를 조회 중입니다..."
EXTERNAL_IP=$(gcloud compute instances describe $INSTANCE_NAME --zone $ZONE --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
INTERNAL_IP=$(gcloud compute instances describe $INSTANCE_NAME --zone $ZONE --format='get(networkInterfaces[0].networkIP)')

echo -e "\n${GREEN}=== 윈도우 VM 설정이 성공적으로 완료되었습니다. ===${NC}"
echo "Windows 원격 데스크톱(RDP) 클라이언트를 사용하여 아래 정보로 접속하세요."
echo "-----------------------------------------------------"
echo -e "  - 공인 IP (External IP): ${YELLOW}$EXTERNAL_IP${NC}"
echo -e "  - 사용자 이름 (Username):   ${YELLOW}$USERNAME${NC}"
echo -e "  - 비밀번호 (Password):     ${YELLOW}(방금 전 화면에 표시된 비밀번호)${NC}"
echo "-----------------------------------------------------"
echo -e "  - 내부 IP (Internal IP): $INTERNAL_IP"
echo -e "  - RDP 방화벽 규칙: $FIREWALL_RULE_NAME"
echo -e "\n${RED}테스트가 완료되면, VM과 방화벽 규칙을 삭제하여 비용이 과금되지 않도록 하세요.${NC}"
echo -e "VM 삭제: ${YELLOW}gcloud compute instances delete $INSTANCE_NAME --zone $ZONE${NC}"
echo -e "방화벽 삭제: ${YELLOW}gcloud compute firewall-rules delete $FIREROW_RULE_NAME${NC}"