learn-terraform-import
learn-terraform-import copied to clipboard
Learn how to import existing configuration into Terraform
Learn Terraform Import
Learn what Terraform import is and how to use it.
Follow along with the Learn Terraform Import tutorial.
Install prerequisites
- Terraform: https://www.terraform.io/downloads.html
- Docker: https://docs.docker.com/get-docker/
Create a docker container
-
Run this docker command to create a container with the latest nginx image.
docker run --name hashicorp-learn --detach --publish 8080:80 nginx:latest
-
Verify container is running by running
docker ps
or visiting0.0.0.0:8080
in your web browser.docker ps --filter "name=hashicorp-learn"
Import container resource
-
Initialize your workspace by running
terraform init
. -
Add empty resource stub to
docker.tf
for the container.resource "docker_container" "web" { }
-
Import the container into Terraform state.
terraform import docker_container.web $(docker inspect -f {{.ID}} hashicorp-learn)
-
Now the container is in your terraform configuration's state.
terraform show
-
Run
terraform plan
. Terraform shows errors for missing required arguments (image
,name
).terraform plan
-
Generate configuration and save it in
docker.tf
, replacing the empty resource created earlier.terraform show -no-color > docker.tf
-
Re-run
terraform plan
.terraform plan
-
Terraform will show warnings and errors about a deprecated attribute (
links
), and several read-only attributes (ip_address
,network_data
,gateway
,ip_prefix_length
,id
). Remove these attributes fromdocker.tf
. -
Re-run
terraform plan
.terraform plan
It should now execute successfully. The plan indicates that Terraform will update in place to add the
attach
,logs
,must_run
, andstart
attributes. Notice that the container resource will not be replaced. -
Apply the changes. Remember to confirm the run with a
yes
.terraform apply
-
There are now several attributes in
docker.tf
that are unnecessary because they are the same as their default values. After removing these attributes,docker.tf
will look something like the following.# docker_container.web: resource "docker_container" "web" { name = "hashicorp-learn" image = "sha256:9beeba249f3ee158d3e495a6ac25c5667ae2de8a43ac2a8bfd2bf687a58c06c9" ports { external = 8080 internal = 80 } }
-
Run
terraform plan
again to verify that removing these attributes did not change the configuration.terraform plan
Verify that your infrastructure still works as expected
$ docker ps --filter "name=hashicorp-learn"
You can revisit `0.0.0.0:8080` in your web browser to verify that it is
still up. Also note the "Status" - the container has been up and running
since it was created, so you know that it was not restarted when you
imported it into Terraform.
Create a Docker image resource
-
Retrieve the image's tag name by running the following command, replacing the sha256 value shown with the one from
docker.tf
.docker image inspect sha256:602e111c06b6934013578ad80554a074049c59441d9bcd963cb4a7feccede7a -f {{.RepoTags}}
-
Add the following configuration to your docker.tf file.
resource "docker_image" "nginx" { name = "nginx:latest" }
-
Run
terraform apply
to apply the changes. Remember to confirm the run with ayes
.terraform apply
-
Now that Terraform has created a resource for the image, refer to it in
docker.tf
like so:resource "docker_container" "web" { name = "hashicorp-learn" image = docker_image.nginx.latest # File truncated...
-
Verify that your configuration matches the current state.
terraform apply
Manage the container with Terraform
-
In your
docker.tf
file, change the container's external port from8080
to8081
.resource "docker_container" "web" { name = "hashicorp-learn" image = "sha256:602e111c06b6934013578ad80554a074049c59441d9bcd963cb4a7feccede7a5" ports { external = 8081 internal = 80 } }
-
Apply the change. Remember to confirm the run with a
yes
.terraform apply
-
Verify that the new container works by running
docker ps
or visiting0.0.0.0:8081
in your web browser.docker ps --filter "name=hashicorp-learn"
Destroy resources
-
Run
terraform destroy
to destroy the container. Remember to confirm destruction with ayes
.terraform destroy
-
Run
docker ps
to validate that the container was destroyed.docker ps --filter "name=hashicorp-learn"