Skip to main content

5. Terraform Import

terraform import allows you to import existing GCP resources into Terraform state, enabling you to manage pre-existing infrastructure through Terraform.

Basic Syntax​

terraform import [options] RESOURCE_ADDRESS ID

Prerequisites​

  1. Configured GCP provider in your Terraform configuration
  2. Appropriate GCP permissions
  3. Valid resource configuration in your Terraform files

Common Import Examples​

1. Compute Instance​

# Resource configuration
resource "google_compute_instance" "example" {
name = "example-instance"
machine_type = "e2-medium"
zone = "us-central1-a"
# ... other configurations
}

# Import command
terraform import google_compute_instance.example projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]

2. Cloud Storage Bucket​

# Resource configuration
resource "google_storage_bucket" "example" {
name = "example-bucket"
location = "US"
}

# Import command
terraform import google_storage_bucket.example [BUCKET_NAME]

3. VPC Network​

# Resource configuration
resource "google_compute_network" "example" {
name = "example-network"
auto_create_subnetworks = false
}

# Import command
terraform import google_compute_network.example [NETWORK_NAME]

4. Cloud SQL Instance​

# Resource configuration
resource "google_sql_database_instance" "example" {
name = "example-instance"
database_version = "MYSQL_5_7"
region = "us-central1"
}

# Import command
terraform import google_sql_database_instance.example [PROJECT_ID]:[INSTANCE_NAME]

Import Process Steps​

  1. **Identify Resource **: Determine the existing GCP resource you want to import
  2. **Create Configuration **: Add the resource configuration to your Terraform files
  3. **Run Import Command **: Execute the terraform import command with the appropriate resource address and ID
  4. **Verify State **: Check the imported state using:
terraform show
# or
terraform state show RESOURCE_ADDRESS
  1. **Apply Changes **: Run terraform plan/apply to ensure configuration matches the imported state

Few useful example of import commands:​

database imports:
terraform import module.database.google_sql_database_instance.connect-core-db projects/partner-payments-test/payhub-test

cloud task queue imports:
terraform import 'module.cloudtasks.google_cloud_tasks_queue.cloudtasks[\"GpiStatusUpdateTasks\"]' projects/partner-payments-test/locations/europe-west1/queues/GpiStatusUpdateTaskste'


subscriptions imports:
terraform import 'module.pubsub.google_pubsub_subscription.subscriptions[\"AdapterWebhook\"]' projects/partner-payments-test/subscriptions/AdapterWebhook
terraform import 'module.pubsub.google_pubsub_subscription.subscriptions[\"Tasks\"]' projects/partner-payments-test/subscriptions/Tasks
terraform import 'module.pubsub.google_pubsub_subscription.subscriptions[\"StatusUpdate\"]' projects/partner-payments-test/subscriptions/StatusUpdate

topic imports:
terraform import 'module.pubsub.google_pubsub_topic.topics[\"Tasks\"]' projects/partner-payments-test/topics/Tasks
terraform import 'module.pubsub.google_pubsub_topic.topics[\"StatusUpdates\"]' projects/partner-payments-test/topics/StatusUpdates
terraform import 'module.pubsub.google_pubsub_topic.topics[\"IncomingWebhooks\"]' projects/partner-payments-test/topics/IncomingWebhooks
terraform import 'module.pubsub.google_pubsub_topic.topics[\"Deadletter\"]' projects/partner-payments-test/topics/Deadletter
terraform import 'module.pubsub.google_pubsub_topic.topics[\"ContainerEvents\"]' projects/partner-payments-test/topics/ContainerEvents

iamrole:
terraform import 'module.pubsub.google_pubsub_subscription_iam_member.gcp_sa_pubsub_subscriber_subscriptions[\"AdapterWebhook\"]' "projects/partner-payments-test/subscriptions/AdapterWebhook roles/pubsub.subscriber serviceAccount:[email protected]"
terraform import 'module.pubsub.google_pubsub_subscription_iam_member.gcp_sa_pubsub_subscriber_subscriptions[\"Tasks\"]' 'projects/partner-payments-test/subscriptions/Tasks roles/pubsub.subscriber serviceAccount:[email protected]'
terraform import 'module.pubsub.google_pubsub_subscription_iam_member.gcp_sa_pubsub_subscriber_subscriptions[\"StatusUpdate\"]' 'projects/partner-payments-test/subscriptions/StatusUpdate roles/pubsub.subscriber serviceAccount:[email protected]'


remove:
terraform state rm 'module.pubsub.google_pubsub_subscription_iam_member.gcp_sa_pubsub_subscriber_subscriptions[\"StatusUpdate\"]'

move to new name in state file:
terraform state mv 'module.pubsub.google_pubsub_topic.Events' 'module.pubsub.google_pubsub_topic.topics[\"Events\"]'
terraform state mv 'module.pubsub.google_pubsub_topic.Events-error' 'module.pubsub.google_pubsub_topic.topics[\"Events-error\"]'
terraform state mv 'module.pubsub.google_pubsub_subscription.dead_letter' 'module.pubsub.google_pubsub_subscription.subscriptions[\"dead-letter\"]'

run:
terraform import -var-file ../../../../app/config/payhub.acceptance.tfvars.json 'module.cloudrun.google_cloud_run_service.cloud_run_services[\"adapter-service\"]' locations/europe-west4/namespaces/partner-payments-test/services/adapter-service

no-auth:
terraform import -var-file ../../../../app/config/payhub.acceptance.tfvars.json 'module.cloudrun.google_cloud_run_service_iam_policy.noauth[\"adapter-service\"]' projects/partner-payments-test/locations/europe-west4/services/adapter-service


iam service account:
terraform import -var-file ../../../../app/config/payhub.acceptance.tfvars.json 'module.iam.google_service_account.service_acccounts[\"payhub-backend\"]' projects/partner-payments-test/serviceAccounts/partnerpayments-backend@partner-payments-test.iam.gserviceaccount.com