terraform/main.tf (154 lines of code) (raw):
/**
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
# Enabling services in your GCP project
data "google_project" "project" {
project_id = var.project_id
}
resource "google_project_service" "all" {
for_each = toset(var.gcp_service_list)
project = data.google_project.project.number
service = each.key
disable_dependent_services = false
disable_on_destroy = false
}
data "google_compute_network" "default" {
project = var.project_id
name = "default"
depends_on = [google_project_service.all]
}
resource "google_compute_network" "main" {
provider = google-beta
name = "${var.basename}-network"
auto_create_subnetworks = true
project = var.project_id
depends_on = [google_project_service.all]
}
resource "google_compute_firewall" "default-allow-http" {
name = "deploystack-allow-http"
project = data.google_project.project.number
network = google_compute_network.main.name
allow {
protocol = "tcp"
ports = ["80"]
}
source_ranges = ["0.0.0.0/0"]
target_tags = ["http-server"]
depends_on = [google_project_service.all]
}
resource "google_compute_firewall" "default-allow-internal" {
name = "deploystack-allow-internal"
project = data.google_project.project.number
network = google_compute_network.main.name
allow {
protocol = "tcp"
ports = ["0-65535"]
}
allow {
protocol = "udp"
ports = ["0-65535"]
}
allow {
protocol = "icmp"
}
source_ranges = ["10.128.0.0/20"]
depends_on = [google_project_service.all]
}
resource "google_compute_firewall" "default-allow-ssh" {
name = "deploystack-allow-ssh"
project = data.google_project.project.number
network = google_compute_network.main.name
allow {
protocol = "tcp"
ports = ["22"]
}
source_ranges = ["0.0.0.0/0"]
target_tags = ["ssh-server"]
depends_on = [google_project_service.all]
}
# Create Instances
resource "google_compute_instance" "server" {
name = "server"
zone = var.zone
project = var.project_id
machine_type = "e2-standard-2"
tags = ["ssh-server", "http-server"]
allow_stopping_for_update = true
boot_disk {
auto_delete = true
device_name = "server"
initialize_params {
image = "family/ubuntu-2004-lts"
size = 10
type = "pd-standard"
}
}
network_interface {
network = google_compute_network.main.name
access_config {
// Ephemeral public IP
}
}
service_account {
scopes = ["https://www.googleapis.com/auth/logging.write"]
}
metadata_startup_script = <<SCRIPT
apt-get update
apt-get install -y mongodb
service mongodb stop
sed -i 's/bind_ip = 127.0.0.1/bind_ip = 0.0.0.0/' /etc/mongodb.conf
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 27017
service mongodb start
SCRIPT
depends_on = [google_project_service.all]
}
resource "google_compute_instance" "client" {
name = "client"
zone = var.zone
project = var.project_id
machine_type = "e2-standard-2"
tags = ["http-server", "https-server", "ssh-server"]
allow_stopping_for_update = true
boot_disk {
auto_delete = true
device_name = "client"
initialize_params {
image = "family/ubuntu-2004-lts"
size = 10
type = "pd-standard"
}
}
service_account {
scopes = ["https://www.googleapis.com/auth/logging.write"]
}
network_interface {
network = google_compute_network.main.name
access_config {
// Ephemeral public IP
}
}
metadata_startup_script = <<SCRIPT
add-apt-repository ppa:longsleep/golang-backports -y && \
apt update -y && \
apt install golang-go git -y
mkdir /modcache
mkdir /go
mkdir /app && cd /app
git clone https://github.com/GoogleCloudPlatform/deploystack-nosql-client-server.git
cd /app/deploystack-nosql-client-server/code/client
GOPATH=/go GOMODCACHE=/modcache GOCACHE=/modcache go build -o trainers main.go model.go
echo "GOPATH=/go GOMODCACHE=/modcache GOCACHE=/modcache DBHOST=${google_compute_instance.server.network_interface.0.network_ip} ./trainers"
GOPATH=/go GOMODCACHE=/modcache GOCACHE=/modcache DBHOST=${google_compute_instance.server.network_interface.0.network_ip} ./trainers &
SCRIPT
depends_on = [google_project_service.all]
}