---
# ----------------------------------------------------------------------------
#
#     ***     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: "Cloud Run"
description: |-
  A Cloud Run service has a unique endpoint and autoscales containers.
---

# google_cloud_run_service

A Cloud Run service has a unique endpoint and autoscales containers.


To get more information about Service, see:

* [API documentation](https://cloud.google.com/run/docs/reference/rest/v1/namespaces.services)
* How-to Guides
    * [Official Documentation](https://cloud.google.com/run/docs/)

~> **Warning:** We recommend using the `google_cloud_run_v2_service` resource which offers a better
developer experience and broader support of Cloud Run features.

## Example Usage - Cloud Run Service Basic


```hcl
resource "google_cloud_run_service" "default" {
  name     = "cloudrun-srv"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "us-docker.pkg.dev/cloudrun/container/hello"
      }
    }
  }

  traffic {
    percent         = 100
    latest_revision = true
  }
}
```
<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_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=cloud_run_service_sql&open_in_editor=main.tf" 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 - Cloud Run Service Sql


```hcl
resource "google_cloud_run_service" "default" {
  name     = "cloudrun-srv"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "us-docker.pkg.dev/cloudrun/container/hello"
      }
    }

    metadata {
      annotations = {
        "autoscaling.knative.dev/maxScale"      = "1000"
        "run.googleapis.com/cloudsql-instances" = google_sql_database_instance.instance.connection_name
        "run.googleapis.com/client-name"        = "terraform"
      }
    }
  }
  autogenerate_revision_name = true
}

resource "google_sql_database_instance" "instance" {
  name             = "cloudrun-sql"
  region           = "us-east1"
  database_version = "MYSQL_5_7"
  settings {
    tier = "db-f1-micro"
  }

  deletion_protection  = "true"
}
```
## Example Usage - Cloud Run Service Noauth


```hcl

resource "google_cloud_run_service" "default" {
  name     = "cloudrun-srv"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "us-docker.pkg.dev/cloudrun/container/hello"
      }
    }
  }
}

data "google_iam_policy" "noauth" {
  binding {
    role = "roles/run.invoker"
    members = [
      "allUsers",
    ]
  }
}

resource "google_cloud_run_service_iam_policy" "noauth" {
  location    = google_cloud_run_service.default.location
  project     = google_cloud_run_service.default.project
  service     = google_cloud_run_service.default.name

  policy_data = data.google_iam_policy.noauth.policy_data
}
```
## Example Usage - Cloud Run Service Probes


```hcl
resource "google_cloud_run_service" "default" {
  name     = "cloudrun-srv"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "us-docker.pkg.dev/cloudrun/container/hello"
        startup_probe {
          initial_delay_seconds = 0
          timeout_seconds = 1
          period_seconds = 3
          failure_threshold = 1
          tcp_socket {
            port = 8080
          }
        }
        liveness_probe {
          http_get {
            path = "/"
          }
        }
      }
    }
  }

  traffic {
    percent         = 100
    latest_revision = true
  }

  lifecycle {
    ignore_changes = [
      metadata.0.annotations,
    ]
  }
}
```
## Example Usage - Cloud Run Service Multicontainer


```hcl
resource "google_cloud_run_service" "default" {
  name     = "cloudrun-srv"
  location = "us-central1"
  provider = google-beta

  metadata {
    annotations = {
      "run.googleapis.com/launch-stage" = "BETA"
    }
  }

  template {
    metadata {
      annotations = {
        "run.googleapis.com/container-dependencies" = jsonencode({hello-1 = ["hello-2"]})
      }
    }
    spec {
      containers {
        name = "hello-1"
        ports {
          container_port = 8080
        }
        image = "us-docker.pkg.dev/cloudrun/container/hello"
        volume_mounts {
          name = "shared-volume"
          mount_path = "/mnt/shared"
          }
      }
      containers {
        name = "hello-2"
        image = "us-docker.pkg.dev/cloudrun/container/hello"
        env {
          name = "PORT"
          value = "8081"
        }
        startup_probe {
          http_get {
            port = 8081
          }
        }
        volume_mounts {
          name = "shared-volume"
          mount_path = "/mnt/shared"
        }
      }
      volumes {
          name = "shared-volume"
          empty_dir {
          medium = "Memory"
          size_limit = "128Mi"
        }
      }
    }
  }

  lifecycle {
    ignore_changes = [
      metadata[0].annotations["run.googleapis.com/launch-stage"],
    ]
  }
}
```

## Argument Reference

The following arguments are supported:


* `name` -
  (Required)
  Name must be unique within a Google Cloud project and region.
  Is required when creating resources. Name is primarily intended
  for creation idempotence and configuration definition. Cannot be updated.
  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names

* `location` -
  (Required)
  The location of the cloud run instance. eg us-central1



<a name="nested_traffic"></a>The `traffic` block supports:

* `revision_name` -
  (Optional)
  RevisionName of a specific revision to which to send this portion of traffic.

* `percent` -
  (Required)
  Percent specifies percent of the traffic to this Revision or Configuration.

* `tag` -
  (Optional)
  Tag is optionally used to expose a dedicated url for referencing this target exclusively.

* `latest_revision` -
  (Optional)
  LatestRevision may be optionally provided to indicate that the latest ready
  Revision of the Configuration should be used for this traffic target. When
  provided LatestRevision must be true if RevisionName is empty; it must be
  false when RevisionName is non-empty.

* `url` -
  (Output)
  URL displays the URL for accessing tagged traffic targets. URL is displayed in status,
  and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname,
  but may not contain anything else (e.g. basic auth, url path, etc.)

<a name="nested_template"></a>The `template` block supports:

* `metadata` -
  (Optional)
  Optional metadata for this Revision, including labels and annotations.
  Name will be generated by the Configuration. To set minimum instances
  for this revision, use the "autoscaling.knative.dev/minScale" annotation
  key. To set maximum instances for this revision, use the
  "autoscaling.knative.dev/maxScale" annotation key. To set Cloud SQL
  connections for the revision, use the "run.googleapis.com/cloudsql-instances"
  annotation key.
  Structure is [documented below](#nested_metadata).

* `spec` -
  (Required)
  RevisionSpec holds the desired state of the Revision (from the client).
  Structure is [documented below](#nested_spec).


<a name="nested_metadata"></a>The `metadata` block supports:

* `labels` -
  (Optional)
  Map of string keys and values that can be used to organize and categorize
  (scope and select) objects.

* `generation` -
  (Output)
  A sequence number representing a specific generation of the desired state.

* `resource_version` -
  (Output)
  An opaque value that represents the internal version of this object that
  can be used by clients to determine when objects have changed. May be used
  for optimistic concurrency, change detection, and the watch operation on a
  resource or set of resources. They may only be valid for a
  particular resource or set of resources.

* `self_link` -
  (Output)
  SelfLink is a URL representing this object.

* `uid` -
  (Output)
  UID is a unique id generated by the server on successful creation of a resource and is not
  allowed to change on PUT operations.

* `namespace` -
  (Optional)
  In Cloud Run the namespace must be equal to either the
  project ID or project number. It will default to the resource's project.

* `annotations` -
  (Optional)
  Annotations is a key value map stored with a resource that
  may be set by external tools to store and retrieve arbitrary metadata.
  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations
  **Note**: The Cloud Run API may add additional annotations that were not provided in your config.
  If terraform plan shows a diff where a server-side annotation is added, you can add it to your config
  or apply the lifecycle.ignore_changes rule to the metadata.0.annotations field.
  Annotations with `run.googleapis.com/` and `autoscaling.knative.dev` are restricted. Use the following annotation
  keys to configure features on a Revision template:
  - `autoscaling.knative.dev/maxScale` sets the [maximum number of container
    instances](https://cloud.google.com/sdk/gcloud/reference/run/deploy#--max-instances) of the Revision to run.
  - `autoscaling.knative.dev/minScale` sets the [minimum number of container
    instances](https://cloud.google.com/sdk/gcloud/reference/run/deploy#--min-instances) of the Revision to run.
  - `run.googleapis.com/client-name` sets the client name calling the Cloud Run API.
  - `run.googleapis.com/cloudsql-instances` sets the [Cloud SQL
    instances](https://cloud.google.com/sdk/gcloud/reference/run/deploy#--add-cloudsql-instances) the Revision connects to.
  - `run.googleapis.com/cpu-throttling` sets whether to throttle the CPU when the container is not actively serving
    requests. See https://cloud.google.com/sdk/gcloud/reference/run/deploy#--[no-]cpu-throttling.
  - `run.googleapis.com/encryption-key-shutdown-hours` sets the number of hours to wait before an automatic shutdown
    server after CMEK key revocation is detected.
  - `run.googleapis.com/encryption-key` sets the [CMEK key](https://cloud.google.com/run/docs/securing/using-cmek)
    reference to encrypt the container with.
  - `run.googleapis.com/execution-environment` sets the [execution
    environment](https://cloud.google.com/sdk/gcloud/reference/run/deploy#--execution-environment)
    where the application will run.
  - `run.googleapis.com/post-key-revocation-action-type` sets the
    [action type](https://cloud.google.com/sdk/gcloud/reference/run/deploy#--post-key-revocation-action-type)
    after CMEK key revocation.
  - `run.googleapis.com/secrets` sets a list of key-value pairs to set as
    [secrets](https://cloud.google.com/run/docs/configuring/secrets#yaml).
  - `run.googleapis.com/sessionAffinity` sets whether to enable
    [session affinity](https://cloud.google.com/sdk/gcloud/reference/beta/run/deploy#--[no-]session-affinity)
    for connections to the Revision.
  - `run.googleapis.com/startup-cpu-boost` sets whether to allocate extra CPU to containers on startup.
    See https://cloud.google.com/sdk/gcloud/reference/run/deploy#--[no-]cpu-boost.
  - `run.googleapis.com/vpc-access-connector` sets a [VPC connector](https://cloud.google.com/run/docs/configuring/connecting-vpc#terraform_1)
    for the Revision.
  - `run.googleapis.com/vpc-access-egress` sets the outbound traffic to send through the VPC connector for this resource.
    See https://cloud.google.com/sdk/gcloud/reference/run/deploy#--vpc-egress.

* `name` -
  (Optional)
  Name must be unique within a Google Cloud project and region.
  Is required when creating resources. Name is primarily intended
  for creation idempotence and configuration definition. Cannot be updated.

<a name="nested_spec"></a>The `spec` block supports:

* `containers` -
  (Required)
  Containers defines the unit of execution for this Revision.
  Structure is [documented below](#nested_containers).

* `container_concurrency` -
  (Optional)
  ContainerConcurrency specifies the maximum allowed in-flight (concurrent)
  requests per container of the Revision. If not specified or 0, defaults to 80 when
  requested CPU >= 1 and defaults to 1 when requested CPU < 1.

* `timeout_seconds` -
  (Optional)
  TimeoutSeconds holds the max duration the instance is allowed for responding to a request.

* `service_account_name` -
  (Optional)
  Email address of the IAM service account associated with the revision of the
  service. The service account represents the identity of the running revision,
  and determines what permissions the revision has. If not provided, the revision
  will use the project's default service account.

* `volumes` -
  (Optional)
  Volume represents a named volume in a container.
  Structure is [documented below](#nested_volumes).

* `serving_state` -
  (Output, Deprecated)
  ServingState holds a value describing the state the resources
  are in for this Revision.
  It is expected
  that the system will manipulate this based on routability and load.

  ~> **Warning:** `serving_state` is deprecated and will be removed in a future major release. This field is not supported by the Cloud Run API.


<a name="nested_containers"></a>The `containers` block supports:

* `name` -
  (Optional)
  Name of the container

* `working_dir` -
  (Optional, Deprecated)
  Container's working directory.
  If not specified, the container runtime's default will be used, which
  might be configured in the container image.

  ~> **Warning:** `working_dir` is deprecated and will be removed in a future major release. This field is not supported by the Cloud Run API.

* `args` -
  (Optional)
  Arguments to the entrypoint.
  The docker image's CMD is used if this is not provided.

* `env_from` -
  (Optional, Deprecated)
  List of sources to populate environment variables in the container.
  All invalid keys will be reported as an event when the container is starting.
  When a key exists in multiple sources, the value associated with the last source will
  take precedence. Values defined by an Env with a duplicate key will take
  precedence.
  Structure is [documented below](#nested_env_from).

  ~> **Warning:** `env_from` is deprecated and will be removed in a future major release. This field is not supported by the Cloud Run API.

* `image` -
  (Required)
  Docker image name. This is most often a reference to a container located
  in the container registry, such as gcr.io/cloudrun/hello

* `command` -
  (Optional)
  Entrypoint array. Not executed within a shell.
  The docker image's ENTRYPOINT is used if this is not provided.

* `env` -
  (Optional)
  List of environment variables to set in the container.
  Structure is [documented below](#nested_env).

* `ports` -
  (Optional)
  List of open ports in the container.
  Structure is [documented below](#nested_ports).

* `resources` -
  (Optional)
  Compute Resources required by this container. Used to set values such as max memory
  Structure is [documented below](#nested_resources).

* `volume_mounts` -
  (Optional)
  Volume to mount into the container's filesystem.
  Only supports SecretVolumeSources.
  Structure is [documented below](#nested_volume_mounts).

* `startup_probe` -
  (Optional)
  Startup probe of application within the container.
  All other probes are disabled if a startup probe is provided, until it
  succeeds. Container will not be added to service endpoints if the probe fails.
  Structure is [documented below](#nested_startup_probe).

* `liveness_probe` -
  (Optional)
  Periodic probe of container liveness. Container will be restarted if the probe fails.
  Structure is [documented below](#nested_liveness_probe).


<a name="nested_env_from"></a>The `env_from` block supports:

* `prefix` -
  (Optional)
  An optional identifier to prepend to each key in the ConfigMap.

* `config_map_ref` -
  (Optional)
  The ConfigMap to select from.
  Structure is [documented below](#nested_config_map_ref).

* `secret_ref` -
  (Optional)
  The Secret to select from.
  Structure is [documented below](#nested_secret_ref).


<a name="nested_config_map_ref"></a>The `config_map_ref` block supports:

* `optional` -
  (Optional)
  Specify whether the ConfigMap must be defined

* `local_object_reference` -
  (Optional)
  The ConfigMap to select from.
  Structure is [documented below](#nested_local_object_reference).


<a name="nested_local_object_reference"></a>The `local_object_reference` block supports:

* `name` -
  (Required)
  Name of the referent.

<a name="nested_secret_ref"></a>The `secret_ref` block supports:

* `local_object_reference` -
  (Optional)
  The Secret to select from.
  Structure is [documented below](#nested_local_object_reference).

* `optional` -
  (Optional)
  Specify whether the Secret must be defined


<a name="nested_local_object_reference"></a>The `local_object_reference` block supports:

* `name` -
  (Required)
  Name of the referent.

<a name="nested_env"></a>The `env` block supports:

* `name` -
  (Optional)
  Name of the environment variable.

* `value` -
  (Optional)
  Defaults to "".

* `value_from` -
  (Optional)
  Source for the environment variable's value. Only supports secret_key_ref.
  Structure is [documented below](#nested_value_from).


<a name="nested_value_from"></a>The `value_from` block supports:

* `secret_key_ref` -
  (Required)
  Selects a key (version) of a secret in Secret Manager.
  Structure is [documented below](#nested_secret_key_ref).


<a name="nested_secret_key_ref"></a>The `secret_key_ref` block supports:

* `key` -
  (Required)
  A Cloud Secret Manager secret version. Must be 'latest' for the latest
  version or an integer for a specific version.

* `name` -
  (Required)
  The name of the secret in Cloud Secret Manager. By default, the secret is assumed to be in the same project.
  If the secret is in another project, you must define an alias.
  An alias definition has the form: :projects/{project-id|project-number}/secrets/.
  If multiple alias definitions are needed, they must be separated by commas.
  The alias definitions must be set on the run.googleapis.com/secrets annotation.

<a name="nested_ports"></a>The `ports` block supports:

* `name` -
  (Optional)
  If specified, used to specify which protocol to use. Allowed values are "http1" (HTTP/1) and "h2c" (HTTP/2 end-to-end). Defaults to "http1".

* `protocol` -
  (Optional)
  Protocol for port. Must be "TCP". Defaults to "TCP".

* `container_port` -
  (Optional)
  Port number the container listens on. This must be a valid port number (between 1 and 65535). Defaults to "8080".

<a name="nested_resources"></a>The `resources` block supports:

* `limits` -
  (Optional)
  Limits describes the maximum amount of compute resources allowed.
  The values of the map is string form of the 'quantity' k8s type:
  https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go

* `requests` -
  (Optional)
  Requests describes the minimum amount of compute resources required.
  If Requests is omitted for a container, it defaults to Limits if that is
  explicitly specified, otherwise to an implementation-defined value.
  The values of the map is string form of the 'quantity' k8s type:
  https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go

<a name="nested_volume_mounts"></a>The `volume_mounts` block supports:

* `mount_path` -
  (Required)
  Path within the container at which the volume should be mounted.  Must
  not contain ':'.

* `name` -
  (Required)
  This must match the Name of a Volume.

<a name="nested_startup_probe"></a>The `startup_probe` block supports:

* `initial_delay_seconds` -
  (Optional)
  Number of seconds after the container has started before the probe is
  initiated.
  Defaults to 0 seconds. Minimum value is 0. Maximum value is 240.

* `timeout_seconds` -
  (Optional)
  Number of seconds after which the probe times out.
  Defaults to 1 second. Minimum value is 1. Maximum value is 3600.
  Must be smaller than periodSeconds.

* `period_seconds` -
  (Optional)
  How often (in seconds) to perform the probe.
  Default to 10 seconds. Minimum value is 1. Maximum value is 240.

* `failure_threshold` -
  (Optional)
  Minimum consecutive failures for the probe to be considered failed after
  having succeeded. Defaults to 3. Minimum value is 1.

* `tcp_socket` -
  (Optional)
  TcpSocket specifies an action involving a TCP port.
  Structure is [documented below](#nested_tcp_socket).

* `http_get` -
  (Optional)
  HttpGet specifies the http request to perform.
  Structure is [documented below](#nested_http_get).

* `grpc` -
  (Optional)
  GRPC specifies an action involving a GRPC port.
  Structure is [documented below](#nested_grpc).


<a name="nested_tcp_socket"></a>The `tcp_socket` block supports:

* `port` -
  (Optional)
  Port number to access on the container. Number must be in the range 1 to 65535.
  If not specified, defaults to the same value as container.ports[0].containerPort.

<a name="nested_http_get"></a>The `http_get` block supports:

* `path` -
  (Optional)
  Path to access on the HTTP server. If set, it should not be empty string.

* `port` -
  (Optional)
  Port number to access on the container. Number must be in the range 1 to 65535.
  If not specified, defaults to the same value as container.ports[0].containerPort.

* `http_headers` -
  (Optional)
  Custom headers to set in the request. HTTP allows repeated headers.
  Structure is [documented below](#nested_http_headers).


<a name="nested_http_headers"></a>The `http_headers` block supports:

* `name` -
  (Required)
  The header field name.

* `value` -
  (Optional)
  The header field value.

<a name="nested_grpc"></a>The `grpc` block supports:

* `port` -
  (Optional)
  Port number to access on the container. Number must be in the range 1 to 65535.
  If not specified, defaults to the same value as container.ports[0].containerPort.

* `service` -
  (Optional)
  The name of the service to place in the gRPC HealthCheckRequest
  (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).
  If this is not specified, the default behavior is defined by gRPC.

<a name="nested_liveness_probe"></a>The `liveness_probe` block supports:

* `initial_delay_seconds` -
  (Optional)
  Number of seconds after the container has started before the probe is
  initiated.
  Defaults to 0 seconds. Minimum value is 0. Maximum value is 3600.

* `timeout_seconds` -
  (Optional)
  Number of seconds after which the probe times out.
  Defaults to 1 second. Minimum value is 1. Maximum value is 3600.
  Must be smaller than period_seconds.

* `period_seconds` -
  (Optional)
  How often (in seconds) to perform the probe.
  Default to 10 seconds. Minimum value is 1. Maximum value is 3600.

* `failure_threshold` -
  (Optional)
  Minimum consecutive failures for the probe to be considered failed after
  having succeeded. Defaults to 3. Minimum value is 1.

* `http_get` -
  (Optional)
  HttpGet specifies the http request to perform.
  Structure is [documented below](#nested_http_get).

* `grpc` -
  (Optional)
  GRPC specifies an action involving a GRPC port.
  Structure is [documented below](#nested_grpc).


<a name="nested_http_get"></a>The `http_get` block supports:

* `path` -
  (Optional)
  Path to access on the HTTP server. If set, it should not be empty string.

* `port` -
  (Optional)
  Port number to access on the container. Number must be in the range 1 to 65535.
  If not specified, defaults to the same value as container.ports[0].containerPort.

* `http_headers` -
  (Optional)
  Custom headers to set in the request. HTTP allows repeated headers.
  Structure is [documented below](#nested_http_headers).


<a name="nested_http_headers"></a>The `http_headers` block supports:

* `name` -
  (Required)
  The header field name.

* `value` -
  (Optional)
  The header field value.

<a name="nested_grpc"></a>The `grpc` block supports:

* `port` -
  (Optional)
  Port number to access on the container. Number must be in the range 1 to 65535.
  If not specified, defaults to the same value as container.ports[0].containerPort.

* `service` -
  (Optional)
  The name of the service to place in the gRPC HealthCheckRequest
  (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).
  If this is not specified, the default behavior is defined by gRPC.

<a name="nested_volumes"></a>The `volumes` block supports:

* `name` -
  (Required)
  Volume's name.

* `secret` -
  (Optional)
  The secret's value will be presented as the content of a file whose
  name is defined in the item path. If no items are defined, the name of
  the file is the secret_name.
  Structure is [documented below](#nested_secret).

* `empty_dir` -
  (Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
  Ephemeral storage which can be backed by real disks (HD, SSD), network storage or memory (i.e. tmpfs). For now only in memory (tmpfs) is supported. It is ephemeral in the sense that when the sandbox is taken down, the data is destroyed with it (it does not persist across sandbox runs).
  Structure is [documented below](#nested_empty_dir).

* `csi` -
  (Optional)
  A filesystem specified by the Container Storage Interface (CSI).
  Structure is [documented below](#nested_csi).

* `nfs` -
  (Optional)
  A filesystem backed by a Network File System share. This filesystem requires the
  run.googleapis.com/execution-environment annotation to be unset or set to "gen2"
  Structure is [documented below](#nested_nfs).


<a name="nested_secret"></a>The `secret` block supports:

* `secret_name` -
  (Required)
  The name of the secret in Cloud Secret Manager. By default, the secret
  is assumed to be in the same project.
  If the secret is in another project, you must define an alias.
  An alias definition has the form:
  {alias}:projects/{project-id|project-number}/secrets/{secret-name}.
  If multiple alias definitions are needed, they must be separated by
  commas.
  The alias definitions must be set on the run.googleapis.com/secrets
  annotation.

* `default_mode` -
  (Optional)
  Mode bits to use on created files by default. Must be a value between 0000
  and 0777. Defaults to 0644. Directories within the path are not affected by
  this setting. This might be in conflict with other options that affect the
  file mode, like fsGroup, and the result can be other mode bits set.

* `items` -
  (Optional)
  If unspecified, the volume will expose a file whose name is the
  secret_name.
  If specified, the key will be used as the version to fetch from Cloud
  Secret Manager and the path will be the name of the file exposed in the
  volume. When items are defined, they must specify a key and a path.
  Structure is [documented below](#nested_items).


<a name="nested_items"></a>The `items` block supports:

* `key` -
  (Required)
  The Cloud Secret Manager secret version.
  Can be 'latest' for the latest value or an integer for a specific version.

* `path` -
  (Required)
  The relative path of the file to map the key to.
  May not be an absolute path.
  May not contain the path element '..'.
  May not start with the string '..'.

* `mode` -
  (Optional)
  Mode bits to use on this file, must be a value between 0000 and 0777. If
  not specified, the volume defaultMode will be used. This might be in
  conflict with other options that affect the file mode, like fsGroup, and
  the result can be other mode bits set.

<a name="nested_empty_dir"></a>The `empty_dir` block supports:

* `medium` -
  (Optional)
  The medium on which the data is stored. The default is "" which means to use the node's default medium. Must be an empty string (default) or Memory.

* `size_limit` -
  (Optional)
  Limit on the storage usable by this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. This field's values are of the 'Quantity' k8s type: https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/. The default is nil which means that the limit is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes/#emptydir.

<a name="nested_csi"></a>The `csi` block supports:

* `driver` -
  (Required)
  Unique name representing the type of file system to be created. Cloud Run supports the following values:
    * gcsfuse.run.googleapis.com: Mount a Google Cloud Storage bucket using GCSFuse. This driver requires the
      run.googleapis.com/execution-environment annotation to be unset or set to "gen2"

* `read_only` -
  (Optional)
  If true, all mounts created from this volume will be read-only.

* `volume_attributes` -
  (Optional)
  Driver-specific attributes. The following options are supported for available drivers:
    * gcsfuse.run.googleapis.com
      * bucketName: The name of the Cloud Storage Bucket that backs this volume. The Cloud Run Service identity must have access to this bucket.

<a name="nested_nfs"></a>The `nfs` block supports:

* `server` -
  (Required)
  IP address or hostname of the NFS server

* `path` -
  (Required)
  Path exported by the NFS server

* `read_only` -
  (Optional)
  If true, mount the NFS volume as read only in all mounts. Defaults to false.

- - -


* `traffic` -
  (Optional)
  Traffic specifies how to distribute traffic over a collection of Knative Revisions
  and Configurations
  Structure is [documented below](#nested_traffic).

* `template` -
  (Optional)
  template holds the latest specification for the Revision to
  be stamped out. The template references the container image, and may also
  include labels and annotations that should be attached to the Revision.
  To correlate a Revision, and/or to force a Revision to be created when the
  spec doesn't otherwise change, a nonce label may be provided in the
  template metadata. For more details, see:
  https://github.com/knative/serving/blob/main/docs/client-conventions.md#associate-modifications-with-revisions
  Cloud Run does not currently support referencing a build that is
  responsible for materializing the container image from source.
  Structure is [documented below](#nested_template).

* `metadata` -
  (Optional)
  Metadata associated with this Service, including name, namespace, labels,
  and annotations.
  Structure is [documented below](#nested_metadata).

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

* `autogenerate_revision_name` - (Optional) If set to `true`, the revision name (template.metadata.name) will be omitted and
autogenerated by Cloud Run. This cannot be set to `true` while `template.metadata.name`
is also set.
(For legacy support, if `template.metadata.name` is unset in state while
this field is set to false, the revision name will still autogenerate.)


<a name="nested_metadata"></a>The `metadata` block supports:

* `labels` -
  (Optional)
  Map of string keys and values that can be used to organize and categorize
  (scope and select) objects. May match selectors of replication controllers
  and routes.
  **Note**: This field is non-authoritative, and will only manage the labels present in your configuration.
  Please refer to the field `effective_labels` for all of the labels present on the resource.

* `generation` -
  (Output)
  A sequence number representing a specific generation of the desired state.

* `resource_version` -
  (Output)
  An opaque value that represents the internal version of this object that
  can be used by clients to determine when objects have changed. May be used
  for optimistic concurrency, change detection, and the watch operation on a
  resource or set of resources. They may only be valid for a
  particular resource or set of resources.

* `self_link` -
  (Output)
  SelfLink is a URL representing this object.

* `uid` -
  (Output)
  UID is a unique id generated by the server on successful creation of a resource and is not
  allowed to change on PUT operations.

* `namespace` -
  (Optional)
  In Cloud Run the namespace must be equal to either the
  project ID or project number.

* `annotations` -
  (Optional)
  Annotations is a key value map stored with a resource that
  may be set by external tools to store and retrieve arbitrary metadata.
  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations
  **Note**: The Cloud Run API may add additional annotations that were not provided in your config.
  If terraform plan shows a diff where a server-side annotation is added, you can add it to your config
  or apply the lifecycle.ignore_changes rule to the metadata.0.annotations field.
  Annotations with `run.googleapis.com/` and `autoscaling.knative.dev` are restricted. Use the following annotation
  keys to configure features on a Service:
  - `run.googleapis.com/binary-authorization-breakglass` sets the [Binary Authorization breakglass](https://cloud.google.com/sdk/gcloud/reference/run/deploy#--breakglass).
  - `run.googleapis.com/binary-authorization` sets the [Binary Authorization](https://cloud.google.com/sdk/gcloud/reference/run/deploy#--binary-authorization).
  - `run.googleapis.com/client-name` sets the client name calling the Cloud Run API.
  - `run.googleapis.com/custom-audiences` sets the [custom audiences](https://cloud.google.com/sdk/gcloud/reference/alpha/run/deploy#--add-custom-audiences)
    that can be used in the audience field of ID token for authenticated requests.
  - `run.googleapis.com/description` sets a user defined description for the Service.
  - `run.googleapis.com/ingress` sets the [ingress settings](https://cloud.google.com/sdk/gcloud/reference/run/deploy#--ingress)
    for the Service. For example, `"run.googleapis.com/ingress" = "all"`.
  - `run.googleapis.com/launch-stage` sets the [launch stage](https://cloud.google.com/run/docs/troubleshooting#launch-stage-validation)
    when a preview feature is used. For example, `"run.googleapis.com/launch-stage": "BETA"`
  **Note**: This field is non-authoritative, and will only manage the annotations present in your configuration.
  Please refer to the field `effective_annotations` for all of the annotations present on the resource.

* `terraform_labels` -
  (Output)
  The combination of labels configured directly on the resource
   and default labels configured on the provider.

* `effective_labels` -
  (Output)
  All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.

* `effective_annotations` -
  (Output)
  All of annotations (key/value pairs) present on the resource in GCP, including the annotations configured through Terraform, other clients and services.

## Attributes Reference

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

* `id` - an identifier for the resource with format `locations/{{location}}/namespaces/{{project}}/services/{{name}}`

* `status` -
  The current status of the Service.
  Structure is [documented below](#nested_status).


<a name="nested_status"></a>The `status` block contains:

* `conditions` -
  (Output)
  Array of observed Service Conditions, indicating the current ready state of the service.
  Structure is [documented below](#nested_conditions).

* `url` -
  (Output)
  From RouteStatus. URL holds the url that will distribute traffic over the provided traffic
  targets. It generally has the form
  https://{route-hash}-{project-hash}-{cluster-level-suffix}.a.run.app

* `observed_generation` -
  (Output)
  ObservedGeneration is the 'Generation' of the Route that was last processed by the
  controller.
  Clients polling for completed reconciliation should poll until observedGeneration =
  metadata.generation and the Ready condition's status is True or False.

* `latest_created_revision_name` -
  (Output)
  From ConfigurationStatus. LatestCreatedRevisionName is the last revision that was created
  from this Service's Configuration. It might not be ready yet, for that use
  LatestReadyRevisionName.

* `latest_ready_revision_name` -
  (Output)
  From ConfigurationStatus. LatestReadyRevisionName holds the name of the latest Revision
  stamped out from this Service's Configuration that has had its "Ready" condition become
  "True".

* `traffic` -
  (Output)
  Traffic specifies how to distribute traffic over a collection of Knative Revisions
  and Configurations
  Structure is [documented below](#nested_traffic).


<a name="nested_conditions"></a>The `conditions` block contains:

* `message` -
  (Output)
  Human readable message indicating details about the current status.

* `status` -
  (Output)
  Status of the condition, one of True, False, Unknown.

* `reason` -
  (Output)
  One-word CamelCase reason for the condition's current status.

* `type` -
  (Output)
  Type of domain mapping condition.

<a name="nested_traffic"></a>The `traffic` block contains:

* `revision_name` -
  (Output)
  RevisionName of a specific revision to which to send this portion of traffic.

* `percent` -
  (Output)
  Percent specifies percent of the traffic to this Revision or Configuration.

* `tag` -
  (Output)
  Tag is optionally used to expose a dedicated url for referencing this target exclusively.

* `latest_revision` -
  (Output)
  LatestRevision may be optionally provided to indicate that the latest ready
  Revision of the Configuration should be used for this traffic target. When
  provided LatestRevision must be true if RevisionName is empty; it must be
  false when RevisionName is non-empty.

* `url` -
  (Output)
  URL displays the URL for accessing tagged traffic targets. URL is displayed in status,
  and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname,
  but may not contain anything else (e.g. basic auth, url path, etc.)

## 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


Service can be imported using any of these accepted formats:

* `locations/{{location}}/namespaces/{{project}}/services/{{name}}`
* `{{location}}/{{project}}/{{name}}`
* `{{location}}/{{name}}`


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

```tf
import {
  id = "locations/{{location}}/namespaces/{{project}}/services/{{name}}"
  to = google_cloud_run_service.default
}
```

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

```
$ terraform import google_cloud_run_service.default locations/{{location}}/namespaces/{{project}}/services/{{name}}
$ terraform import google_cloud_run_service.default {{location}}/{{project}}/{{name}}
$ terraform import google_cloud_run_service.default {{location}}/{{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).
