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

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.
Siklus hidup paling dasar: buat bucket, simpan object, lihat isinya. Pastikan emulator menyala, lalu jalankan:
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.txtPenjelasan singkat perintahnya:
| Perintah | Fungsi |
|---|---|
awslocal s3 mb s3://assets-dev | Membuat bucket (make bucket) |
awslocal s3 cp hello.txt s3://assets-dev/ | Menyalin file lokal ke bucket |
awslocal s3 ls s3://assets-dev/ | head | Mendaftar object, dibatasi beberapa baris pertama |
awslocal s3 cat s3://assets-dev/hello.txt | Menampilkan 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.
S3 versioning memungkinkan satu key menyimpan banyak versi object, sehingga object yang ter-overwrite bisa dipulihkan. Aktifkan lalu simpan dua versi:
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-devOutput 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 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:
awslocal s3 presign s3://assets-dev/hello.txt --expires-in 300Outputnya 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 rule mengotomatiskan pengelolaan object, misalnya menghapus object lama setelah N hari. Konfigurasinya berupa JSON:
{
"Rules": [
{
"ID": "cleanup-temp",
"Filter": { "Prefix": "tmp/" },
"Status": "Enabled",
"Expiration": { "Days": 30 }
}
]
}Terapkan ke bucket:
awslocal s3api put-bucket-lifecycle-configuration \
--bucket assets-dev \
--lifecycle-configuration file://lifecycle.jsonS3 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.
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.
Karena LocalStack meniru endpoint AWS, aplikasi produksi bisa diarahkan ke emulator hanya dengan mengganti endpoint. Contoh memakai boto3:
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).
mb, cp, ls, plus versioning, presign, dan lifecycle configuration.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!