Memahami jalur koneksi ke LocalStack: port 4566 sebagai gateway, network Docker host versus bridge, akses dari container lain, serta konfigurasi endpoint untuk AWS CLI, SDK modern, dan boto3.

Di episode 12 state kalian sudah aman dari restart. Tapi ada pertanyaan mendasar yang belum kita bedah tuntas: bagaimana kode kalian benar-benar terhubung ke LocalStack? Selama ini kita menulis http://localhost:4566 tanpa berpikir dua kali. Di produksi, aplikasi berjalan di dalam container yang terpisah dari emulator — dan di situlah letak sebagian besar kebingungan networking.
Di episode ini kalian akan memahami port 4566, perbedaan network Docker host dan bridge, cara menghubungkan container lain, serta konfigurasi endpoint untuk AWS CLI, SDK modern, dan boto3.
Sejak versi modern, LocalStack mengekspos satu port untuk semua service: 4566. Era port per-service (4572 untuk S3, 4570 untuk DynamoDB, dan seterusnya) sudah berakhir. Satu gateway HTTP memilah request berdasarkan path API.
Dari host, alamatnya http://localhost:4566. Health check tersedia di http://localhost:4566/_localstack/health:
curl -s http://localhost:4566/_localstack/health | jqJawabannya berisi daftar service dan statusnya — cara cepat memverifikasi emulator hidup sebelum men-debug kode.
Container Docker berjalan dalam network. Dua mode yang relevan:
| Mode | Konsep | localhost dari aplikasi |
|---|---|---|
| Host | Berbagi network namespace host | Ya, langsung |
| Bridge | Setiap container punya IP sendiri | Tidak — harus nama service |
Mode host (network_mode: host) membuat container berbagi stack jaringan host, sehingga localhost:4566 langsung bekerja. Ini nyaman di Linux, tapi di Docker Desktop (macOS/Windows) tidak berlaku karena Docker berjalan di dalam VM — localhost menunjuk ke VM, bukan ke container.
Mode bridge adalah default docker-compose: setiap service mendapat IP internal dan diakses lewat nama service-nya. Inilah mode yang dominan untuk development nyata.
Kunci untuk bridge: gunakan nama service, bukan localhost. Jika compose mendefinisikan service localstack, maka dari service lain endpoint-nya http://localstack:4566:
services:
localstack:
image: localstack/localstack:latest
ports:
- "4566:4566"
app:
build: .
depends_on:
- localstack
environment:
- AWS_ENDPOINT_URL=http://localstack:4566
- AWS_ACCESS_KEY_ID=test
- AWS_SECRET_ACCESS_KEY=test
- AWS_DEFAULT_REGION=us-east-1Port 4566:4566 tetap dibuka ke host agar kalian bisa memakai awslocal dari terminal. Sementara itu, app berkomunikasi dengan emulator lewat http://localstack:4566 — Docker DNS menerjemahkan nama service menjadi IP container.
Tip
Selalu set AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, dan AWS_DEFAULT_REGION di service lain. SDK modern membaca variabel ini untuk kredensial dan region — di emulator cukup pakai nilai palsu test/test.
Sebelumnya, tiap SDK punya cara sendiri mengarahkan endpoint: endpoint_url untuk boto3, endpoint untuk SDK v2. Kini AWS_ENDPOINT_URL menjadi standar lintas SDK — boto3 (sejak 1.34.64) dan AWS SDK v3 membacanya secara otomatis:
export AWS_ENDPOINT_URL=http://localhost:4566
aws s3 lsAda juga varian per service: AWS_ENDPOINT_URL_SQS, AWS_ENDPOINT_URL_DYNAMODB, dan lainnya — berguna saat satu endpoint global tidak cukup.
awslocal adalah pembungkus AWS CLI yang menambahkan --endpoint-url=http://localhost:4566 dan kredensial palsu secara otomatis:
awslocal s3 ls
aws --endpoint-url=http://localhost:4566 s3 lsKedua perintah di atas setara. awslocal menghemat pengetikan dan menghindari typo endpoint. Ingat: ini hanya untuk AWS CLI, bukan untuk SDK.
Untuk Python, boto3 menerima endpoint_url per client:
import boto3
s3 = boto3.client(
"s3",
region_name="us-east-1",
aws_access_key_id="test",
aws_secret_access_key="test",
endpoint_url="http://localhost:4566",
)Karena parameter ini identik antara LocalStack dan AWS, kode produksi tidak perlu berubah — cukup set endpoint_url saat menginisialisasi client. Jangan hardcode nilai di kode: baca dari environment variable agar produksi tetap memakai endpoint AWS asli.
Docker Compose menyediakan DNS internal: setiap nama service langsung resolve ke alamat IP container-nya di network yang sama. Inilah yang membuat http://localstack:4566 bekerja tanpa konfigurasi tambahan. Jika service berada di compose file berbeda, gabungkan dengan network bersama (external: true). Lihat jaringan yang aktif dengan docker network ls.
Warning
Jangan gunakan localhost di dalam container yang menuju ke emulator — itu menunjuk ke container itu sendiri. Selalu pakai nama service (localstack) saat berjalan dalam network bridge.
| Konteks | Endpoint |
|---|---|
| Terminal host (awslocal, curl) | http://localhost:4566 |
| Aplikasi di container lain | http://localstack:4566 |
| Di dalam container emulator itu sendiri | http://localhost:4566 |
| SDK v3 / boto3 modern | AWS_ENDPOINT_URL env var |
Rangkuman episode ini:
4566 melayani semua service; health check di /_localstack/health.localhost; network bridge memakai nama service.http://localstack:4566 dengan AWS_ENDPOINT_URL.awslocal setara dengan aws --endpoint-url=http://localhost:4566 untuk AWS CLI.endpoint_url per client atau env var standar.Koneksi kini jelas dari sisi jaringan. Tinggal satu lapisan keamanan yang belum dibahas: siapa yang boleh mengakses emulator dan apa yang bisa dilakukan? Di episode 14 kita bedah IAM & Authentication — kredensial palsu, policy evaluation, dan batasannya di LocalStack. Sampai jumpa!