85 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			85 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								tags: [AWS, IaC]
							 | 
						||
| 
								 | 
							
								created: Saturday, November 16, 2024
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Terraform
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Authentication
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Terraform will default to the currently active AWS user providing you have your
							 | 
						||
| 
								 | 
							
								[AWS credentials](/zk/AWS_CLI.md) set-up.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Creating resources
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Resources are specified in the `main.tf` file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Create a new S3 bucket:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```hcl
							 | 
						||
| 
								 | 
							
								resource "aws_s3_bucket" "my_new_bucket" {
							 | 
						||
| 
								 | 
							
								    bucket = "my-new-bucket"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								At this point the resource doesn't exist so there is no ARN or ID. When the
							 | 
						||
| 
								 | 
							
								resource is created (through `terraform apply`) Terraform receives this info
							 | 
						||
| 
								 | 
							
								from AWS and store it in a state file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This info can be retrieved with `terraform show`, e.g:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								resource "aws_s3_bucket" "my_new_bucket" {
							 | 
						||
| 
								 | 
							
								    id                    = "my-new-bucket"
							 | 
						||
| 
								 | 
							
								    arn                   = "arn:aws:s3:::my-new-bucket"
							 | 
						||
| 
								 | 
							
								    bucket                = "my-new-bucket"
							 | 
						||
| 
								 | 
							
								    bucket_domain_name    = "my-new-bucket.s3.amazonaws.com"
							 | 
						||
| 
								 | 
							
								 }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Standard sequence
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Make your `terraform` directory, then `cd` and:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Initialise project
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								terraform init
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This will create the file `.terraform.lock.hcl` which should be committed. Stuff
							 | 
						||
| 
								 | 
							
								in `.terraform/` can be git-ignored.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Check changes
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								terraform plan
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Providing you have written a `main.tf`. The command will list the proposed
							 | 
						||
| 
								 | 
							
								changes to your resources.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Apply changes
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								terraform apply
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Destroy the resource
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Typically when you want to do a clean recreate.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								terraform destoy
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Run with debug/logger
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								TF_LOG=DEBUG terraform apply
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Or use with other Terraform command, e.g. `destroy`, `refresh` - whatever is
							 | 
						||
| 
								 | 
							
								causing the problem.
							 |