Terraform Brew

Posted on  by admin

Infracost shows cloud cost estimates for infrastructure-as-code projects such as Terraform. It helps DevOps, SRE and developers to quickly see a cost breakdown and compare different options upfront.

  1. Upgrade Terraform Version
  2. Terraform Bare Metal Provider
  3. Terraform Prevent Destroy

Homebrew’s package index. Tool to build, change, and version infrastructure. Linuxbrew terraform. Language English. Linuxbrew terraform Addeddate 2021-04-07 17:08:23 Identifier linuxbrew-terraform Scanner Internet Archive Python library 1.9.4. Plus-circle Add Review. Reviews There are no reviews yet. Be the first one to write a review. Imperial Coffee Stout. In collaboration with Onyx Coffee and hip-hop artist, Propaganda. We used their collaboration coffee to create this Imperial Stout. Terraform is distributed as a single binary. Install Terraform by unzipping it and moving it to a directory included in your system's PATH. You can find the SHA256 checksums for Terraform 0.15.0 online and you can verify the checksums signature file which has been signed using HashiCorp's GPG key. I have installed Terraform v0.11.13 via homebrew and as recommended by terraform I want to ugprade to version v0.11.14 before doing the major upgrade to v0.12.0. When I run brew upgrade terraform or download the Mac package from the terraform website it would immediately update my terraform version to v0.12.0 I think.

If you're upgrading from an older version to v0.8, please see the migration guide.


1. Install Infracost#

Assuming Terraform is already installed, get the latest Infracost release:

  • macOS Homebrew
  • macOS manual
  • Linux
  • Docker
  • Windows
Terraform Brew

Subsequent updates can be installed in the usual way: brew upgrade infracost (you might need brew update first if your brew isn't up-to-date)

# Downloads the CLI based on your OS/arch and puts it in /usr/local/bin
curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh sh
# Downloads the CLI based on your OS/arch and puts it in /usr/local/bin
curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh sh
-e INFRACOST_API_KEY=see_following_step_on_how_to_get_this
-v $PWD/:/code/ infracost/infracost breakdown --path /code/
# Add other required flags/envs for Infracost or Terraform
# For example, these might be required if you are using AWS assume-role:

Download and unzip the latest release. Rename the file infracost-windows-amd64 to infracost.exe, then run it from the Command Prompt or Powershell using .infracost.exe --no-color alongside other required commands/flags (color output has a bug we need to fix on Windows). You should also move the exe file to a folder that is in your PATHenvironment variable, e.g. C:Windows.

2. Get API key#

Register for a free API key:

The key is saved in ~/.config/infracost/credentials.yml.

3. Run it#

Run Infracost using our example Terraform project to see how it works:

git clone https://github.com/infracost/example-terraform.git
infracost breakdown --path .
# Show diff of monthly costs, edit the yml file and re-run to compare costs
infracost diff --path . --sync-usage-file --usage-file infracost-usage.yml

Use our CI/CD integrations to automatically add pull request comments showing cost estimate diffs.


As mentioned in the FAQs, no cloud credentials, secrets, tags or resource identifiers are sent to the Cloud Pricing API. That API does not become aware of your cloud spend; it simply returns cloud prices to the CLI so calculations can be done on your machine. Infracost does not make any changes to your Terraform state or cloud resources.

The infracost CLI has the following main commands. Use the --path flag to point to a Terraform directory or plan JSON file:

  • breakdown: show full breakdown of costs
  • diff: show diff of monthly costs between current and planned state

If your repo has multiple Terraform projects or workspaces, use an Infracost config file to define them; their results will be combined into the same breakdown or diff output.

Terraform directory#


As shown below, any required Terraform flags can be passed using --terraform-plan-flags. The --terraform-workspace flag can be used to define a workspace.

Internally Infracost runs Terraform init, plan and show; Terraform init requires cloud credentials to be set, e.g. via the usual AWS_ACCESS_KEY_ID or GOOGLE_CREDENTIALS environment variables.

infracost breakdown --path /code --terraform-plan-flags '-var-file=my.tfvars'
infracost diff --path /code --terraform-plan-flags '-var-file=my.tfvars'

Terraform plan JSON#

Upgrade Terraform Version

Point to a Terraform plan JSON file using --path. This implies that Terraform init has been run, thus Infracost just runs Terraform show, which does not require cloud creds to be set.

terraform init
terraform show -json tfplan.binary > plan.json
infracost breakdown --path plan.json
infracost diff --path plan.json

See the advanced usage guide for other usage options.

Useful options#

Run infracost breakdown --help to see the available options, which include:

--terraform-workspace Terraform workspace to use. Applicable when path is a Terraform directory
--format Output format: json, table, html (default 'table')
--config-file Path to Infracost config file. Cannot be used with path, terraform* or usage-file flags
--usage-file Path to Infracost usage file that specifies values for usage-based resources
--sync-usage-file Sync usage-file with missing resources, needs usage-file too (experimental)
--show-skipped Show unsupported resources, some of which might be free
--log-level Use 'debug' to troubleshoot, can be set to 'info' or 'warn' in CI/CD systems to reduce noise, turns off spinners in output

The infracost diff --help and infracost output --help commands show related options.


Terraform is an open source tool created by HashiCorp to define infrastructure as code using a simple, declarative language called HCL . Terraform is used to deploy and manage infrastructure across a variety of cloud providers & virtualization platforms. It can be used to deploy infrastructure to all major cloud providers such as Azure, AWS, Digital ocean, and virtualization platforms such as VMware, Open stack, and others.

Terraform code is written in the HashiCorp Configuration Language (HCL) in files with the extension .tf. It is a declarative language, so your program needs to describe the infrastructure you want and Terraform will figure out how to create it. Using Terraform, we can create, configure, or delete resources. Terraform allows automatic resource provisioning by building dependency graphs. Compared to low-level REST APIs, scripting languages and SDKs, Terraform has a clean, high-level API. The state of your infrastructure is described, stored, versioned, and shared.

Installing Terraform

Terraform is remarkably simple to get started with on any platform. To install Terraform on windows simply head over to the terraform downloads page here and download the zip file. Extract the binary to a folder. Add the folder to the path environment variable so that you can execute it from anywhere on the command line. If you use chocolatey then use the below command

Choco install terraform -y

On macOS we can use homebrew to install terraform using the below command

brew install terraform

Terraform Components

Before starting off on terraform it is essential to understand the basic building blocks needed to create a terraform script to provision and deploy resources.


The provider is the connector to the underlying infrastructure you want to manage such as AWS, Azure, or a variety of other Cloud, network, storage, and SaaS services. A provider is responsible for understanding the API interactions and exposing the resources for the chosen platform. This is how your declarative code will interact with the management API of whichever platform you are building on. They provide configuration like connection details and authentication credentials. They provide the abstraction layer between Terraform’s configuration language and the management of resources within the service itself. Providers are not shipped with Terraform. To download the necessary providers, we need to run the terraform init command which installs any required providers. The provider block must be declared in code, though it can have varying degrees of configuration. A single set of configuration files/deployment can use more than a single provider.

To connect to AWS we need to use the below provider code

All the required variables in the provider block can be replaced with environment variables to prevent committing secrets to the code repository. The below azure provider block has all its connection variables stored as environment variables ARM_SUBSCRIPTION_ID, ARM_CLIENT_ID, ARM_TENANT_ID etc.

We can create a service principal that we can use as the identity used by the terraform scripts to create the necessary resources. We can create a service principal using the azure CLI command below. The below code creates a service principal with a contributor role with the scope restricted to the subscription indicated by the SUBSCRIPTION_ID.

This code outputs all the details needed to configure the azure provider similar to the below json payload.

“appId”: “00000000-0000-0000-0000-000000000000”,
“displayName”: “azure-cli-2020-11-09-03-10-58”,
“name”: “http://azure-cli-2020-11-09-03-10-58”,
“password”: “0000-0000-0000-0000-000000000000”,
“tenant”: “00000000-0000-0000-0000-000000000000”

We can now export these to setup the terraform environment variables as below

A full list of the available providers is on the terraform website here.


Resources are the basic building blocks in a Terraform-defined deployment. Resources correspond to several kinds of provider-based resources. Resources represent the infrastructure components you want to manage – VNets, VPC’s, networks, firewalls, DNS entries, etc. The parameters of a resource are reflective of that particular class of resource. The resource object is constructed of a type, name, and a block containing the configuration of the resource. There are, however, “meta-arguments” that Terraform makes available for all resources. An example of three different resources namely resource group, vnet and a subnet in Azure is below.

Brew terraform-docs
View this gist on GitHub

The first type of resource here is an azure resource group. Each type of the resource is linked to a provider; you can tell which by the leftmost value in the type, here azurerm. This indicates that this type of resource is provided by the azurerm provider, hence it is denoted as azurerm_resource-group. The name of the resource is specified next. This name is defined by you—here we’ve named this rg. The name of the resource should describe what the resource is or does. The combination of type and name must be unique in your configuration. Hence there can be only one resource group named rg in your configuration.


The data elements are optional elements and are primarily data sources. Data sources provide a mechanism to gather data from the provider. A data source represents a piece of read-only information that is fetched from the provider every time you run Terraform. It is a mechanism to query the provider’s APIs for data and to make that data available to the rest of your Terraform code. Data sources provide a mechanism to gather data from the provider. A data source represents a piece of read-only information that is fetched from the provider every time you run Terraform. Once you have defined a data source, you can use the data elsewhere in your Terraform configuration. Each Terraform provider exposes a variety of data sources. Data sources are most powerful when retrieving information about dynamic entities – those whose properties change value often. e.g AMI id’s, regions etc.

Terraform Bare Metal Provider

The above code sample shows a data source to list azure subscriptions.

The above code sample shows a data source to list AMI’s in AWS with additional filters.


Variables in Terraform are a fantastic way to define centrally controlled reusable values. The information in Terraform variables is saved independently from the deployment plans, which makes the values easy to read and edit from a single file. Variables in Terraform represent parameters for Terraform modules. A variable is defined in Terraform by using a variable block with a label. The label must be a unique name, you cannot have variables with the same name in a configuration. It is also good practice to include a description and type. The variable type specifies the type constraint that the defined variable will accept.

In the above example we have two variables, for location and vnet address space. The location variable is of type string and has a default value of australiaeast. The vnet_address_space variable is of type list and allows us to define a list of ip address ranges with a single default of

The resources example above can now be modified to use these variables as shown below

The above example now uses variables to define the location of the resources and the address space of the virtual network.

Depending on the usage, the variables are divided into inputs and outputs. The input variables are used to define values that configure your infrastructure. These values can be used repeatedly without having to remember their every occurrence in the event it needs to be updated. For defining input variables, it’s typical to create a separate variables.tf file and store the variable configurations in there.

Input variables can be assigned in many ways. They can be passed in when calling terraform apply/plan using the -var option. If we have many variables, then we can use a variables definition file generally named terraform.tfvars to assign variables. Terraform will automatically load variables from the variables definition file if it is named terraform.tfvars and placed in the same directory as the other tf files. The below example shows the input variables defined previously passed in as arguments to terraform apply

Output variables, in contrast, are used to get information about the infrastructure after deployment. These can be useful for passing on information such as IP addresses for connecting to the server.

In the above example we have a resource which defines a public IP address. We also have an output variable called pip which can be used to reference the public IP address created by the resource. A complete code sample to standup a Windows virtual machine in Azure using Terraform is here.

In this post we looked at the basics of terraform and the HCL language. In the next post we will dig into terraform lifecycle and state management.

Photo by hohyeong lee on Unsplash

Terraform - Getting Started

Terraform Prevent Destroy