version: 1
name: "google-web-server"
description: Provisions a Google Cloud VPC networking stack (network, subnet, firewall rules, static IP) with an e2-micro VM running an Apache web server.
providers:
- google
globals:
- name: project
description: google cloud project id
value: "{{ GOOGLE_PROJECT }}"
- name: region
value: "{{ GOOGLE_REGION }}"
- name: zone
value: "{{ GOOGLE_ZONE }}"
resources:
- name: example_network
props:
- name: vpc_name
value: "{{ stack_name }}-{{ stack_env }}-vpc"
exports:
- vpc_name
- vpc_link
- name: example_subnetwork
props:
- name: subnet_name
value: "{{ stack_name }}-{{ stack_env }}-{{ region }}-subnet"
- name: ip_cidr_range
values:
prd:
value: "10.0.0.0/24"
sit:
value: "10.1.0.0/24"
dev:
value: "10.2.0.0/24"
exports:
- subnet_name
- subnet_link
- name: example_firewall_http
file: firewalls.iql
props:
- name: fw_name
value: "{{ stack_name }}-{{ stack_env }}-allow-http"
- name: fw_direction
value: INGRESS
- name: fw_source_ranges
value: ["0.0.0.0/0"]
- name: fw_allowed
value: [{IPProtocol: tcp, ports: ["80"]}]
- name: example_firewall_ssh
file: firewalls.iql
props:
- name: fw_name
value: "{{ stack_name }}-{{ stack_env }}-allow-ssh"
- name: fw_direction
value: INGRESS
- name: fw_source_ranges
values:
prd:
value: ["10.0.0.0/24"]
sit:
value: ["10.1.0.0/24"]
dev:
value: ["0.0.0.0/0"]
- name: fw_allowed
value: [{IPProtocol: tcp, ports: ["22"]}]
- name: example_public_ip
props:
- name: address_name
value: "{{ stack_name }}-{{ stack_env }}-ip"
exports:
- address
- name: get_web_server_code
type: query
props:
- name: web_server_code
value: '<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Hello StackQL</title><style>body{font-family:Tahoma,sans-serif;display:flex;justify-content:center;align-items:center;height:100vh;margin:0;background-color:#f0f0f0;text-align:center;}p{font-size:2em;font-weight:bold;}</style></head><body><p>Hello, StackQL!</p></body></html>'
sql: |
SELECT '{{ web_server_code | base64_encode }}' as web_server_code_base64
exports:
- web_server_code_base64
- name: example_web_server
props:
- name: instance_name
value: "{{ stack_name }}-{{ stack_env }}-vm"
- name: machine_type
value: "https://compute.googleapis.com/compute/v1/projects/{{ project }}/zones/{{ zone }}/machineTypes/e2-micro"
- name: disks
value:
- autoDelete: true
boot: true
initializeParams:
diskSizeGb: 10
sourceImage: https://compute.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-12
mode: READ_WRITE
type: PERSISTENT
- name: network_interfaces
value:
- subnetwork: "{{ subnet_link }}"
accessConfigs:
- name: external-nat
type: ONE_TO_ONE_NAT
natIP: "{{ address }}"
- name: tags
value:
items:
- "{{ stack_name }}"
- http-server
- name: metadata
value:
items:
- key: startup-script
value: "#!/bin/bash\\napt-get update\\napt-get install -y apache2\\nsystemctl start apache2\\nsystemctl enable apache2\\necho {{ web_server_code_base64 }} | base64 -d > /var/www/html/index.html\\n"
exports:
- instance_name
- name: get_web_server_url
type: query
props: []
exports:
- web_server_url