quartz/content/notes/Terraform.md
2024-12-25 23:46:29 +01:00

101 lines
3.0 KiB
Markdown

---
title: Terraform
date: 2024-12-23
tags:
- cloud
- data
- IaC
---
# What is it
- Infrastructure as Code (IaC)
- Manage Infrastructure (usually on Cloud) with **configuration files** rather than through UI
- Advantages:
- Versionable
- Repeatable and Reusable (easy to create dev, test, Prod envs by using same files)
- Consistent (You know where to find active instances and where to drop them)
- Declarative Language
- Steps:
- **Scope**: Identify the Infrastructures (individual unit of services, e.g. Compute Instance, VPN, etc)
- **Author**: Write the configuration
- **Initialize**: Install the plugins needed by Terraform
- **Plan**: Preview the Changes Terraform will make to match your configurations
- **Apply**: Make the planned changes
# Build - The Blocks
- **terraform**: list the needed providers
- backend: where to store the state file. Local by default.
- **provider**: initializes each provider
- **resource**: List all the resources.
- Double entry name (uniqueness): resource name + personal identifier
- You can then refer a resource into another resource (e.g. line 32 `network = google_compute_network.vpc_network.name`)
```tf
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "6.14.1"
}
}
backend "gcs" {
bucket = "anselboero-website-dev-tfstate"
}
}
provider "google" {
project = var.project
region = var.region
zone = var.zone
}
resource "google_compute_network" "vpc_network" {
name = "terraform-network"
}
resource "google_compute_instance" "my_vm_instance" {
name = "terraform-instance"
machine_type = "f1-micro"
tags = ["web", "dev"]
boot_disk {
initialize_params {
image = "cos-cloud/cos-stable"
}
}
network_interface {
network = google_compute_network.vpc_network.name
access_config {
}
}
}
```
- Initialize the variables (any file .tf will be read by terraform):
- Empty { } will ask you to insert a value during `terraform apply`
```tf
variable "project" { }
variable "region" {
default = "us-central1"
}
variable "zone" {
default = "us-central1-c"
}
```
# Main Commands
- `terraform init`: when you initialize a new configuration
- `terraform apply`: create the infrastructure: will also apply changes in case you update the files.
Two types of changes:
- **Non destructive**: the resource will just be updated (e.g. adding a tag to a VM)
- **Destructive**: The old resource will be destroyed first and a new one will be created (e.g. changing image to a VM)
- `terraform destroy`: Delete all the resources.
# Open Questions
- I think it's not possible to save every single resource as a Tf object: For Example, how can you deploy the first resources without having initialized a Google Build Trigger via UI?
- How to structure the project?
# Resources
- https://developer.hashicorp.com/terraform/tutorials/gcp-get-started (all the 7 Tutorials) (opened on 2024-12-23)
- [Google Cloud Documentation](https://registry.terraform.io/providers/hashicorp/google/latest/docs)