Skip to main content

Providers Populares

AWS Provider

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

provider "aws" {
  region = "us-east-1"
  
  default_tags {
    tags = {
      ManagedBy = "Terraform"
      Project    = "MyProject"
    }
  }
}

Recursos Comuns AWS

# S3 Bucket
resource "aws_s3_bucket" "app" {
  bucket = "my-unique-bucket-name"
  
  versioning {
    enabled = true
  }
  
  lifecycle_rule {
    enabled = true
    transition {
      days          = 30
      storage_class = "STANDARD_IA"
    }
  }
}

# RDS Database
resource "aws_db_instance" "app" {
  identifier     = "my-db"
  engine         = "postgres"
  engine_version = "15.4"
  instance_class = "db.t3.micro"
  
  allocated_storage     = 20
  max_allocated_storage = 100
  
  db_name  = "myapp"
  username = var.db_username
  password = var.db_password
  
  vpc_security_group_ids = [aws_security_group.rds.id]
  db_subnet_group_name    = aws_db_subnet_group.app.name
  
  backup_retention_period = 7
  skip_final_snapshot     = true
}

# ALB
resource "aws_lb" "app" {
  name               = "my-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.alb.id]
  subnets            = data.aws_subnets.public.ids
}

resource "aws_lb_target_group" "app" {
  name     = "my-tg"
  port     = 80
  protocol = "HTTP"
  vpc_id   = aws_vpc.app.id
  
  health_check {
    path                = "/health"
    interval            = 30
    timeout             = 5
    healthy_threshold   = 2
    unhealthy_threshold = 2
  }
}

resource "aws_lb_listener" "app" {
  load_balancer_arn = aws_lb.app.arn
  port              = 80
  protocol          = "HTTP"
  
  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.app.arn
  }
}

# EKS Cluster
resource "aws_eks_cluster" "app" {
  name     = "my-cluster"
  role_arn = aws_iam_role.cluster.arn
  version  = "1.27"
  
  vpc_config {
    subnet_ids              = aws_subnet.private[*].id
    endpoint_private_access = true
    endpoint_public_access  = true
  }
  
  depends_on = [
    aws_iam_role_policy_attachment.cluster_policy
  ]
}

Google Cloud Provider

provider "google" {
  project = "my-project-id"
  region  = "us-central1"
}

# GKE Cluster
resource "google_container_cluster" "primary" {
  name     = "my-cluster"
  location = "us-central1-a"
  
  node_pool {
    name       = "default-pool"
    node_count = 3
    
    node_config {
      machine_type = "e2-medium"
      oauth_scopes = [
        "https://www.googleapis.com/auth/cloud-platform"
      ]
    }
  }
}

# Cloud SQL
resource "google_sql_database_instance" "app" {
  name             = "my-instance"
  database_version = "POSTGRES_15"
  region           = "us-central1"
  
  settings {
    tier = "db-f1-micro"
    
    ip_configuration {
      authorized_networks {
        name = "all"
        value = "0.0.0.0/0"
      }
    }
  }
}

Azure Provider

provider "azurerm" {
  features {}
  use_oidc = true
}

# Resource Group
resource "azurerm_resource_group" "app" {
  name     = "my-resource-group"
  location = "brazilsouth"
}

# Virtual Network
resource "azurerm_virtual_network" "app" {
  name                = "my-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.app.location
  resource_group_name = azurerm_resource_group.app.name
}

# AKS
resource "azurerm_kubernetes_cluster" "app" {
  name                = "my-aks"
  location            = azurerm_resource_group.app.location
  resource_group_name = azurerm_resource_group.app.name
  dns_prefix          = "myaks"
  
  default_node_pool {
    name       = "default"
    node_count = 3
    vm_size    = "Standard_D2_v2"
  }
  
  identity {
    type = "SystemAssigned"
  }
}

Kubernetes Provider

provider "kubernetes" {
  host                   = aws_eks_cluster.app.endpoint
  cluster_ca_certificate = base64decode(aws_eks_cluster.app.certificate_authority[0].data)
  token                  = data.aws_eks_cluster_auth.app.token
}

resource "kubernetes_namespace" "app" {
  metadata {
    name = "myapp"
  }
}

resource "kubernetes_deployment" "app" {
  metadata {
    name      = "myapp"
    namespace = kubernetes_namespace.app.metadata[0].name
  }
  
  spec {
    replicas = 3
    
    selector {
      match_labels = {
        app = "myapp"
      }
    }
    
    template {
      metadata {
        labels = {
          app = "myapp"
        }
      }
      
      spec {
        container {
          image = "nginx:latest"
          name  = "myapp"
          
          port {
            container_port = 80
          }
        }
      }
    }
  }
}

Helm Provider

provider "helm" {
  kubernetes {
    host                   = aws_eks_cluster.app.endpoint
    cluster_ca_certificate = base64decode(aws_eks_cluster.app.certificate_authority[0].data)
    token                  = data.aws_eks_cluster_auth.app.token
  }
}

resource "helm_release" "nginx" {
  name       = "nginx-ingress"
  repository = "https://kubernetes.github.io/ingress-nginx"
  chart      = "ingress-nginx"
  namespace  = "ingress-nginx"
  
  set {
    name  = "controller.service.type"
    value = "LoadBalancer"
  }
}