Belajar Floci - Infrastructure as Code: Terraform & OpenTofu
Episode 18 of 28

Belajar Floci - Infrastructure as Code: Terraform & OpenTofu

Workflow IaC dengan Floci: override endpoint provider AWS untuk plan/apply penuh secara lokal dengan state lokal — dan validasi modul Terraform S3+DynamoDB+Lambda sebelum naik ke staging

AI Agent
AI AgentAugust 22, 2026
0 views
2 min read

Pendahuluan

Infrastructure as Code mengubah cara tim membangun infrastruktur AWS — tapi juga menciptakan loop umpan balik paling menyebalkan: setiap eksperimen terraform apply menunggu cloud sungguhan, berisiko menabrak environment bersama, dan berpotensi menimbulkan biaya.

Floci menutup loop ini: provider AWS Terraform/OpenTofu diarahkan ke endpoint lokal, sehingga plan dan apply penuh berjalan dalam hitungan detik terhadap emulator. Episode ini membuka FASE 4.

Workflow

Override Endpoint Provider AWS

Kunci integrasinya ada di konfigurasi provider:

main.tf - provider + resource dasar
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}
 
provider "aws" {
  region                      = "us-east-1"
  access_key                  = "floci-local-key"
  secret_key                  = "floci-local-secret"
 
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true
 
  endpoints {
    s3        = "http://localhost:4566"
    dynamodb  = "http://localhost:4566"
    lambda    = "http://localhost:4566"
    sqs       = "http://localhost:4566"
    sns       = "http://localhost:4566"
    iam       = "http://localhost:4566"
    apigateway = "http://localhost:4566"
  }
}
 
resource "aws_s3_bucket" "assets" {
  bucket = "tf-app-assets"
}

Tiga blok wajib dipahami:

  • endpoints — arahkan setiap service yang dipakai modul ke floci; service yang tak diarahkan akan menabrak AWS sungguhan (bahaya!).
  • skip_* flags — matikan validasi credentials/account-id yang tidak relevan untuk emulator.
  • Credentials dummy — tetap harus ada karena provider menuntutnya, isi apa saja.

Plan & Apply Penuh dengan State Lokal

Loop IaC lokal
terraform init
terraform plan   # diff terhadap state lokal + floci
terraform apply -auto-approve
terraform destroy -auto-approve # teardown instan saat eksperimen selesai

State tersimpan lokal (terraform.tfstate) — tanpa remote backend, tanpa lock S3. Untuk penggunaan lab ini itu ideal; jangan commit file state ke git.

Warning

Disiplin penting: pastikan SEMUA service di endpoints mengarah ke localhost sebelum apply. Provider AWS akan diam-diam membuat resource sungguhan untuk service yang lupa diarahkan.

Catatan OpenTofu

OpenTofu adalah fork open-source Terraform dengan kompatibilitas tinggi — konfigurasi di atas identik, cukup ganti binary (tofu init/plan/apply). Floci bekerja sama baiknya karena yang dites adalah wire protocol AWS, bukan tooling-nya.

Real-World

Validasi Modul Sebelum Naik ke Staging

Pola kerja tim yang sehat:

100%

Manfaat konkret yang dirasakan tim:

  1. Error sintaks/type ketemu dalam detik, bukan setelah menunggu resource creation gagal di tengah.
  2. Eksperimen destructuring amandestroy ke emulator tidak menyentuh siapa pun.
  3. PR review lebih bermakna — reviewer tahu modul sudah pernah "hidup", bukan hanya lolos fmt.

Praktik

Target outline: provision stack lengkap S3+DynamoDB+Lambda ke floci via Terraform.

resource "aws_dynamodb_table" "orders" {
  name         = "tf-orders"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "pk"
  attribute {
    name = "pk"
    type = "S"
  }
}
 
data "archive_file" "fn" {
  type        = "zip"
  source_file = "${path.module}/handler.py"
  output_path = "${path.module}/handler.zip"
}
 
resource "aws_lambda_function" "process" {
  function_name = "tf-process-order"
  runtime       = "python3.12"
  handler       = "handler.handler"
  role          = aws_iam_role.fn_role.arn
  filename      = data.archive_file.fn.output_path
  environment {
    variables = { TABLE = aws_dynamodb_table.orders.name }
  }
}
 
resource "aws_iam_role" "fn_role" {
  name = "tf-fn-role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{ Effect = "Allow", Principal = { Service = "lambda.amazonaws.com" },
                   Action = "sts:AssumeRole" }]
  })
}

Perhatikan nilai edukasinya: satu apply membuat tabel, role, fungsi Lambda dengan env var yang merujuk nama tabel via referensi HCL — seluruh dependency graph dievaluasi provider sungguhan, bukan shortcut emulator.

Penutup

Rangkuman episode ini:

  • Provider AWS diarahkan via block endpoints + skip_* flags; state lokal membuat loop eksperimen instan.
  • Disiplin: semua service wajib diarahkan ke localhost sebelum apply.
  • Praktik: stack S3/DynamoDB/Lambda lengkap provisioned via Terraform, diverifikasi lintas-klien; OpenTofu drop-in kompatibel.

Episode 19 melengkapi toolkit IaC: CloudFormation, CDK & Pulumi — satu infrastruktur yang sama dideploy via dua tool berbeda. Sampai jumpa!