In the previous series, we covered how to get started with Terraform Cloud and setup VCS with our source repository, In this post, we will look at how we can use “trigger” capability for dependent workspaces/stack.
For the purpose of the demo, I will create the following resources by using the trigger feature of the TF cloud and in the following order of stack:
This will create the required network i.e VPC, subnets, IGW, SG resource to create AWS EC2 instance and other resources that require a network.
This will create an application-specific security group for the purpose of the demo
Additional resources needed to support the application i.e. S3 buckets, policies, etc.
Putting it all together, here how the visualization looks like below:
Essentially, we are sort of creating a job dependency, but my experience with the trigger has been mixed as there seem to be a lot of limitations with checks and balances. In my opinion, the workflow above is good for a repeatable process where you don’t care if the process is executed multiple times and you expect the same result every time regardless of number of executions.
What I experienced is that if you run into an error with a parent job during the apply phase, TF cloud will still trigger the jobs downstream, hence there seems to be duplication or no way to tell the downstream job if the parent fails. However, regardless of limitations, it is still good feature allowing you to setup simple chaining. If you need a more task-driven setup, in my opinion, Gitlab CI/CD is a better tool.
Now let’s look at the workspaces and how to setup the trigger for child jobs:
If we look at the 1-poc-network workspace, under the run trigger option we have the option to attach child workspace.
Note: Even if the run trigger is setup, a child job can be executed by itself or via VCS code commit.
Notice that I don’t have trigger setup on the parent job, that is because trigger needs to be executed from 2-poc-security-groups when 1-poc-network executed! and yes, I know it is confusing as it took me by surprise too!
So, let’s look at the trigger properties for 2-poc-security-groups:
So, basically we are saying when 1-poc-network job is executed, TF Cloud should also execute 2-poc-security-groups. Now, let’s also look at the 3-poc-buckets:
Now you get the idea of how the flow works! Also, if you are planning on taking the Hashicorp Terraform Associate exam, knowing TF cloud knowledge is a plus and will help pass the exam. I will do another post on TF Associate exam,
Trigger the parent job
Now – let me trigger the job (in this case from git repo commit) – as soon as I commit Terraform job is scheduled and executed
Noticed, it picked up the trigger and TF cloud will execute the dependent workspace after the apply is completed for the source job.
Similarly like before, 2-poc-security-group also detected the downstream trigger:
Now, noticed that there is nothing to do as my bucket was already created. However, I changed the name on the bucket in repo and the job still executed independently.
Terraform workspace trigger feature allows users to create stack dependency when working with a large stack. This good method when the user needs to create multiple workspaces connected and suppose you may be changing dependent resources that require complete teardown and re-create.