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
- Configured GCP provider in your Terraform configuration
- Appropriate GCP permissions
- 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
- **Identify Resource **: Determine the existing GCP resource you want to import
- **Create Configuration **: Add the resource configuration to your Terraform files
- **Run Import Command **: Execute the terraform import command with the appropriate resource address and ID
- **Verify State **: Check the imported state using:
terraform show
# or
terraform state show RESOURCE_ADDRESS
- **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