google_apphub_workload

Workload represents a binary deployment (such as Managed Instance Groups (MIGs), GKE deployments, etc.) that performs the smallest logical subset of business functionality. It registers identified workload to the Application.

Example Usage - Apphub Workload Basic

resource "google_apphub_application" "application" {
  location = "us-central1"
  application_id = "example-application-1"
  scope {
    type = "REGIONAL"
  }
}

resource "google_project" "service_project" {
  project_id ="project-1"
  name = "Service Project"
  org_id = "123456789"
  billing_account = "000000-0000000-0000000-000000"
}

# Enable Compute API
resource "google_project_service" "compute_service_project" {
  project = google_project.service_project.project_id
  service = "compute.googleapis.com"
}

resource "time_sleep" "wait_120s" {
  depends_on = [google_project_service.compute_service_project]

  create_duration = "120s"
}

resource "google_apphub_service_project_attachment" "service_project_attachment" {
  service_project_attachment_id = google_project.service_project.project_id
  depends_on = [time_sleep.wait_120s]
}


# Discovered workload
data "google_apphub_discovered_workload" "catalog-workload" {
  location = "us-central1"
  workload_uri = "${replace(google_compute_region_instance_group_manager.mig.instance_group, "https://www.googleapis.com/compute/v1", "//compute.googleapis.com")}"
  depends_on = [time_sleep.wait_120s_for_resource_ingestion]
}

resource "time_sleep" "wait_120s_for_resource_ingestion" {
  depends_on = [google_compute_region_instance_group_manager.mig]
  create_duration = "120s"
}

resource "google_apphub_workload" "example" {
  location = "us-central1"
  application_id = google_apphub_application.application.application_id
  workload_id = google_compute_region_instance_group_manager.mig.name
  discovered_workload = data.google_apphub_discovered_workload.catalog-workload.name
}

#Workload creation


# VPC network
resource "google_compute_network" "ilb_network" {
  name                    = "l7-ilb-network"
  project                 = google_project.service_project.project_id
  auto_create_subnetworks = false
  depends_on = [time_sleep.wait_120s]
}

# backend subnet
resource "google_compute_subnetwork" "ilb_subnet" {
  name          = "l7-ilb-subnet"
  project       = google_project.service_project.project_id
  ip_cidr_range = "10.0.1.0/24"
  region        = "us-central1"
  network       = google_compute_network.ilb_network.id
}

# instance template
resource "google_compute_instance_template" "instance_template" {
  name         = "l7-ilb-mig-template"
  project      = google_project.service_project.project_id
  machine_type = "e2-small"
  tags         = ["http-server"]
  network_interface {
    network    = google_compute_network.ilb_network.id
    subnetwork = google_compute_subnetwork.ilb_subnet.id
    access_config {
      # add external ip to fetch packages
    }
  }
  disk {
    source_image = "debian-cloud/debian-10"
    auto_delete  = true
    boot         = true
  }
  # install nginx and serve a simple web page
  metadata = {
    startup-script = <<-EOF1
      #! /bin/bash
      set -euo pipefail
      export DEBIAN_FRONTEND=noninteractive
      apt-get update
      apt-get install -y nginx-light jq
      NAME=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/hostname")
      IP=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip")
      METADATA=$(curl -f -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=True" | jq 'del(.["startup-script"])')
      cat <<EOF > /var/www/html/index.html
      <pre>
      Name: $NAME
      IP: $IP
      Metadata: $METADATA
      </pre>
      EOF
    EOF1
  }
  lifecycle {
    create_before_destroy = true
  }
}

resource "google_compute_region_instance_group_manager" "mig" {
  name     = "l7-ilb-mig1"
  project  = google_project.service_project.project_id
  region   = "us-central1"
  version {
    instance_template = google_compute_instance_template.instance_template.id
    name              = "primary"
  }
  base_instance_name = "vm"
  target_size        = 2
}

Example Usage - Apphub Workload Full

resource "google_apphub_application" "application" {
  location = "us-central1"
  application_id = "example-application-1"
  scope {
    type = "REGIONAL"
  }
}

resource "google_project" "service_project" {
  project_id ="project-1"
  name = "Service Project"
  org_id = "123456789"
  billing_account = "000000-0000000-0000000-000000"
}

# Enable Compute API
resource "google_project_service" "compute_service_project" {
  project = google_project.service_project.project_id
  service = "compute.googleapis.com"
}

resource "time_sleep" "wait_120s" {
  depends_on = [google_project_service.compute_service_project]

  create_duration = "120s"
}

resource "google_apphub_service_project_attachment" "service_project_attachment" {
  service_project_attachment_id = google_project.service_project.project_id
  depends_on = [time_sleep.wait_120s]
}

# Discovered workload 
data "google_apphub_discovered_workload" "catalog-workload" {
  location = "us-central1"
  workload_uri = "${replace(google_compute_region_instance_group_manager.mig.instance_group, "https://www.googleapis.com/compute/v1", "//compute.googleapis.com")}"
  depends_on = [time_sleep.wait_120s_for_resource_ingestion]
}

resource "time_sleep" "wait_120s_for_resource_ingestion" {
  depends_on = [google_compute_region_instance_group_manager.mig]
  create_duration = "120s"
}

resource "google_apphub_workload" "example" {
  location = "us-central1"
  application_id = google_apphub_application.application.application_id
  workload_id = google_compute_region_instance_group_manager.mig.name
  discovered_workload = data.google_apphub_discovered_workload.catalog-workload.name
  display_name = "Example Service Full"
  description = "Register service for testing"
  attributes {
    environment {
      type = "STAGING"
    }
    criticality {  
      type = "MISSION_CRITICAL"
    }
    business_owners {
      display_name =  "Alice"
      email        =  "alice@google.com"
    }
    developer_owners {
      display_name =  "Bob"
      email        =  "bob@google.com"
    }
    operator_owners {
      display_name =  "Charlie"
      email        =  "charlie@google.com"
    }
  }
}

#Workload creation


# VPC network
resource "google_compute_network" "ilb_network" {
  name                    = "l7-ilb-network"
  project                 = google_project.service_project.project_id
  auto_create_subnetworks = false
  depends_on = [time_sleep.wait_120s]
}

# backend subnet
resource "google_compute_subnetwork" "ilb_subnet" {
  name          = "l7-ilb-subnet"
  project       = google_project.service_project.project_id
  ip_cidr_range = "10.0.1.0/24"
  region        = "us-central1"
  network       = google_compute_network.ilb_network.id
}

# instance template
resource "google_compute_instance_template" "instance_template" {
  name         = "l7-ilb-mig-template"
  project      = google_project.service_project.project_id
  machine_type = "e2-small"
  tags         = ["http-server"]
  network_interface {
    network    = google_compute_network.ilb_network.id
    subnetwork = google_compute_subnetwork.ilb_subnet.id
    access_config {
      # add external ip to fetch packages
    }
  }
  disk {
    source_image = "debian-cloud/debian-10"
    auto_delete  = true
    boot         = true
  }
  # install nginx and serve a simple web page
  metadata = {
    startup-script = <<-EOF1
      #! /bin/bash
      set -euo pipefail
      export DEBIAN_FRONTEND=noninteractive
      apt-get update
      apt-get install -y nginx-light jq
      NAME=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/hostname")
      IP=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip")
      METADATA=$(curl -f -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=True" | jq 'del(.["startup-script"])')
      cat <<EOF > /var/www/html/index.html
      <pre>
      Name: $NAME
      IP: $IP
      Metadata: $METADATA
      </pre>
      EOF
    EOF1
  }
  lifecycle {
    create_before_destroy = true
  }
}

resource "google_compute_region_instance_group_manager" "mig" {
  name     = "l7-ilb-mig1"
  project  = google_project.service_project.project_id
  region   = "us-central1"
  version {
    instance_template = google_compute_instance_template.instance_template.id
    name              = "primary"
  }
  base_instance_name = "vm"
  target_size        = 2
}

Argument Reference

The following arguments are supported:


The attributes block supports:

The criticality block supports:

The environment block supports:

The developer_owners block supports:

The operator_owners block supports:

The business_owners block supports:

Attributes Reference

In addition to the arguments listed above, the following computed attributes are exported:

The workload_reference block contains:

The workload_properties block contains:

Timeouts

This resource provides the following Timeouts configuration options:

Import

Workload can be imported using any of these accepted formats:

In Terraform v1.5.0 and later, use an import block to import Workload using one of the formats above. For example:

import {
  id = "projects/{{project}}/locations/{{location}}/applications/{{application_id}}/workloads/{{workload_id}}"
  to = google_apphub_workload.default
}

When using the terraform import command, Workload can be imported using one of the formats above. For example:

$ terraform import google_apphub_workload.default projects/{{project}}/locations/{{location}}/applications/{{application_id}}/workloads/{{workload_id}}
$ terraform import google_apphub_workload.default {{project}}/{{location}}/{{application_id}}/{{workload_id}}
$ terraform import google_apphub_workload.default {{location}}/{{application_id}}/{{workload_id}}

User Project Overrides

This resource supports User Project Overrides.