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.
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
}
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
}
The following arguments are supported:
discovered_workload
-
(Required)
Immutable. The resource name of the original discovered workload.
location
-
(Required)
Part of parent
. Full resource name of a parent Application. Example: projects/{HOST_PROJECT_ID}/locations/{LOCATION}/applications/{APPLICATION_ID}
application_id
-
(Required)
Part of parent
. Full resource name of a parent Application. Example: projects/{HOST_PROJECT_ID}/locations/{LOCATION}/applications/{APPLICATION_ID}
workload_id
-
(Required)
The Workload identifier.
display_name
-
(Optional)
User-defined name for the Workload.
description
-
(Optional)
User-defined description of a Workload.
attributes
-
(Optional)
Consumer provided attributes.
Structure is documented below.
project
- (Optional) The ID of the project in which the resource belongs.
If it is not provided, the provider project is used.
The attributes
block supports:
criticality
-
(Optional)
Criticality of the Application, Service, or Workload
Structure is documented below.
environment
-
(Optional)
Environment of the Application, Service, or Workload
Structure is documented below.
developer_owners
-
(Optional)
Developer team that owns development and coding.
Structure is documented below.
operator_owners
-
(Optional)
Operator team that ensures runtime and operations.
Structure is documented below.
business_owners
-
(Optional)
Business team that ensures user needs are met and value is delivered
Structure is documented below.
The criticality
block supports:
type
-
(Required)
Criticality type.
Possible values are: MISSION_CRITICAL
, HIGH
, MEDIUM
, LOW
.The environment
block supports:
type
-
(Required)
Environment type.
Possible values are: PRODUCTION
, STAGING
, TEST
, DEVELOPMENT
.The developer_owners
block supports:
display_name
-
(Optional)
Contact's name.
email
-
(Required)
Email address of the contacts.
The operator_owners
block supports:
display_name
-
(Optional)
Contact's name.
email
-
(Required)
Email address of the contacts.
The business_owners
block supports:
display_name
-
(Optional)
Contact's name.
email
-
(Required)
Email address of the contacts.
In addition to the arguments listed above, the following computed attributes are exported:
id
- an identifier for the resource with format projects/{{project}}/locations/{{location}}/applications/{{application_id}}/workloads/{{workload_id}}
name
-
Identifier. The resource name of the Workload. Format:"projects/{host-project-id}/locations/{location}/applications/{application-id}/workloads/{workload-id}"
workload_reference
-
Reference of an underlying compute resource represented by the Workload.
Structure is documented below.
workload_properties
-
Properties of an underlying compute resource represented by the Workload.
Structure is documented below.
create_time
-
Output only. Create time.
update_time
-
Output only. Update time.
uid
-
Output only. A universally unique identifier (UUID) for the Workload
in the UUID4 format.
state
-
Output only. Workload state. Possible values: STATE_UNSPECIFIED CREATING ACTIVE DELETING DETACHED
The workload_reference
block contains:
uri
-
(Output)
Output only. The underlying compute resource uri.The workload_properties
block contains:
gcp_project
-
(Output)
Output only. The service project identifier that the underlying cloud resource resides in. Empty for non cloud resources.
location
-
(Output)
Output only. The location that the underlying compute resource resides in (e.g us-west1).
zone
-
(Output)
Output only. The location that the underlying compute resource resides in if it is zonal (e.g us-west1-a).
This resource provides the following Timeouts configuration options:
create
- Default is 20 minutes.update
- Default is 20 minutes.delete
- Default is 20 minutes.Workload can be imported using any of these accepted formats:
projects/{{project}}/locations/{{location}}/applications/{{application_id}}/workloads/{{workload_id}}
{{project}}/{{location}}/{{application_id}}/{{workload_id}}
{{location}}/{{application_id}}/{{workload_id}}
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}}
This resource supports User Project Overrides.