Ravindra BagaleCourses & study guides English

AWS SDK Secrets Manager आणि SSM Parameter Store: Config सुरक्षित वाचा (Python, PHP, Node.js)

Passwords आणि API keys code मध्ये किंवा git मधल्या .env मध्ये नकोत. Database password Secrets Manager मध्ये आणि app settings SSM Parameter Store मध्ये ठेवू, Python, PHP आणि Node.js मधून वाचू, secret rotate करू, parameters चा पूर्ण path वाचू, आणि values cache करू म्हणजे प्रत्येक request ला AWS call नको. Example: São Paulo मधला Lucas आणि चेन्नईची Sneha यांचं payments app.

या chapter मध्ये तुम्ही काय शिकाल

  • Secret बनवून वाचा
  • Update व rotate
  • SecureString parameters
  • Path ने parameters वाचा
  • Values सुरक्षित cache

1. मोठं चित्र: hotel safe

हे का लागतं?

Passport hotel च्या दाराला चिकटवत नाही. Room safe मध्ये ठेवता आणि लागेल तेव्हा उघडता. Secrets Manager = passwords साठी safe; Parameter Store = settings साठी notice board, sensitive साठी locked भाग.

हे काय आहे?

GetSecretValue SecretString देतं. WithDecryption सह GetParameter SecureString वाचतं. दोन्ही KMS ने encrypted; कोण वाचू शकतो ते IAM ठरवतं.

कसं करायचं (step by step)

Safe पासून app पर्यंतCreateSecret / PutParameterIAM app role ला read देतेApp start ला वाचतंकाही मिनिटं cacheRedeploy शिवाय rotate
Secrets Manager प्रति secret खर्च; Parameter Store standard parameters free.

2. Secret बनवा आणि वाचा

हे का लागतं?

Lucas ला Brazil database चा Postgres password कोणालाही code मध्ये न दिसता हवा.

हे काय आहे?

SecretString मध्ये JSON ठेवा म्हणजे एका secret मध्ये username, password, host. वाचून JSON parse करा.

कसं करायचं (step by step)

  1. Python: secret बनवा.
import boto3, json
sm = boto3.client("secretsmanager", region_name="sa-east-1")
r = sm.create_secret(Name="payments/db",
    SecretString=json.dumps({"user": "pay_app", "password": "Xy7!q2-Lm9", "host": "db.internal", "port": 5432}))
print(r["ARN"])

अपेक्षित output:

arn:aws:secretsmanager:sa-east-1:123456789012:secret:payments/db-AbCdEf
  1. Node.js: वाचून parse.
import { SecretsManagerClient, GetSecretValueCommand } from "@aws-sdk/client-secrets-manager";
const sm = new SecretsManagerClient({ region: "sa-east-1" });
const { SecretString } = await sm.send(new GetSecretValueCommand({ SecretId: "payments/db" }));
const db = JSON.parse(SecretString);
console.log(db.user, db.host, db.port);

अपेक्षित output:

pay_app db.internal 5432
  1. PHP: वाचून PDO DSN.
<?php
require "vendor/autoload.php";
$sm = new Aws\SecretsManager\SecretsManagerClient(["region" => "sa-east-1"]);
$db = json_decode($sm->getSecretValue(["SecretId" => "payments/db"])["SecretString"], true);
$dsn = "pgsql:host={$db["host"]};port={$db["port"]};dbname=payments";
echo $dsn, PHP_EOL;

अपेक्षित output:

pgsql:host=db.internal;port=5432;dbname=payments
  1. Verify: secret describe (value दाखवत नाही).
aws secretsmanager describe-secret --secret-id payments/db --region sa-east-1 --query "[Name,LastChangedDate]" --output text

अपेक्षित output:

payments/db  2026-10-24T12:10:00+05:30

3. Update आणि rotate

हे का लागतं?

चेन्नईची security team दर 30 दिवसांनी प्रत्येक database password rotate करते.

हे काय आहे?

PutSecretValue नवीन version AWSCURRENT म्हणून लिहितो; जुना AWSPREVIOUS होतो. RotateSecret schedule वर rotation Lambda चालवतो.

कसं करायचं (step by step)

  1. Python: नवीन password बनवून साठवा.
pw = sm.get_random_password(PasswordLength=24, ExcludePunctuation=True)["RandomPassword"]
cur = json.loads(sm.get_secret_value(SecretId="payments/db")["SecretString"])
cur["password"] = pw
v = sm.put_secret_value(SecretId="payments/db", SecretString=json.dumps(cur))
print(v["VersionStages"])

अपेक्षित output:

['AWSCURRENT']
  1. Node.js: automatic rotation चालू.
import { RotateSecretCommand } from "@aws-sdk/client-secrets-manager";
await sm.send(new RotateSecretCommand({
  SecretId: "payments/db",
  RotationLambdaARN: "arn:aws:lambda:sa-east-1:123456789012:function:pg-rotator",
  RotationRules: { ScheduleExpression: "rate(30 days)" },
}));
console.log("rotation on");

अपेक्षित output:

rotation on
  1. PHP: मागचं version वाचा (rollback साठी).
<?php
$old = $sm->getSecretValue(["SecretId" => "payments/db", "VersionStage" => "AWSPREVIOUS"]);
echo json_decode($old["SecretString"])->user, " previous version ok", PHP_EOL;

अपेक्षित output:

pay_app previous version ok
  1. Verify: versions list.
aws secretsmanager list-secret-version-ids --secret-id payments/db --region sa-east-1 --query "Versions[].VersionStages" --output text

अपेक्षित output:

AWSPREVIOUS
AWSCURRENT

4. Parameter Store settings

हे का लागतं?

Sneha प्रत्येक environment साठी feature flags, UPI gateway URL आणि Stripe key ठेवते.

हे काय आहे?

Parameters ना /payments/prod/... असे path names द्या. Plain values साठी String, secrets साठी SecureString. GetParametersByPath पूर्ण tree वाचतो (page ला 10, paginate करा).

कसं करायचं (step by step)

  1. Python: तीन parameters ठेवा.
ssm = boto3.client("ssm", region_name="ap-south-2")
ssm.put_parameter(Name="/payments/prod/upi_url", Value="https://upi.example.in/v2", Type="String", Overwrite=True)
ssm.put_parameter(Name="/payments/prod/max_txn_inr", Value="200000", Type="String", Overwrite=True)
ssm.put_parameter(Name="/payments/prod/stripe_key", Value="sk_live_51abc", Type="SecureString", Overwrite=True)
print("3 saved")

अपेक्षित output:

3 saved
  1. Node.js: एक SecureString वाचा.
import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm";
const ssm = new SSMClient({ region: "ap-south-2" });
const r = await ssm.send(new GetParameterCommand({ Name: "/payments/prod/stripe_key", WithDecryption: true }));
console.log(r.Parameter.Type, r.Parameter.Value.slice(0, 8) + "…");

अपेक्षित output:

SecureString sk_live_…
  1. PHP: paginator ने पूर्ण path.
<?php
$ssm = new Aws\Ssm\SsmClient(["region" => "ap-south-2"]);
$cfg = [];
foreach ($ssm->getPaginator("GetParametersByPath", ["Path" => "/payments/prod/", "WithDecryption" => true]) as $page)
    foreach ($page["Parameters"] as $p) $cfg[basename($p["Name"])] = $p["Value"];
ksort($cfg); echo implode(",", array_keys($cfg)), PHP_EOL;

अपेक्षित output:

max_txn_inr,stripe_key,upi_url
  1. Verify: parameters describe.
aws ssm describe-parameters --parameter-filters Key=Path,Values=/payments/prod --region ap-south-2 --query "Parameters[].[Name,Type]" --output text

अपेक्षित output:

/payments/prod/max_txn_inr  String
/payments/prod/stripe_key   SecureString
/payments/prod/upi_url      String

5. Values cache करा

हे का लागतं?

सेकंदाला 500 requests ला प्रत्येक वेळी AWS call हळू, महाग, आणि throttling लागतं.

हे काय आहे?

एकदा वाचून काही मिनिटं memory मध्ये ठेवा. Python ला official caching library; छोटा TTL cache सगळीकडे चालतो. Lambda वर Parameters and Secrets extension localhost:2773 वर हे करतं.

कसं करायचं (step by step)

  1. Python: official cache.
# pip install aws-secretsmanager-caching
from aws_secretsmanager_caching import SecretCache, SecretCacheConfig
cache = SecretCache(config=SecretCacheConfig(secret_refresh_interval=300), client=sm)
for _ in range(3):
    print(json.loads(cache.get_secret_string("payments/db"))["user"])

अपेक्षित output:

pay_app
pay_app
pay_app   (one API call)
  1. Node.js: छोटा TTL cache.
const cache = new Map();
async function param(name, ttl = 300_000) {
  const hit = cache.get(name);
  if (hit && hit.exp > Date.now()) return hit.v;
  const r = await ssm.send(new GetParameterCommand({ Name: name, WithDecryption: true }));
  cache.set(name, { v: r.Parameter.Value, exp: Date.now() + ttl });
  return r.Parameter.Value;
}
console.log(await param("/payments/prod/max_txn_inr"), await param("/payments/prod/max_txn_inr"));

अपेक्षित output:

200000 200000   (second read from memory)
  1. PHP: SDK call भोवती APCu cache.
<?php
function param(Aws\Ssm\SsmClient $ssm, string $n): string {
    $v = apcu_fetch($n, $ok);
    if ($ok) return $v;
    $v = $ssm->getParameter(["Name" => $n, "WithDecryption" => true])["Parameter"]["Value"];
    apcu_store($n, $v, 300);
    return $v;
}
echo param($ssm, "/payments/prod/upi_url"), PHP_EOL;

अपेक्षित output:

https://upi.example.in/v2
  1. Verify: Lambda वर extension ने वाचा.
curl -s -H "X-Aws-Parameters-Secrets-Token: $AWS_SESSION_TOKEN" "localhost:2773/systemsmanager/parameters/get?name=/payments/prod/upi_url" | jq -r .Parameter.Value

अपेक्षित output:

https://upi.example.in/v2

6. हाच call Java, Go, .NET आणि CLI मध्ये

हे का लागतं?

Teams अनेकदा भाषा मिसळतात. Python, PHP आणि Node.js मध्ये call समजला की बाकीचे SDKs म्हणजे तोच API, फक्त syntax वेगळा.

हे काय आहे?

सगळे GetSecretValue API call करतात. Terminal मधून पटकन test करायला CLI ओळ वापरा.

कसं करायचं (step by step)

StackCode
AWS CLIaws secretsmanager get-secret-value --secret-id payments/db --query SecretString --output text
Java v2String s = sm.getSecretValue(b -> b.secretId("payments/db")).secretString();
Go v2out, _ := client.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{SecretId: aws.String("payments/db")})
fmt.Println(*out.SecretString)
.NETvar r = await sm.GetSecretValueAsync(new GetSecretValueRequest { SecretId = "payments/db" });
Console.WriteLine(r.SecretString);

7. काहीही खर्च चालू राहू नये म्हणून cleanup

हे का लागतं?

चालू ठेवलेले lab resources पैसे खातात आणि security risk बनतात.

हे काय आहे?

उलट्या क्रमाने delete करा: आधी children, मग parents.

कसं करायचं (step by step)

  1. Secret व parameters delete.
aws secretsmanager delete-secret --secret-id payments/db --force-delete-without-recovery --region sa-east-1
aws ssm delete-parameters --names /payments/prod/upi_url /payments/prod/max_txn_inr /payments/prod/stripe_key --region ap-south-2

अपेक्षित output:

(no output means success)

Ravindra Bagale's Tip

Debug मध्ये सुद्धा secret value print/log करू नका. त्याऐवजी secret name आणि version id log करा.

8. मुलाखत प्रश्न आणि उत्तरं

प्र. Secrets Manager vs Parameter Store?

Rotation + cost vs free config.

प्र. WithDecryption काय करतं?

SecureString decrypt.

प्र. AWSCURRENT / AWSPREVIOUS?

Version labels.

प्र. Secrets cache का?

Latency, cost, throttling कमी.

प्र. एका page मध्ये किती?

10; paginator वापरा.

घरी करून बघा

  1. /payments/dev/ values ठेवून Node.js मध्ये APP_ENV नुसार config load करा.
  2. App ला फक्त /payments/prod/* वाचू देणारी IAM policy लिहा.

थोडक्यात सांगायचं तर

  1. Secrets: Create/Get/Put.
  2. Lambda ने rotate.
  3. SSM: SecureString + WithDecryption.
  4. GetParametersByPath + paginator.
  5. TTL सह cache.

सराव Tasks

या scenario बद्दल

Sahyadri Clinic हा सातारा मधला आरोग्य सेवा व्यवसाय आहे. Dr. Anil Deshmukh त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे INR मध्ये मोजले जातात आणि AWS resources ap-south-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.

0 / 11

सोपं Secret वाचा

का: Apps secret file मध्ये न ठेवता start-up ला वाचतात.

काय करायचं: sahyadriclinic/prod/db secret ची value मिळवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

सोपं SSH चा port

का: Security group rules ला योग्य port हवा.

काय करायचं: SSH साठी security group ने कोणता TCP port उघडावा?

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

सोपं MySQL चा port

का: DB security group ने फक्त हा port app साठी उघडावा.

काय करायचं: Sahyadri Clinic चं app RDS MySQL शी बोलतं. DB SG ने कोणता port allow करावा?

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

मध्यम Decrypted parameter वाचा

का: --with-decryption शिवाय encrypted blob च दिसतो.

काय करायचं: /sahyadriclinic/prod/api-key वाचा व decrypt करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम Encrypted parameter ठेवा

का: SecureString parameters KMS ने encrypt होतात.

काय करायचं: /sahyadriclinic/prod/api-key हा abc123 value सह SecureString म्हणून ठेवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम फक्त एक secret वाचा

का: प्रत्येक app ने फक्त स्वतःचं secret वाचावं.

काय करायचं: फक्त arn:aws:secretsmanager:ap-south-1:102103063049:secret:sahyadriclinic/prod/db-* वर secretsmanager:GetSecretValue allow करा.

कसं करायचं:
  1. { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
  2. प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
  3. Task ला लागेल तेवढंच द्या (least privilege).
  4. Double quotes व commas नीट वापरा. Check answer दाबा.

मध्यम Database password ठेवा

का: Secrets Manager secrets encrypt करतो व rotate करू शकतो; code मध्ये कधी नको.

काय करायचं: secret.json मधल्या value ने sahyadriclinic/prod/db secret बनवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम CloudFormation: web SG

का: फक्त 443 उघडल्याने server सुरक्षित.

काय करायचं: 0.0.0.0/0 कडून TCP 443 allow करणारा AWS::EC2::SecurityGroup. GroupDescription द्या.

कसं करायचं:
  1. Task मधल्या top-level keys पासून सुरू करा.
  2. Child keys 2 spaces ने indent करा (tabs नकोत).
  3. प्रत्येक property मध्ये task मधली value भरा.
  4. Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.

अवघड Path खालचे सगळे parameters वाचा

का: Path config गटात ठेवतो, एका call ने सगळं load.

काय करायचं: /sahyadriclinic/prod खालचे सगळे parameters, sub-paths सह, decrypted मिळवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड Secret आत्ता rotate करा

का: Rotation password schedule ने किंवा हवं तेव्हा बदलतो.

काय करायचं: sahyadriclinic/prod/db secret चं rotation आत्ता सुरू करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड Office बाहेरून access deny

का: aws:SourceIp सह explicit Deny इतर ठिकाणांहून keys वापर रोखतो.

काय करायचं: एक Deny statement: source IP 203.0.113.0/24 मध्ये नसेल तेव्हा * resources वर * actions deny.

कसं करायचं:
  1. { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
  2. प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
  3. Task ला लागेल तेवढंच द्या (least privilege).
  4. Double quotes व commas नीट वापरा. Check answer दाबा.

उजळणी, तुलना आणि मुलाखत cards

हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.

Secrets Manager. SecretString मध्ये JSON. GetSecretValue, मग parse. PutSecretValue: जुना → AWSPREVIOUS. Lambda ने RotateSecret.
उजळणी card: Secrets Manager · PNG download करा · Card page उघडा
Parameter Store. Paths: /app/env/name. SecureString + WithDecryption. GetParametersByPath, paginate. मिनिटांसाठी cache.
उजळणी card: Parameter Store · PNG download करा · Card page उघडा
Secrets Manager vs Parameter Store. Secrets साठी encrypted store. / Config साठी key-value store.
तुलना: Secrets Manager vs Parameter Store · PNG download करा · Card page उघडा
Secrets वाचताना throttle?. प्रत्येक request ला read. 5 मिनिटं cache. Lambda: extension वापरा.
मुलाखत card: Secrets वाचताना throttle? · PNG download करा · Card page उघडा

अजून cards: Ravi Sir's Cards.