---
subcategory: "Cloud Spanner"
description: |-
 Collection of resources to manage IAM policy for a Spanner instance.
---

# IAM policy for Spanner Instances

Three different resources help you manage your IAM policy for a Spanner instance. Each of these resources serves a different use case:

* `google_spanner_instance_iam_policy`: Authoritative. Sets the IAM policy for the instance and replaces any existing policy already attached.

~> **Warning:** It's entirely possibly to lock yourself out of your instance using `google_spanner_instance_iam_policy`. Any permissions granted by default will be removed unless you include them in your config.

* `google_spanner_instance_iam_binding`: Authoritative for a given role. Updates the IAM policy to grant a role to a list of members. Other roles within the IAM policy for the instance are preserved.
* `google_spanner_instance_iam_member`: Non-authoritative. Updates the IAM policy to grant a role to a new member. Other members for the role for the instance are preserved.

~> **Note:** `google_spanner_instance_iam_policy` **cannot** be used in conjunction with `google_spanner_instance_iam_binding` and `google_spanner_instance_iam_member` or they will fight over what your policy should be.

~> **Note:** `google_spanner_instance_iam_binding` resources **can be** used in conjunction with `google_spanner_instance_iam_member` resources **only if** they do not grant privilege to the same role.

## google\_spanner\_instance\_iam\_policy

```hcl
data "google_iam_policy" "admin" {
  binding {
    role = "roles/editor"

    members = [
      "user:jane@example.com",
    ]
  }
}

resource "google_spanner_instance_iam_policy" "instance" {
  instance    = "your-instance-name"
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google\_spanner\_instance\_iam\_binding

```hcl
resource "google_spanner_instance_iam_binding" "instance" {
  instance = "your-instance-name"
  role     = "roles/spanner.databaseAdmin"

  members = [
    "user:jane@example.com",
  ]
}
```

## google\_spanner\_instance\_iam\_member

```hcl
resource "google_spanner_instance_iam_member" "instance" {
  instance = "your-instance-name"
  role     = "roles/spanner.databaseAdmin"
  member   = "user:jane@example.com"
}
```

## Argument Reference

The following arguments are supported:

* `instance` - (Required) The name of the instance.

* `member/members` - (Required) Identities that will be granted the privilege in `role`.
  Each entry can have one of the following values:
  * **allUsers**: A special identifier that represents anyone who is on the internet; with or without a Google account.
  * **allAuthenticatedUsers**: A special identifier that represents anyone who is authenticated with a Google account or a service account.
  * **user:{emailid}**: An email address that represents a specific Google account. For example, alice@gmail.com or joe@example.com.
  * **serviceAccount:{emailid}**: An email address that represents a service account. For example, my-other-app@appspot.gserviceaccount.com.
  * **group:{emailid}**: An email address that represents a Google group. For example, admins@example.com.
  * **domain:{domain}**: A G Suite domain (primary, instead of alias) name that represents all the users of that domain. For example, google.com or example.com.

* `role` - (Required) The role that should be applied. Only one
    `google_spanner_instance_iam_binding` can be used per role. Note that custom roles must be of the format
    `[projects|organizations]/{parent-name}/roles/{role-name}`.

* `policy_data` - (Required only by `google_spanner_instance_iam_policy`) The policy data generated by
  a `google_iam_policy` data source.

* `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:

* `etag` - (Computed) The etag of the instance's IAM policy.

## Import

-> **Custom Roles**: If you're importing a IAM resource with a custom role, make sure to use the
 full name of the custom role, e.g. `[projects/my-project|organizations/my-org]/roles/my-custom-role`.

### Importing IAM members

IAM member imports use space-delimited identifiers that contains the `instance`, `role`, and `member`. For example:

* `"{{project}}/{{instance}} roles/viewer user:foo@example.com"`

An [`import` block](https://developer.hashicorp.com/terraform/language/import) (Terraform v1.5.0 and later) can be used to import IAM members:

```tf
import {
  id = "{{project}}/{{instance}} roles/viewer user:foo@example.com"
  to = google_spanner_instance_iam_member.default
}
```

The [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import) can also be used:

```
$ terraform import google_spanner_instance_iam_member.default "{{project}}/{{instance}} roles/viewer user:foo@example.com"
```

### Importing IAM bindings

IAM binding imports use space-delimited identifiers that contain the resource's `instance` and `role`. For example:

* `"{{project}}/{{instance}} roles/viewer"`

An [`import` block](https://developer.hashicorp.com/terraform/language/import) (Terraform v1.5.0 and later) can be used to import IAM bindings:

```tf
import {
  id = "{{project}}/{{instance}} roles/viewer"
  to = google_spanner_instance_iam_binding.default
}
```

The [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import) can also be used:

```
$ terraform import google_spanner_instance_iam_binding.default "{{project}}/{{instance}} roles/viewer"
```

### Importing IAM policies

IAM policy imports use the identifier of the Spanner Instances resource . For example:

* `{{project}}/{{instance}}`


An [`import` block](https://developer.hashicorp.com/terraform/language/import) (Terraform v1.5.0 and later) can be used to import IAM policies:

```tf
import {
  id = {{project}}/{{instance}}
  to = google_spanner_instance_iam_policy.default
}
```

The [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import) can also be used:

```
$ terraform import google_spanner_instance_iam_policy.default {{project}}/{{instance}}
```