How to debug logging in Terraform setting it to Trace
Tags: terraform, ec2, trace, logging
Published: 2023-10-11 23:21:37

Logging has to be turned on locally if you want to debug the issues during terraform plan or apply.

Terraform depends on two environment variables being configured. These two variables are **TF_LOG** and **TF_LOG_PATH**. I will be setting my **TF_LOG environment variable to the TRACE log** level and the **TF_LOG_PATH environment variable to the logs/terraform_logs.txt** file. You can set your TF_LOG environment variable to **DEBUG, INFO, WARN, or ERROR**. 

We will then deploy our resources and check to see if the log is created.


Please visit my **[GitHub Repository for Terraform articles](https://github.com/awsmine/Terraform_projects)** on various topics being updated on constant basis.

_**Let’s get started!**_


# Objectives:

**1.** Login to AWS Management Console

**2.** Create infrastructure for resources block

**3.** Under **terraform_files** resources directory - Create 3 files - ***`main.tf`***, ***`variables.tf`***, and ***`outputs.tf`***. 

**4.** Enable Debug Logging

**5.** Capture Logging

**6.** Terraform deployment


# Pre-requisites:
- AWS user account with admin access, not a root account.
- Cloud9 IDE with AWS CLI.

# Resources Used:
***[Terraform documentation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs).***
***[Terraform documentation for AMI](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami).***
***[Debugging Terraform](https://developer.hashicorp.com/terraform/internals/debugging)***
***[Implement logging-View all Terraform log output](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-logging)***


# Steps for implementation to this project:

## 1. Login to AWS Management Console
- Make sure you're in the N. Virginia (us-east-1) region

## 2. Create infrastructure for resources block

- Let’s create the following organizational structure as shown below.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rv4byy52zf3erphudmy.png)



## 3. Under **terraform_files** resources directory - Create 3 files - ***`main.tf`***, ***`variables.tf`***, and ***`outputs.tf`***.  

- **1. main.tf**

```
terraform {

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.23"
    }
  }

  required_version = ">= 0.14.9"
}

provider "aws" {
  profile = "default"
  region  = "us-east-1"
}

resource "aws_instance" "app_server" {
  ami           = var.instance_ami
  instance_type = "t3.micro"
  subnet_id     = var.subnet_id

  tags = {
    Name = var.instance_name
  }
}
```

- **2. variables.tf**

```
variable "instance_ami" {
  description = "Value of the AMI used for the EC2 instance"
  type        = string
  default     = "<DUMMY_VALUE_AMI>"
}

variable "instance_ami" {
  description = "Value of the AMI used for the EC2 instance"
  type        = string
  default     = "ami-0bb4c991fa89d4b9b"
}
```

```
variable "subnet_id" {
  description = "Value of the subnet id used for the EC2 instance"
  type        = string
  default     = "<DUMMY_VALUE_SUBNET_ID>"
}

variable "subnet_id" {
  description = "Value of the subnet id used for the EC2 instance"
  type        = string
  default     = "subnet-05f279c5812013c5e"
}
```

```
variable "instance_name" {
  description = "Value of the Name tag for the EC2 instance"
  type        = string
  default     = "MyInstance"
}
```

- **3. outputs.tf**

```
output "instance_id" {
  description = "ID of the EC2 instance"
  value       = aws_instance.app_server.id
}

output "instance_ip" {
  description = "Public IP address of the EC2 instance"
  value       = aws_instance.app_server.public_ip
}

output "instance_name" {
  description = "Name of the EC2 instance"
  value       = aws_instance.app_server.tags.Name
}
```

## 4. Enable Debug Logging

- For one time session where you need detailed log information

- 1. Set an environment variable for TF_LOG:

For PowerShell 

```
$env:TF_LOG=TRACE
```
For Bash

```
export TF_LOG=TRACE
```

- 2. Create the logs directory:

```
mkdir logs
```

- 3. Set an environment variable for TF_LOG_PATH to the logs directory:

For PowerShell 

```
$env:TF_LOG_PATH=terraform.txt
```

For Bash

```
export TF_LOG_PATH=logs/terraform_logs.txt
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w3j0jzb3ptwsxdnbzom0.png)


This outputs your logs to the terraform.txt file.

- 4. to verify that it worked.

For PowerShell 

```
> echo $env:TF_LOG
TRACE
> echo $env:TF_LOG_PATH
terraform.txt
```

For Bash

```
echo $TF_LOG
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gnaa7k9ybrewidosdtx.png)


```
echo $TF_LOG_PATH
``` 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/27nt27p0g98wlq8cav9a.png)


## 5. Capture Logging

- Check the formatting of your resources:
```
terraform fmt
```

- Initialize your working directory:

```
terraform init
```

- This should have generated some logs.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8iici3uju3ho5rsfhb72.png)


- Confirm the Log was Written to the Directory
- After your working directory is initialized, check your terraform_logs.txt file to confirm it contains logs:

```
tail -50 logs/terraform_logs.txt
```

- You should see that logs are successfully output to terraform_logs.txt.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dq1yze1hauo76irk1mqb.png)


## 6. Terraform deployment

- Check which version of Terraform you're running
- This is useful if you're submitting a bug report to troubleshoot a Terraform issue.

```
terraform version
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p34gb6rt8gjeglk6sxv4.png)


- Plan your Terraform deployment:

```
terraform plan
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vsc2cuhfgmwgw0lwvktf.png)


- Apply your Terraform deployment:
- When prompted to Enter a value, enter yes.

```
terraform apply
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/no5igimrsk4fwkhietb4.png)


- After the apply completes successfully, check your terraform_logs.txt file to confirm it now contains logs related to your apply:

```
tail -50 logs/terraform_logs.txt
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/avbu3lnwxugyzaxekqml.png)

- MyInstance


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yubm20absdk67xivy2gj.png)


# Cleanup

```
terraform destroy
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gud3c27gpb7iya5lywmj.png)



# What we have done so far

We have successfully enabled debug logging by setting the `TF_LOG` environment variable to the `TRACE` log level and setting `TF_LOG_PATH` environment variable to the `logs/terraform_logs.txt` file. Aftrwards, we have deployed our resources and then checked to see if the log was created.