Terraform Remote State Files
Link CloudTruth external parameter values to Terraform Remote State Files within S3.
Last updated
Link CloudTruth external parameter values to Terraform Remote State Files within S3.
Last updated
Copyright© 2023 CloudTruth
One practical use of CloudTruth external values is the ability to automatically reference Terraform state outputs. These outputs are normally generated and stored by Terraform in a file named terraform.tfstate.
HashiCorp provides the ability for Terraform state files to be stored remotely. AWS S3 is a common choice for backend remote storage, and is often considered a best practice, especially when working with multiple users that may depend upon Terraform state outputs for CI/CD.
Once CloudTruth external parameters referencing state files have been created, any parameter access will fetch the the value directly from the latest Terraform state on-demand! This includes parameter references from within the Template mechanism that enables you to generate configuration files per-environment as needed.
You may already have remote state stored in S3 which can be used directly with the CloudTruth AWS S3 Integration to assign state output as external values.
This walkthrough shows you how to setup a basic S3 bucket and deploy an EC2 instance to us-west-2 with a Terraform remote state file backend in S3 and reference the output as an external CloudTruth parameter value.
You can use an existing S3 bucket for your remote backend or deploy a new S3 bucket with a unique name.
Create an s3
directory, change into the directory and create a file to define the S3 infrastructure.
Open main.tf
, paste in the configuration below, save the file, and run terraform init
and terraform apply
.
Note the output name of your newly created S3 bucket to use in the terraform s3 backend configuration.
Create a remote-state
directory, change into the directory and create a file to define the infrastructure.
The following Terraform configuration specifies S3 as the backend for your state file. Open main.tf
and paste in the configuration below. Provide the bucket with YOUR_UNIQUE_BUCKET_NAME
, save the file, then run terraform init
and terraform apply
.
The EC2 instance will be created in us-west-2. Terraform will place the state file in the specified S3 bucket path demo/instance/terraform.tfstate
and provide outputs for the instance id
and public ip
.
Now that you have a remote state file in S3 and have configured the AWS S3 CloudTruth Integration, you can set your terraform.tfstate
outputs as CloudTruth External Values.
Set state as an External Value
As an example, while editing the External value of a parameter navigate to the S3 bucket destination path demo/instance/terraform.tfstate
in the S3 integration and use the JMESPATH selector outputs.instance_id.value
. Hit save to set the value to the instance id output from the remote state file.
Don't forget to cleanup your deploy infrastructure by executing a terraform destroy
in the S3
and remote-state
folders.
Terragrunt provides a quick start on creating a DRY remote_state configuration for the backend. You can use Terragrunt generated remote state with the CloudTruth AWS S3 Integration to assign state output as external values.
Following the Terragrunt quick start guide as an example we created the following folder structure which will configure an S3 bucket and deploy an instance with remote state using the deployed bucket.
The backend
configuration is defined once in the root stage terragrunt.hcl
file. It will create a dynamodb lock table called my-lock-table
and an S3 backend. You can update the bucket config with a unique name to follow along.
The instance folder contains a terragrunt.hcl
that contains the Terragrunt helper find_in_parent_folders()
which will inherit the remote_state
configuration from the root terragrunt.hcl file in the directory tree.
The instance folder also contains a main.tf
that will configure an EC2 instance in us-east-1 with outputs for the instance_id and public ip.
Now you can change directory to the instance folder and run terragrunt apply
.
Terragrunt creates an S3 bucket with your unique name and is a destination for the instance configuration terraform.tfstate file!
Now that you have a remote state file in S3 and have configured the AWS S3 CloudTruth Integration, you can set your terraform.tfstate
outputs as CloudTruth External Values.
Set state as an External Value
while editing the external value of a parameter navigate to the Terragrunt created S3 bucket destination path instance/terraform.tfstate
in the S3 integration and use the JMESPATH selector outputs.instance_id.value
. Hit save to set the value to the instance id output from the remote state file.
Don't forget to cleanup your deploy infrastructure by executing a terragrunt destroy
in the instance
folder. You will need to manually delete the Terragrunt created S3 bucket as the wrapper does not provide a way to delete generated backends.