Mengelola rahasia dan konfigurasi secara terpusat dengan AWS Secrets Manager dan SSM Parameter Store: menyimpan secret dan parameter, membaca dari Lambda dan ECS, hingga rotasi, tagging, dan skenario permission.

Di episode 10 kita mendefinisikan seluruh infrastruktur sebagai kode. Tapi infrastruktur tanpa konfigurasi ibarat mobil tanpa kunci: database URL, API key, password, dan kredensial SMTP harus ditaruh di suatu tempat. Menempelkannya di kode atau environment variable memang praktis, tapi memicu bocor lewat git history dan log. AWS menjawabnya dengan dua service terpusat: Secrets Manager untuk rahasia bernilai tinggi dan SSM Parameter Store untuk konfigurasi umum.
Di episode ini kalian akan menyimpan dan membaca secret serta parameter di LocalStack, menghubungkannya ke Lambda dan ECS, dan menguji skenario rotasi serta permission tanpa akun AWS sungguhan.
Kedua service terlihat mirip, tapi diciptakan untuk kebutuhan berbeda:
| Aspek | Secrets Manager | Parameter Store |
|---|---|---|
| Tujuan | Rahasia bernilai tinggi | Konfigurasi umum |
| Rotasi otomatis | Ya (via Lambda) | Tidak |
| Versi | Stage-based (AWSCURRENT) | Versi, tapi sederhana |
| Ukuran maksimum | 64 KB | 4.096 (Standard) / 8.192 (Advanced) karakter |
| Harga | Per secret + per panggilan | Gratis (Standard) |
Di emulator, aturan harga tidak berlaku — keduanya gratis dan tanpa batas. Yang penting adalah kalian terbiasa memilih tool yang tepat: simpan password, API key, dan token di Secrets Manager; simpan nilai konfigurasi seperti log level atau endpoint di Parameter Store.
API Secrets Manager sangat sederhana. Buat secret dengan --secret-string, lalu baca nilainya:
awslocal secretsmanager create-secret \
--name db/password --secret-string 'P@ssw0rd!'
awslocal secretsmanager get-secret-value \
--secret-id db/passwordLocalStack menyimpan nilai itu di emulator state dan mengembalikannya persis seperti AWS asli. Untuk melihat payload JSON lengkap, pipeline output ke jq:
awslocal secretsmanager get-secret-value \
--secret-id db/password | jq -r '.SecretString'Secret punya versi. Saat nilai diubah, versi lama berpindah ke stage AWSPREVIOUS dan versi baru menjadi AWSCURRENT:
awslocal secretsmanager put-secret-value \
--secret-id db/password --secret-string 'P@ssw0rd!2'
awslocal secretsmanager get-secret-value \
--secret-id db/password --version-stage AWSPREVIOUSPola ini memungkinkan rollback cepat: aplikasi selalu membaca AWSCURRENT, dan tim bisa membandingkan versi lama tanpa menyimpan duplikat manual.
SSM Parameter Store punya tiga tipe: String, StringList, dan SecureString (terenkripsi KMS). Parameter juga punya tier: Standard (gratis, 4.096 karakter) dan Advanced (berbayar, 8.192 karakter):
awslocal ssm put-parameter \
--name /app/prod/LOG_LEVEL --value debug --type String
awslocal ssm put-parameter \
--name /app/prod/DB_PASSWORD --value 'secret-value' --type SecureString
awslocal ssm get-parameter --name /app/prod/DB_PASSWORD --with-decryptionTanpa --with-decryption, nilai SecureString muncul terenkripsi. LocalStack memakai KMS key default alias/aws/ssm untuk ini — sama seperti AWS.
Menamai parameter dengan hierarki path membuka fitur get-parameters-by-path — ambil seluruh konfigurasi satu service dalam satu panggilan:
awslocal ssm get-parameters-by-path \
--path /app/prod --recursiveRahasia baru berguna jika aplikasi bisa membacanya. Di LocalStack, kode Lambda membaca secret persis seperti di produksi — cukup arahkan SDK ke endpoint emulator:
import boto3
def handler(event, context):
client = boto3.client(
"secretsmanager",
region_name="us-east-1",
endpoint_url="http://localhost:4566",
aws_access_key_id="test",
aws_secret_access_key="test",
)
secret = client.get_secret_value(SecretId="db/password")
return {"password": secret["SecretString"]}Untuk ECS, nilai secret dirujuk langsung di task definition lewat properti secrets yang menunjuk ke ARN — runtime container akan menariknya sendiri. Pola yang sama berlaku di produksi, jadi behavior tidak pernah melenceng.
Rotasi nyata di AWS memakai Lambda yang menulis nilai baru ke secret. LocalStack mengemulasi API rotate-secret: panggilan diterima dan selesai, tapi tanpa menjalankan Lambda rotasi sungguhan:
awslocal secretsmanager rotate-secret \
--secret-id db/passwordNote
Rotasi di LocalStack bersifat mock — cukup untuk menguji kode yang memanggil API rotasi, bukan untuk memverifikasi logika Lambda rotasi itu sendiri. Uji logika rotasi di CI dengan secret test sungguhan.
Rahasia dan parameter yang banyak butuh organisasi. Kedua service mendukung tagging untuk audit dan cost allocation:
awslocal secretsmanager tag-resource \
--secret-id db/password --tags 'Key=env,Value=prod'
awslocal secretsmanager list-tags-for-resource \
--secret-id db/passwordUntuk SSM, gunakan ssm add-tags-to-resource dengan --resource-type "Parameter" dan ARN parameter sebagai --resource-id.
Di AWS asli, akses ke secret diatur policy IAM. Di LocalStack, evaluasi IAM jauh lebih longgar: permission Deny umumnya diabaikan dan hampir semua panggilan berhasil selama format ARN benar. Artinya:
Rangkuman episode ini:
create-secret, put-secret-value, dan staging versi AWSCURRENT/AWSPREVIOUS.String, SecureString, dan hierarki path dengan get-parameters-by-path.endpoint_url menuju http://localhost:4566.Konfigurasi dan rahasia kalian kini terpusat. Tapi ada satu masalah diam-diam: restart LocalStack menghapus semua state yang sudah dibangun. Di episode 12 kita selamatkan kerja keras itu dengan persistence dan Cloud Pods — state yang bertahan antar restart dan bisa dibagikan ke tim. Sampai jumpa!