# Google Compute Engine VM module This module can operate in two distinct modes: - instance creation, with optional unmanaged group - instance template creation In both modes, an optional service account can be created and assigned to either instances or template. If you need a managed instance group when using the module in template mode, refer to the [`compute-mig`](../compute-mig) module. ## Examples ### Instance leveraging defaults The simplest example leverages defaults for the boot disk image and size, and uses a service account created by the module. Multiple instances can be managed via the `instance_count` variable. ```hcl module "simple-vm-example" { source = "../modules/compute-vm" project_id = "my-project" region = "europe-west1" zone = "europe-west1-b" name = "test" network_interfaces = [{ network = local.network_self_link, subnetwork = local.subnet_self_link, nat = false, addresses = null }] service_account_create = true instance_count = 1 } ``` ### Instance template This example shows how to use the module to manage an instance template that defines an additional attached disk for each instance, and overrides defaults for the boot disk image and service account. ```hcl module "debian-test" { source = "../modules/compute-vm" project_id = "my-project" region = "europe-west1" zone = "europe-west1-b" name = "test" network_interfaces = [{ network = local.network_self_link, subnetwork = local.subnet_self_link, nat = false, addresses = null }] instance_count = 1 boot_disk = { image = "projects/cos-cloud/global/images/family/cos-stable" type = "pd-ssd" size = 10 } attached_disks = [ { name = "disk-1", size = 10, image = null, options = null } ] service_account = "vm-default@my-project.iam.gserviceaccount.com" use_instance_template = true } ``` ### Instance group If an instance group is needed when operating in instance mode, simply set the `group` variable to a non null map. The map can contain named port declarations, or be empty if named ports are not needed. ```hcl module "instance-group" { source = "../../cloud-foundation-fabric/modules/compute-vm" project_id = "my-project" region = "europe-west1" zone = "europe-west1-b" name = "ilb-test" network_interfaces = [{ network = local.network_self_link, subnetwork = local.subnetwork_self_link, nat = false, addresses = null }] boot_disk = { image = "projects/cos-cloud/global/images/family/cos-stable" type = "pd-ssd" size = 10 } service_account = local.service_account_email service_account_scopes = ["https://www.googleapis.com/auth/cloud-platform"] use_instance_template = true metadata = { user-data = local.cloud_config } group = {} } ``` ## Variables | name | description | type | required | default | |---|---|:---: |:---:|:---:| | name | Instances base name. | string | ✓ | | | network_interfaces | Network interfaces configuration. Use self links for Shared VPC, set addresses to null if not needed. | list(object({...})) | ✓ | | | project_id | Project id. | string | ✓ | | | region | Compute region. | string | ✓ | | | zone | Compute zone. | string | ✓ | | | *attached_disk_defaults* | Defaults for attached disks options. | object({...}) | | ... | | *attached_disks* | Additional disks, if options is null defaults will be used in its place. | list(object({...})) | | [] | | *boot_disk* | Boot disk properties. | object({...}) | | ... | | *group* | Define this variable to create an instance group for instances. Disabled for template use. | object({...}) | | null | | *hostname* | Instance FQDN name. | string | | null | | *instance_count* | Number of instances to create (only for non-template usage). | number | | 1 | | *instance_type* | Instance type. | string | | f1-micro | | *labels* | Instance labels. | map(string) | | {} | | *metadata* | Instance metadata. | map(string) | | {} | | *min_cpu_platform* | Minimum CPU platform. | string | | null | | *options* | Instance options. | object({...}) | | ... | | *scratch_disks* | Scratch disks configuration. | object({...}) | | ... | | *service_account* | Service account email. Unused if service account is auto-created. | string | | null | | *service_account_create* | Auto-create service account. | bool | | false | | *service_account_scopes* | Scopes applied to service account. | list(string) | | [] | | *tags* | Instance tags. | list(string) | | [] | | *use_instance_template* | Create instance template instead of instances. | bool | | false | ## Outputs | name | description | sensitive | |---|---|:---:| | external_ips | Instance main interface external IP addresses. | | | group | Instance group resource. | | | instances | Instance resources. | | | internal_ips | Instance main interface internal IP addresses. | | | names | Instance names. | | | self_links | Instance self links. | | | service_account | Service account resource. | | | service_account_email | Service account email. | | | service_account_iam_email | Service account email. | | | template | Template resource. | | | template_name | Template name. | | ## TODO - [ ] add support for instance groups