## TERRAFORM terraform { required_version = ">= 0.12" } ## PROVIDER provider "google" { project = var.gcp_project_id credentials = file(var.gcp_auth_file) region = var.gcp_region } ## NETWORK resource "google_compute_network" "vpc_network" { name = "my-custom-network" auto_create_subnetworks = false mtu = 1460 } resource "google_compute_subnetwork" "default" { name = "my-custom-subnet" ip_cidr_range = "10.0.1.0/24" region = var.gcp_region network = google_compute_network.vpc_network.id } # VM resource "google_compute_instance" "default" { name = "flask-vm" machine_type = "e2-micro" zone = var.gcp_zone tags = ["ssh"] boot_disk { initialize_params { image = "debian-cloud/debian-11" } } ## INSTALL FLASK metadata_startup_script = "sudo apt-get update; sudo apt-get install -yq build-essential python3-pip rsync; pip install flask" network_interface { subnetwork = google_compute_subnetwork.default.id access_config { # Include this section to give the VM an external IP address } } } ## FIREWALL ### SSH resource "google_compute_firewall" "ssh" { name = "allow-ssh" allow { ports = ["22"] protocol = "tcp" } direction = "INGRESS" network = google_compute_network.vpc_network.id priority = 1000 source_ranges = ["0.0.0.0/0"] target_tags = ["ssh"] } ### APP resource "google_compute_firewall" "flask" { name = "flask-app-firewall" network = google_compute_network.vpc_network.id allow { protocol = "tcp" ports = ["5000"] } source_ranges = ["0.0.0.0/0"] } ## GET VM PUBLIC IP output "Web-server-URL" { value = join("",["http://",google_compute_instance.default.network_interface.0.access_config.0.nat_ip,":5000"]) }