Skip to main content

Why You See `this` in Terraform Modules — And Why You Should Use It Too

· 4 min read
Aqueeb
Enterprise Architect, Technology Enthusiast, & an Avid Motorcyclist

If you’ve explored the Azure Verified Modules (AVM), you may have noticed a consistent pattern in how resources are named: the use of this. Whether it’s a virtual network, a private DNS zone, or a key vault, many AVM modules name their primary resources simply as this.

At first glance, this might seem odd. Terraform lets you name your resources whatever you want — so why not something more descriptive?

As it turns out, this isn’t just a naming shortcut — it’s a thoughtful convention borrowed from mainstream programming languages, and it offers some practical benefits: improved readability, predictability, and reusability across Terraform modules.


Why Is this Used in Programming?​

If you've written code in Python, JavaScript, Java, or C#, you're already familiar with this — or something like it.

  • In Python, self is used to refer to the current instance of a class.
  • In JavaScript, this refers to the context in which a function was invoked.
  • In Java/C#, this is used to refer to the current object, often to distinguish between instance variables and function parameters.

In all these languages, this provides a clear and self-referential way to talk about the object in context. It's about scoping — avoiding confusion over which object or variable you're referring to.


The Terraform Parallel​

When writing Terraform modules, naming resources and data sources this is a simple but powerful pattern. Here's why:

  1. It's Clear and Predictable
    Inside a module, naming a resource this communicates that it's the main or only instance of its kind in that module. There's no need to name it something like primary, main_storage_account, or my_static_app.

  2. It Makes Modules More Reusable
    When you name every resource descriptively within a module, you're tying that resource to a specific use case. But a module should be generic. By naming a resource this, you're signaling that it could be anything — and you're keeping it flexible for reuse.

  3. It Reduces Noise
    When someone is consuming a module and sees outputs like data.azurerm_storage_account.this.id, they immediately know: this is the one that module defines.


What Problem Does this Solve?​

Terraform doesn't require you to name things a certain way. But conventions like this solve the problem of consistency and readability across a codebase. Just like how developers instinctively know what self or this means in other languages, Terraform users can quickly recognize what this refers to.

It helps answer the question:

Which resource is this referring to?
And the answer is:
The one and only one defined in this module.


When Not to Use this​

Like all conventions, this works best when used appropriately. You should not use this when:

  • You're managing multiple resources of the same type in the same module.
  • You need to distinguish between two similar resources (e.g., frontend_storage vs backend_storage).
  • It would make debugging or reading the code less intuitive for new developers.

What do others think?​

I thought I'd ask ChatGPT to find me links to similar opinions. Here's some of the research that ChatGPT did that supports the use of this in Terraform modules:

  • Anton Babenko's Terraform Best Practices — A leading community guide that explicitly recommends using this as the label for a module’s main or only resource when no other descriptive name applies.

  • Reddit: Usage of "this" in terraform — In this thread, HashiCorp engineer Martin Atkins (aka apparentlymart) explains that this is widely adopted as a convention for singleton resources, especially in reusable modules. He highlights its clarity and the lack of meaningful alternatives.

  • Medium: DevOps Mojo - Terraform Best Practices — A practitioner’s post reiterating that this provides clean naming and supports reusable modules without making assumptions about the resource’s purpose.

Across these sources, there's a consistent message: this helps authors write cleaner, more modular, and predictable infrastructure code. It mimics a convention that developers from other programming languages will already understand.


Final Thoughts​

Using this in Terraform modules is a small convention that pays off in clarity, simplicity, and consistency — especially when writing reusable modules. It's a nod to practices in object-oriented programming, and it makes modules feel more like black boxes with clean interfaces.

By adopting this where appropriate, you're not just writing Terraform — you're writing maintainable infrastructure code.

Let’s Connect​

If this post sparked any ideas, gave you food for thought, or you just want to chat more about Terraform best practices and how it looks like in practice in a large enterprise, I’d love to hear from you. Drop me a message on LinkedIn.

Thanks for reading!