Totally Terraform (Or, Introducing Terraform DevOps Cloud Engineer Proceedures to A Company) [Updated March 2022]
Want to share this post easily? Here's a Notion page!
9/20: Terraform is now OpenTofu
I got to teach myself Terraform, but that's what this entire blog is about; Teaching myself things and hoping for work sometimes to make money and being employed by multiple people.
You can be the next one!
Anyway, what do I like about Terraform? A lot. Including all the troubleshooting and digging into new things.
The Numbers on What Was Made:
Project: 1
Resources created: 7
- Virtual Machine
- Network Interface
- Virtual Network
- Security Rule attached to Security Group
- Security Group (with outputs)
- Subnet
- Public IP address
Many of these resources are attached to each other - The Network Interface is attached to the Virtual Machine, and they’re both in a Security Group which has Security Rules attached to it.
The Virtual Network is attached to the Subnet, and the Public IP address is attached to the Network Security Group. This way, The Virtual Machine has internet access, but also has rules about who can access it.
Variables Used: 3
TLDR? Check out the code on GitHub. There are even tiny bonuses, like bits that can be activated later. As of March 2022, It's been cleaned up to be easily readable, with added outputs.
Likes:
It clearly tells you what an error is! Troubleshooting was mostly a breeze, and since I wasn't getting [too] annoyed, I could more easily learn where the mistakes where. For instance, the
first line in the main code ('provider') - the azurerm
part is not a
random name;
provider "azurerm"
is an actual thing that connects to Azure. There is one for each cloud provider.
Variables make it easier to quickly swap out bits of code that may be account-specific over hardcoding. This way, you don’t need to replace us-east-1
multiple times.
You will need at least 3 files - the main code, the variables file, and the place to establish the variables. The main code is usually called [main.tf]
for clarity, but it’s not mandatory.
It doesn't tell you all the errors at once. If
you fix one, another pops up after terraform plan
is ran once more. It makes
troubleshooting easier to deal with when it's one problem at a time. You may prefer a long list of errors to deduce, so this is case by case.
Dislikes:
if you're a beginner, it can still be difficult to parse. I had to take some code snippets from the demo I used.
In another instance, it couldn't reference a count variable I had placed under another resource.
Why not? Keep reading below:
Troubleshooting:
Check out my live-post troubleshooting on a specific issue here.
Error: Network Interface “Net-Connection” (Resource Group “Admins”) was not found!
You look at this and think "Well, that's obvious."
Then you look at my code and see both aspects are there. The resource network interface and the variable that says "Admins is my resource group".
So, what's the actual problem?
-
What I initially thought was the problem (it wasn’t)
My environment was corrupted; It was looking for elements that weren't there, and wasn't trying to create them as it should.I had to make a new one with terraform workspace new [name].The fix was easy, but the error message was lacking.
It was a phenomenon known as Terraform Drift - When you create things in Terraform and delete them in Azure, Terraform is like "What, where's this resource? HELP ME! I CAN'T CONTINUE."
So while changing the workspace with terraform workspace new [name]
did work, I also went
into the state file and deleted the no-longer-existent resource which is not good practice, but it's learning practice.
Read my notes about solving the issue here.
Further Research Needed
The documentation I've found is a little unclear sometimes. Some parts of the code, It took more context clues to find out what meant what - and I'm still not 100% sure.
resource "azurerm_virtual_machine" "CloudskilsDevVM"
I'm pretty sure the name of the second part ("CloudskilsDevVM") would be the name, however, the next line in the brackets is
name = "cloudskillsvm"
So what is "CloudskilsDevVM"?
I still haven't figured it out, but my code works. So, whoo! Can't wait to learn more. This will come in handy when I build out Azure Companies.
If you’d like to build out a CI/CD Integration in Azure [and who wouldn’t?], check out this post by Spacelift.io.
CI/CDs help manage versions of your code, especially if you’re
continually making small changes to live resources and don’t want too
many ‘branches’ of code. This is part of an affiliation.
Comments
Post a Comment