Mengotomatiskan seluruh infrastruktur dengan Infrastructure as Code: CloudFormation, Terraform dengan backend S3 lokal, template serverless/SAM, serta AWS CDK yang di-deploy ke LocalStack.

Di episode 9 kalian membangun API Gateway dengan belasan perintah manual. Efektif untuk belajar, tapi tidak untuk kerja tim: tidak ada jejak audit, tidak ada review, dan sulit direproduksi. Solusinya adalah Infrastructure as Code (IaC) — infrastruktur ditulis sebagai kode yang di-versioning, di-review, dan di-deploy secara deterministik. Karena LocalStack meniru API AWS, hampir semua tool IaC bisa menargetkannya tanpa perubahan berarti.
CloudFormation adalah IaC bawaan AWS: tulis template YAML, deploy sebagai stack, dan biarkan emulator membuat semua resource. Mulai dari template berisi bucket S3 dan tabel DynamoDB:
AWSTemplateFormatVersion: "2010-09-09"
Resources:
DataBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: "data-bucket"
OrdersTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: "Orders"
AttributeDefinitions:
- AttributeName: "id"
AttributeType: "S"
KeySchema:
- AttributeName: "id"
KeyType: "HASH"
BillingMode: "PAY_PER_REQUEST"
Outputs:
BucketArn:
Value: !GetAtt DataBucket.Arnawslocal cloudformation create-stack \
--stack-name dev-stack --template-body file://stack.yml
awslocal cloudformation describe-stacks --stack-name dev-stack
awslocal s3 ls
awslocal dynamodb list-tablesSemua resource yang dibuat otomatis muncul sebagai service terpisah di LocalStack — bucket dan tabel benar-benar berfungsi, bukan sekadar catatan stack.
Kekuatan CloudFormation ada pada referensi antar resource. Fungsi intrinsic seperti !Ref dan !GetAtt mengalirkan output satu resource ke resource lain. Fragmen template ini mengirim nama bucket ke environment variable Lambda:
AWSTemplateFormatVersion: "2010-09-09"
Resources:
DataBucket:
Type: AWS::S3::Bucket
Handler:
Type: AWS::Lambda::Function
Properties:
Runtime: python3.12
Handler: handler.handler
Role: arn:aws:iam::000000000000:role/lambda-role
Code:
ZipFile: |
def handler(event, context): return {"statusCode": 200}
Environment:
Variables:
BUCKET: !Ref DataBucketWarning
Template dengan sintaks interpolation seperti !Ref harus selalu berada di dalam fenced code block MDX. Menuliskannya di paragraf biasa merusak rendering — berlaku untuk seluruh episode ini.
Terraform mengelola infrastruktur dengan bahasa deklaratif HCL. Provider AWS diarahkan ke LocalStack dengan override endpoint di blok provider:
provider "aws" {
region = "us-east-1"
access_key = "test"
secret_key = "test"
skip_credentials_validation = true
skip_metadata_api_check = true
endpoints {
s3 = "http://localhost:4566"
dynamodb = "http://localhost:4566"
}
}
resource "aws_s3_bucket" "data" {
bucket = "tf-data-bucket"
}Kredensial test/test dan endpoint http://localhost:4566 adalah satu-satunya yang berbeda dari produksi. State Terraform bisa disimpan di backend S3 yang juga berjalan di LocalStack:
terraform {
backend "s3" {
bucket = "tf-state"
key = "localstack/terraform.tfstate"
region = "us-east-1"
endpoint = "http://localhost:4566"
access_key = "test"
secret_key = "test"
skip_credentials_validation = true
skip_region_validation = true
skip_requesting_account_id = true
force_path_style = true
}
}awslocal s3 mb s3://tf-state
terraform init
terraform plan
terraform apply -auto-approve
terraform destroy -auto-approveAWS SAM menyederhanakan serverless: satu fungsi Lambda ditulis ringkas, dan SAM menyisipkan sisanya (permission, event source). Template SAM standar:
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Resources:
HelloFunction:
Type: AWS::Serverless::Function
Properties:
Runtime: python3.12
Handler: app.handler
InlineCode: |
def handler(event, context): return {"statusCode": 200, "body": "ok"}samlocal build
samlocal deploy --guided --capabilities CAPABILITY_IAMAWS CDK menulis infrastruktur dalam bahasa pemrograman (TypeScript, Python, dan lainnya) lalu mengompilasinya menjadi CloudFormation:
import * as cdk from "aws-cdk-lib";
import * as s3 from "aws-cdk-lib/aws-s3";
import { Construct } from "constructs";
export class AppStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new s3.Bucket(this, "DataBucket", { bucketName: "cdk-data-bucket" });
}
}
const app = new cdk.App();
new AppStack(app, "AppStack", { env: { region: "us-east-1", account: "000000000000" } });Untuk menargetkan LocalStack, gunakan cdklocal — pasangan CDK CLI yang mengarahkan bootstrap dan deploy ke endpoint emulator:
npm install -g aws-cdk-local aws-cdk
cdklocal bootstrap
cdklocal synth
cdklocal deploy
awslocal s3 lscdklocal bootstrap membuat bucket staging khusus CDK, lalu deploy menciptakan semua resource. Output synth berupa template CloudFormation — bukti bahwa CDK adalah abstraksi di atas CloudFormation.
Rangkuman episode ini:
awslocal cloudformation create-stack.http://localhost:4566, simpan state di backend S3 lokal.samlocal build lalu samlocal deploy menerjemahkan template serverless menjadi stack.cdklocal bootstrap lalu cdklocal deploy untuk infrastruktur berbasis bahasa pemrograman.!Ref hanya boleh ditulis di dalam fenced code block.Infrastruktur kalian kini didefinisikan sebagai kode dan bisa direproduksi kapan pun. Di episode 11 kita simpan dan kelola konfigurasi dan rahasia dengan Secrets Manager dan SSM Parameter Store. Sampai jumpa!