I'm creating a GCP buckets with for_each loop, and wanted to import the existing buckets into my terraform state
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# google_storage_bucket.buckets["a-test-test-test"] will be created
+ resource "google_storage_bucket" "buckets" {
+ bucket_policy_only = (known after apply)
+ force_destroy = false
+ id = (known after apply)
+ location = "US"
+ name = "a-test-test-test"
+ project = "xxx"
+ self_link = (known after apply)
+ storage_class = "STANDARD"
+ uniform_bucket_level_access = false
+ url = (known after apply)
+ versioning {
+ enabled = true
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
Changes to Outputs:
~ urls = [
- "gs://a-test-test-test",
+ (known after apply),
]
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
google_storage_bucket.buckets["a-test-test-test"]: Creating...
Error: googleapi: Error 409: You already own this bucket. Please select another name., conflict
The resource already exists but that's fine, I can just import it, question is how
because running it like this
MacBook-Pro% terragrunt import google_storage_bucket.buckets a-test-test-test
...
Acquiring state lock. This may take a few moments...
google_storage_bucket.buckets: Importing from ID "a-test-test-test"...
google_storage_bucket.buckets: Import prepared!
Prepared google_storage_bucket for import
google_storage_bucket.buckets: Refreshing state... [id=a-test-test-test]
Import successful!
seems to work, but it imported it 'wrongly'
terragrunt state list
...
google_storage_bucket.buckets
its show in my tfstate, but it should be like this
google_storage_bucket.buckets["a-test-test-test"]
because if I run now apply - it says it wants to delete the google_storage_bucket.buckets
and create google_storage_bucket.buckets["a-test-test-test"]
google_storage_bucket.buckets: Refreshing state... [id=a-test-test-test]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
- destroy
Terraform will perform the following actions:
# google_storage_bucket.buckets will be destroyed
- resource "google_storage_bucket" "buckets" {
- bucket_policy_only = false -> null
- default_event_based_hold = false -> null
- force_destroy = false -> null
- id = "a-test-test-test" -> null
- labels = {} -> null
- location = "US" -> null
- name = "a-test-test-test" -> null
- project = "xxx" -> null
- requester_pays = false -> null
- self_link = "https://www.googleapis.com/storage/v1/b/a-test-test-test" -> null
- storage_class = "STANDARD" -> null
- uniform_bucket_level_access = false -> null
- url = "gs://a-test-test-test" -> null
- versioning {
- enabled = true -> null
}
}
# google_storage_bucket.buckets["a-test-test-test"] will be created
+ resource "google_storage_bucket" "buckets" {
+ bucket_policy_only = (known after apply)
+ force_destroy = false
+ id = (known after apply)
+ location = "US"
+ name = "a-test-test-test"
+ project = "xxx"
+ self_link = (known after apply)
+ storage_class = "STANDARD"
+ uniform_bucket_level_access = false
+ url = (known after apply)
+ versioning {
+ enabled = true
}
}
Plan: 1 to add, 0 to change, 1 to destroy.
Changes to Outputs:
+ urls = [
+ (known after apply),
]
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Any thoughts how to import into a for_each in terragrunt ?
I tried the
terragrunt import google_storage_bucket.buckets a-test-test-test
terragrunt import google_storage_bucket.buckets.a-test-test-test a-test-test-test
terragrunt import google_storage_bucket.buckets["a-test-test-test"] a-test-test-test
terragrunt import google_storage_bucket.buckets[\"a-test-test-test\"] a-test-test-test
and noone work just leaving me with error
zsh: no matches found: google_storage_bucket.buckets["a-test-test-test"]
while the first option terragrunt import google_storage_bucket.buckets a-test-test-test
, imported (aka. worked) but not the right way
The terraform code is like so:
inputs = {
project_id = "${local.project_id}"
{
name = "a-test-test-test"
location = "US"
}
}
locals {
buckets = {for b in jsondecode(var.buckets) : b.name => b }
}
variable "buckets" {
description = "The name of the bucket."
}
resource "google_storage_bucket" "buckets" {
for_each = local.buckets
name = each.key
project = var.project_id
location = each.value.location