---
# ----------------------------------------------------------------------------
#
#     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
#
# ----------------------------------------------------------------------------
#
#     This file is automatically generated by Magic Modules and manual
#     changes will be clobbered when the file is regenerated.
#
#     Please read more about how to change this file in
#     .github/CONTRIBUTING.md.
#
# ----------------------------------------------------------------------------
subcategory: "Compute Engine"
description: |-
  Represents an Autoscaler resource.
---

# google\_compute\_autoscaler

Represents an Autoscaler resource.

Autoscalers allow you to automatically scale virtual machine instances in
managed instance groups according to an autoscaling policy that you
define.


To get more information about Autoscaler, see:

* [API documentation](https://cloud.google.com/compute/docs/reference/rest/v1/autoscalers)
* How-to Guides
    * [Autoscaling Groups of Instances](https://cloud.google.com/compute/docs/autoscaler/)

<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=autoscaler_single_instance&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Autoscaler Single Instance


```hcl
resource "google_compute_autoscaler" "default" {
  provider = google-beta

  name   = "my-autoscaler"
  zone   = "us-central1-f"
  target = google_compute_instance_group_manager.default.id

  autoscaling_policy {
    max_replicas    = 5
    min_replicas    = 1
    cooldown_period = 60

    metric {
      name                       = "pubsub.googleapis.com/subscription/num_undelivered_messages"
      filter                     = "resource.type = pubsub_subscription AND resource.label.subscription_id = our-subscription"
      single_instance_assignment = 65535
    }
  }
}

resource "google_compute_instance_template" "default" {
  provider = google-beta

  name           = "my-instance-template"
  machine_type   = "e2-medium"
  can_ip_forward = false

  tags = ["foo", "bar"]

  disk {
    source_image = data.google_compute_image.debian_9.id
  }

  network_interface {
    network = "default"
  }

  metadata = {
    foo = "bar"
  }

  service_account {
    scopes = ["userinfo-email", "compute-ro", "storage-ro"]
  }
}

resource "google_compute_target_pool" "default" {
  provider = google-beta

  name = "my-target-pool"
}

resource "google_compute_instance_group_manager" "default" {
  provider = google-beta

  name = "my-igm"
  zone = "us-central1-f"

  version {
    instance_template = google_compute_instance_template.default.id
    name              = "primary"
  }

  target_pools       = [google_compute_target_pool.default.id]
  base_instance_name = "autoscaler-sample"
}

data "google_compute_image" "debian_9" {
  provider = google-beta

  family  = "debian-11"
  project = "debian-cloud"
}

provider "google-beta" {
  region = "us-central1"
  zone   = "us-central1-a"
  
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=autoscaler_basic&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Autoscaler Basic


```hcl
resource "google_compute_autoscaler" "foobar" {
  name   = "my-autoscaler"
  zone   = "us-central1-f"
  target = google_compute_instance_group_manager.foobar.id

  autoscaling_policy {
    max_replicas    = 5
    min_replicas    = 1
    cooldown_period = 60

    cpu_utilization {
      target = 0.5
    }
  }
}

resource "google_compute_instance_template" "foobar" {
  name           = "my-instance-template"
  machine_type   = "e2-medium"
  can_ip_forward = false

  tags = ["foo", "bar"]

  disk {
    source_image = data.google_compute_image.debian_9.id
  }

  network_interface {
    network = "default"
  }

  metadata = {
    foo = "bar"
  }

  service_account {
    scopes = ["userinfo-email", "compute-ro", "storage-ro"]
  }
}

resource "google_compute_target_pool" "foobar" {
  name = "my-target-pool"
}

resource "google_compute_instance_group_manager" "foobar" {
  name = "my-igm"
  zone = "us-central1-f"

  version {
    instance_template  = google_compute_instance_template.foobar.id
    name               = "primary"
  }

  target_pools       = [google_compute_target_pool.foobar.id]
  base_instance_name = "foobar"
}

data "google_compute_image" "debian_9" {
  family  = "debian-11"
  project = "debian-cloud"
}
```

## Argument Reference

The following arguments are supported:


* `name` -
  (Required)
  Name of the resource. The name must be 1-63 characters long and match
  the regular expression `[a-z]([-a-z0-9]*[a-z0-9])?` which means the
  first character must be a lowercase letter, and all following
  characters must be a dash, lowercase letter, or digit, except the last
  character, which cannot be a dash.

* `autoscaling_policy` -
  (Required)
  The configuration parameters for the autoscaling algorithm. You can
  define one or more of the policies for an autoscaler: cpuUtilization,
  customMetricUtilizations, and loadBalancingUtilization.
  If none of these are specified, the default will be to autoscale based
  on cpuUtilization to 0.6 or 60%.
  Structure is [documented below](#nested_autoscaling_policy).

* `target` -
  (Required)
  URL of the managed instance group that this autoscaler will scale.


<a name="nested_autoscaling_policy"></a>The `autoscaling_policy` block supports:

* `min_replicas` -
  (Required)
  The minimum number of replicas that the autoscaler can scale down
  to. This cannot be less than 0. If not provided, autoscaler will
  choose a default value depending on maximum number of instances
  allowed.

* `max_replicas` -
  (Required)
  The maximum number of instances that the autoscaler can scale up
  to. This is required when creating or updating an autoscaler. The
  maximum number of replicas should not be lower than minimal number
  of replicas.

* `cooldown_period` -
  (Optional)
  The number of seconds that the autoscaler should wait before it
  starts collecting information from a new instance. This prevents
  the autoscaler from collecting information when the instance is
  initializing, during which the collected usage would not be
  reliable. The default time autoscaler waits is 60 seconds.
  Virtual machine initialization times might vary because of
  numerous factors. We recommend that you test how long an
  instance may take to initialize. To do this, create an instance
  and time the startup process.

* `mode` -
  (Optional)
  Defines operating mode for this policy.

* `scale_down_control` -
  (Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
  Defines scale down controls to reduce the risk of response latency
  and outages due to abrupt scale-in events
  Structure is [documented below](#nested_scale_down_control).

* `scale_in_control` -
  (Optional)
  Defines scale in controls to reduce the risk of response latency
  and outages due to abrupt scale-in events
  Structure is [documented below](#nested_scale_in_control).

* `cpu_utilization` -
  (Optional)
  Defines the CPU utilization policy that allows the autoscaler to
  scale based on the average CPU utilization of a managed instance
  group.
  Structure is [documented below](#nested_cpu_utilization).

* `metric` -
  (Optional)
  Configuration parameters of autoscaling based on a custom metric.
  Structure is [documented below](#nested_metric).

* `load_balancing_utilization` -
  (Optional)
  Configuration parameters of autoscaling based on a load balancer.
  Structure is [documented below](#nested_load_balancing_utilization).

* `scaling_schedules` -
  (Optional)
  Scaling schedules defined for an autoscaler. Multiple schedules can be set on an autoscaler and they can overlap.
  Structure is [documented below](#nested_scaling_schedules).


<a name="nested_scale_down_control"></a>The `scale_down_control` block supports:

* `max_scaled_down_replicas` -
  (Optional)
  A nested object resource
  Structure is [documented below](#nested_max_scaled_down_replicas).

* `time_window_sec` -
  (Optional)
  How long back autoscaling should look when computing recommendations
  to include directives regarding slower scale down, as described above.


<a name="nested_max_scaled_down_replicas"></a>The `max_scaled_down_replicas` block supports:

* `fixed` -
  (Optional)
  Specifies a fixed number of VM instances. This must be a positive
  integer.

* `percent` -
  (Optional)
  Specifies a percentage of instances between 0 to 100%, inclusive.
  For example, specify 80 for 80%.

<a name="nested_scale_in_control"></a>The `scale_in_control` block supports:

* `max_scaled_in_replicas` -
  (Optional)
  A nested object resource
  Structure is [documented below](#nested_max_scaled_in_replicas).

* `time_window_sec` -
  (Optional)
  How long back autoscaling should look when computing recommendations
  to include directives regarding slower scale down, as described above.


<a name="nested_max_scaled_in_replicas"></a>The `max_scaled_in_replicas` block supports:

* `fixed` -
  (Optional)
  Specifies a fixed number of VM instances. This must be a positive
  integer.

* `percent` -
  (Optional)
  Specifies a percentage of instances between 0 to 100%, inclusive.
  For example, specify 80 for 80%.

<a name="nested_cpu_utilization"></a>The `cpu_utilization` block supports:

* `target` -
  (Required)
  The target CPU utilization that the autoscaler should maintain.
  Must be a float value in the range (0, 1]. If not specified, the
  default is 0.6.
  If the CPU level is below the target utilization, the autoscaler
  scales down the number of instances until it reaches the minimum
  number of instances you specified or until the average CPU of
  your instances reaches the target utilization.
  If the average CPU is above the target utilization, the autoscaler
  scales up until it reaches the maximum number of instances you
  specified or until the average utilization reaches the target
  utilization.

* `predictive_method` -
  (Optional)
  Indicates whether predictive autoscaling based on CPU metric is enabled. Valid values are:
  - NONE (default). No predictive method is used. The autoscaler scales the group to meet current demand based on real-time metrics.
  - OPTIMIZE_AVAILABILITY. Predictive autoscaling improves availability by monitoring daily and weekly load patterns and scaling out ahead of anticipated demand.

<a name="nested_metric"></a>The `metric` block supports:

* `name` -
  (Required)
  The identifier (type) of the Stackdriver Monitoring metric.
  The metric cannot have negative values.
  The metric must have a value type of INT64 or DOUBLE.

* `single_instance_assignment` -
  (Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
  If scaling is based on a per-group metric value that represents the
  total amount of work to be done or resource usage, set this value to
  an amount assigned for a single instance of the scaled group.
  The autoscaler will keep the number of instances proportional to the
  value of this metric, the metric itself should not change value due
  to group resizing.
  For example, a good metric to use with the target is
  `pubsub.googleapis.com/subscription/num_undelivered_messages`
  or a custom metric exporting the total number of requests coming to
  your instances.
  A bad example would be a metric exporting an average or median
  latency, since this value can't include a chunk assignable to a
  single instance, it could be better used with utilization_target
  instead.

* `target` -
  (Optional)
  The target value of the metric that autoscaler should
  maintain. This must be a positive value. A utilization
  metric scales number of virtual machines handling requests
  to increase or decrease proportionally to the metric.
  For example, a good metric to use as a utilizationTarget is
  www.googleapis.com/compute/instance/network/received_bytes_count.
  The autoscaler will work to keep this value constant for each
  of the instances.

* `type` -
  (Optional)
  Defines how target utilization value is expressed for a
  Stackdriver Monitoring metric.
  Possible values are: `GAUGE`, `DELTA_PER_SECOND`, `DELTA_PER_MINUTE`.

* `filter` -
  (Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
  A filter string to be used as the filter string for
  a Stackdriver Monitoring TimeSeries.list API call.
  This filter is used to select a specific TimeSeries for
  the purpose of autoscaling and to determine whether the metric
  is exporting per-instance or per-group data.
  You can only use the AND operator for joining selectors.
  You can only use direct equality comparison operator (=) without
  any functions for each selector.
  You can specify the metric in both the filter string and in the
  metric field. However, if specified in both places, the metric must
  be identical.
  The monitored resource type determines what kind of values are
  expected for the metric. If it is a gce_instance, the autoscaler
  expects the metric to include a separate TimeSeries for each
  instance in a group. In such a case, you cannot filter on resource
  labels.
  If the resource type is any other value, the autoscaler expects
  this metric to contain values that apply to the entire autoscaled
  instance group and resource label filtering can be performed to
  point autoscaler at the correct TimeSeries to scale upon.
  This is called a per-group metric for the purpose of autoscaling.
  If not specified, the type defaults to gce_instance.
  You should provide a filter that is selective enough to pick just
  one TimeSeries for the autoscaled group or for each of the instances
  (if you are using gce_instance resource type). If multiple
  TimeSeries are returned upon the query execution, the autoscaler
  will sum their respective values to obtain its scaling value.

<a name="nested_load_balancing_utilization"></a>The `load_balancing_utilization` block supports:

* `target` -
  (Required)
  Fraction of backend capacity utilization (set in HTTP(s) load
  balancing configuration) that autoscaler should maintain. Must
  be a positive float value. If not defined, the default is 0.8.

<a name="nested_scaling_schedules"></a>The `scaling_schedules` block supports:

* `name` - (Required) The identifier for this object. Format specified above.

* `min_required_replicas` -
  (Required)
  Minimum number of VM instances that autoscaler will recommend in time intervals starting according to schedule.

* `schedule` -
  (Required)
  The start timestamps of time intervals when this scaling schedule should provide a scaling signal. This field uses the extended cron format (with an optional year field).

* `time_zone` -
  (Optional)
  The time zone to be used when interpreting the schedule. The value of this field must be a time zone name from the tz database: http://en.wikipedia.org/wiki/Tz_database.

* `duration_sec` -
  (Required)
  The duration of time intervals (in seconds) for which this scaling schedule will be running. The minimum allowed value is 300.

* `disabled` -
  (Optional)
  A boolean value that specifies if a scaling schedule can influence autoscaler recommendations. If set to true, then a scaling schedule has no effect.

* `description` -
  (Optional)
  A description of a scaling schedule.

- - -


* `description` -
  (Optional)
  An optional description of this resource.

* `zone` -
  (Optional)
  URL of the zone where the instance group resides.

* `project` - (Optional) The ID of the project in which the resource belongs.
    If it is not provided, the provider project is used.


## Attributes Reference

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

* `id` - an identifier for the resource with format `projects/{{project}}/zones/{{zone}}/autoscalers/{{name}}`

* `creation_timestamp` -
  Creation timestamp in RFC3339 text format.
* `self_link` - The URI of the created resource.


## Timeouts

This resource provides the following
[Timeouts](https://developer.hashicorp.com/terraform/plugin/sdkv2/resources/retries-and-customizable-timeouts) configuration options:

- `create` - Default is 20 minutes.
- `update` - Default is 20 minutes.
- `delete` - Default is 20 minutes.

## Import


Autoscaler can be imported using any of these accepted formats:

* `projects/{{project}}/zones/{{zone}}/autoscalers/{{name}}`
* `{{project}}/{{zone}}/{{name}}`
* `{{zone}}/{{name}}`
* `{{name}}`


In Terraform v1.5.0 and later, use an [`import` block](https://developer.hashicorp.com/terraform/language/import) to import Autoscaler using one of the formats above. For example:

```tf
import {
  id = "projects/{{project}}/zones/{{zone}}/autoscalers/{{name}}"
  to = google_compute_autoscaler.default
}
```

When using the [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import), Autoscaler can be imported using one of the formats above. For example:

```
$ terraform import google_compute_autoscaler.default projects/{{project}}/zones/{{zone}}/autoscalers/{{name}}
$ terraform import google_compute_autoscaler.default {{project}}/{{zone}}/{{name}}
$ terraform import google_compute_autoscaler.default {{zone}}/{{name}}
$ terraform import google_compute_autoscaler.default {{name}}
```

## User Project Overrides

This resource supports [User Project Overrides](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference#user_project_override).
