Belajar LocalStack - Core Service: S3
Episode 5 of 23

Belajar LocalStack - Core Service: S3

Menguasai service S3 di LocalStack: membuat bucket dan object, versioning, presigned URL, lifecycle, hingga fitur parity lanjutan seperti S3 Tables dan replication.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

Di episode 4 kita sudah mengelola lifecycle emulator: start, restart, dan membatasi service dengan SERVICES=s3,dynamodb. Sekarang saatnya memakai service sungguhan. Kita mulai dengan S3, service object storage yang menjadi fondasi dari begitu banyak aplikasi modern.

Mengapa S3 dulu? Karena S3 adalah contoh sempurna emulasi stateful yang nyaris sempurna di LocalStack: apa yang kalian simpan benar-benar tersimpan, apa yang kalian hapus benar-benar hilang. Semua perintah di episode ini bisa kalian ulangi persis di AWS sungguhan — hanya endpoint yang berbeda. Ini bukti paling nyata dari filosofi API parity yang kita bahas di episode 1.

Membuat Bucket dan Object

Siklus hidup paling dasar: buat bucket, simpan object, lihat isinya. Pastikan emulator menyala, lalu jalankan:

Siklus dasar S3
awslocal s3 mb s3://assets-dev
awslocal s3 ls
echo "halo dari LocalStack" > hello.txt
awslocal s3 cp hello.txt s3://assets-dev/hello.txt
awslocal s3 ls s3://assets-dev/
awslocal s3 cat s3://assets-dev/hello.txt

Penjelasan singkat perintahnya:

PerintahFungsi
awslocal s3 mb s3://assets-devMembuat bucket (make bucket)
awslocal s3 cp hello.txt s3://assets-dev/Menyalin file lokal ke bucket
awslocal s3 ls s3://assets-dev/ | headMendaftar object, dibatasi beberapa baris pertama
awslocal s3 cat s3://assets-dev/hello.txtMenampilkan isi object

Tip

Perintah S3 di awslocal identik dengan AWS CLI sungguhan — bedanya hanya endpoint yang otomatis menuju http://localhost:4566. Kode yang sama akan bekerja di produksi dengan aws dan endpoint default.

Versioning

S3 versioning memungkinkan satu key menyimpan banyak versi object, sehingga object yang ter-overwrite bisa dipulihkan. Aktifkan lalu simpan dua versi:

Mengaktifkan dan menguji versioning
awslocal s3api put-bucket-versioning --bucket assets-dev --versioning-configuration Status=Enabled
echo "versi satu" > hello.txt
awslocal s3 cp hello.txt s3://assets-dev/hello.txt
echo "versi dua" > hello.txt
awslocal s3 cp hello.txt s3://assets-dev/hello.txt
awslocal s3api list-object-versions --bucket assets-dev

Output list-object-versions akan menampilkan dua versi untuk key hello.txt. Setiap versi punya VersionId yang bisa dipakai untuk operasi versi-spesifik, misalnya awslocal s3api get-object --version-id. Versi lama tetap bisa diambil kapan saja — inilah nilai utama versioning.

Presigned URL

Presigned URL adalah URL sementara yang memberi akses ke object tanpa kredensial. Kasus pakai klasik: aplikasi web memberikan link unduhan file yang berakhir dalam beberapa menit. Buat dengan presign:

Membuat presigned URL
awslocal s3 presign s3://assets-dev/hello.txt --expires-in 300

Outputnya adalah URL lengkap ke localhost:4566 dengan token autentikasi. Buka di browser atau lewat curl dan object akan terunduh — valid selama 300 detik. Setelah kedaluwarsa, akses ditolak.

Lifecycle Configuration

Lifecycle rule mengotomatiskan pengelolaan object, misalnya menghapus object lama setelah N hari. Konfigurasinya berupa JSON:

Lifecycle rule: hapus setelah 30 hari
{
  "Rules": [
    {
      "ID": "cleanup-temp",
      "Filter": { "Prefix": "tmp/" },
      "Status": "Enabled",
      "Expiration": { "Days": 30 }
    }
  ]
}

Terapkan ke bucket:

Menerapkan lifecycle configuration
awslocal s3api put-bucket-lifecycle-configuration \
  --bucket assets-dev \
  --lifecycle-configuration file://lifecycle.json

Fitur Parity Lanjutan

S3 Tables

S3 Tables adalah fitur yang menyimpan data tabular (Parquet) dengan query terintegrasi. Di LocalStack, S3 Tables mendukung alur kerja create table bucket dan operasi tabel, sehingga kalian bisa membangun pipeline data lake lokal sebelum ke produksi.

S3 Replication

Sejak rilis 2026.06+, S3 replication tersedia di LocalStack. Kalian bisa mengonfigurasi bucket yang mereplikasi object ke bucket lain (bisa di region berbeda), dengan aturan replikasi yang meniru AWS asli. Berguna untuk menguji arsitektur yang mengandalkan replikasi lintas region tanpa membuat dua bucket AWS sungguhan.

Parity dengan SDK dan CLI Produksi

Karena LocalStack meniru endpoint AWS, aplikasi produksi bisa diarahkan ke emulator hanya dengan mengganti endpoint. Contoh memakai boto3:

Pythonboto3 mengarah ke LocalStack
import boto3
 
s3 = boto3.client(
    "s3",
    endpoint_url="http://localhost:4566",
    region_name="us-east-1",
    aws_access_key_id="test",
    aws_secret_access_key="test",
)
print(s3.list_buckets())

Satu-satunya perbedaan dengan kode produksi adalah parameter endpoint_url. Credential palsu test/test cukup untuk emulator, dan region us-east-1 adalah defaultnya.

Warning

Jangan pernah mengarahkan SDK dengan kredensial produksi ke LocalStack secara tidak sengaja. Selalu pisahkan konfigurasi environment development (endpoint lokal, credential palsu) dan produksi (endpoint AWS, credential asli).

Penutup

  • S3 di LocalStack adalah emulasi stateful: bucket, object, dan version benar-benar tersimpan.
  • Kuasai siklus mb, cp, ls, plus versioning, presign, dan lifecycle configuration.
  • Fitur parity lanjutan seperti S3 Tables dan replication (2026.06+) tersedia untuk uji coba lokal.
  • Integrasi dengan SDK produksi hanya butuh perubahan endpoint — bukti nyata API parity.

Bucket dan object sudah kalian kuasai. Di episode 6 berikutnya kita pindah ke sisi database: menguasai DynamoDB — membuat tabel dengan primary key, put, get, query, scan, secondary index LSI dan GSI, hingga best practice data modeling. Jangan lupa emulator tetap menyala!

Belajar LocalStack - Core Service: S3 | Belajar LocalStack