Course-এর সূচি

21.3

SSM Parameter Store বনাম Secrets Manager

hierarchy, tier আর policy, secret rotation, multi-Region secret, আর দুটোর মধ্যে কোনটা নেবে।

20 মিনিট পড়া + Animation

টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।

এই লেসন শেষে তুমি পারবে

  • বুঝিয়ে বলতে, password, API key আর configuration কেন code, AMI বা environment file-এ রাখা চলে না, আর AWS-এর কোন দুটো service এই কাজের জন্য।
  • SSM Parameter Store ব্যবহার করতে: parameter-এর type (String, StringList, KMS দিয়ে SecureString), /shop/prod/db_url-এর মতো hierarchy, path ধরে IAM, GetParametersByPath, AMI-র public parameter আর Secrets Manager-এর reference।
  • Standard আর Advanced tier-এর মধ্যে বাছতে (১০,০০০ বনাম ১,০০,০০০ parameter, 4 KB বনাম 8 KB, ফ্রি বনাম মাসে ০.০৫ USD), default আর higher throughput জানতে, আর parameter policy (Expiration, ExpirationNotification, NoChangeNotification) কাজে লাগাতে।
  • AWS Secrets Manager বুঝিয়ে বলতে: KMS দিয়ে encrypt করা secret, secret-এর automatic rotation (managed rotation, নয়তো চার ধাপ আর তিনটা staging label-ওয়ালা Lambda function), RDS-এর সাথে যোগ, দাম, resource policy আর multi-Region secret।
  • চেনা গোলমালগুলো ধরতে: kms:Decrypt ছাড়া role, network পথ না পাওয়া rotation function, চিরকাল password cache করে রাখা application, শুধু এক Region-এ থাকা secret।
  • Scenario-র keyword দেখে Parameter Store নাকি Secrets Manager, ঠিক করতে।

#কেন: code-এ রাখা password সবার password

লেসন ২১.১ আর ২১.২-এ আমরা দেখেছি ডেটা কীভাবে encrypt হয় আর key কীভাবে সামলাতে হয়। এই লেসন ছোট কিন্তু আরও বিপজ্জনক এক ধরনের ডেটা নিয়ে: application চালাতে যেসব value লাগে। Database-এর URL, database-এর password, payment gateway-র API key, একটা feature flag, কোন AMI ID দিয়ে launch হবে।

#সমস্যাটা কোথায়

ঢাকার একটা online shop, Daraz-এর মতো ছোট একটা marketplace, শুরু করেছিল সবাই যেভাবে করে। Database password বসানো ছিল config.py-তে, payment gateway-র key একটা .env file-এ, যেটা AMI-র ভেতরেই ঢুকে গিয়েছিল, আর debug করতে developer-রা production-এর setting নিজেদের laptop-এ কপি করত। তারপর এক বছরে তিনটা ঘটনা ঘটল:

  • এক contractor কয়েক ঘণ্টার জন্য repository-টা একটা public Git host-এ push করে ফেলল। Password আর key চিরকালের মতো তার history-তে রয়ে গেল।
  • Security auditor জানতে চাইলেন, গত ৯০ দিনে payment key কে কে পড়েছে। কেউ উত্তর দিতে পারল না।
  • Payment gateway-র পেছনের bank বলল, key প্রতি ৩০ দিনে বদলাতে হবে। বদলানো মানে প্রতিবার নতুন AMI আর নতুন করে deploy।

সমাধান হলো এই value-গুলো application-এর বাইরে রাখা, এমন একটা service-এ যেটা এগুলো encrypt করে রাখে, IAM দিয়ে ঠিক করে প্রতিটা value কে পড়তে পারবে, প্রতিটা পড়া CloudTrail-এ লিখে রাখে, আর deploy ছাড়াই value বদলাতে পারে। AWS-এ এমন দুটো service আছে:

  • AWS Systems Manager Parameter Store (SSM Parameter Store): configuration আর সাধারণ secret রাখার সস্তা, সহজ, hierarchy-ওয়ালা জায়গা।
  • AWS Secrets Manager: শুধু secret-এর জন্য বানানো, টাকা লাগে এমন service, যার সবচেয়ে বড় গুণ automatic rotation।

#SSM Parameter Store

#কী রাখা যায়

Parameter Store হলো AWS Systems Manager-এর একটা tool (পুরো service-টা লেসন ২৫.৩-এ)। এটা configuration ডেটা আর secret রাখার নিরাপদ, serverless, টেকসই একটা জায়গা, যেখান থেকে একটা সহজ SDK বা CLI call দিয়ে পড়া যায়। প্রতিটা parameter হলো একটা নাম আর একটা value, তিন type-এর যেকোনো একটা:

Typeকী রাখেউদাহরণ
Stringসাধারণ লেখা/shop/prod/db_url = shop-prod.example:5432
StringListকমা দিয়ে আলাদা করা তালিকা/shop/prod/allowed_cities = Dhaka,Chattogram,Sylhet
SecureStringKMS key দিয়ে encrypt করা লেখা: default হলো AWS managed key aws/ssm, চাইলে নিজের বাছা customer managed key/shop/prod/db_password

কাজের কিছু বৈশিষ্ট্য:

  • Encryption ঐচ্ছিক, আর ঝামেলাহীন। SecureString জমা রাখার সময় encrypt হয়, আর decrypt হয় শুধু তখন, যখন কোনো caller decryption চালু রেখে (--with-decryption) চায় আর তার KMS key ব্যবহারের অনুমতি থাকে (লেসন ২১.২)। Standard parameter সরাসরি KMS দিয়ে encrypt হয়; Advanced parameter-এ হয় envelope encryption, আর এটাও একটা কারণ যে parameter এক tier থেকে আরেক tier-এ ফেরত যেতে পারে না।
  • Version। প্রতিটা বদলে নতুন version হয়; Parameter Store শেষ ১০০টা রাখে। পুরোনো version পড়া যায় (name:3), বা কোনো একটা version-এ approved-এর মতো label বসানো যায়।
  • IAM দিয়ে নিরাপত্তা। কে কোন parameter পড়তে বা লিখতে পারবে, ঠিক করে parameter-এর ARN-এর ওপর IAM policy, আর প্রতিটা call CloudTrail-এ লেখা থাকে (লেসন ১৯.৬)।
  • EventBridge দিয়ে খবর। Parameter বদলালে বা policy-র কোনো event হলে rule চালু হতে পারে (লেসন ১৯.৫)।
  • সবখানে যোগ। CloudFormation, EC2 launch template, ECS task definition, Lambda, build pipeline আর Systems Manager-এর বাকি tool সরাসরি parameter পড়তে পারে।
  • Data type aws:ec2:image। কোনো String parameter-কে AMI ID রাখার parameter হিসেবে চিহ্নিত করা যায়; তখন Parameter Store রাখার আগে দেখে নেয় ID-টা আসলেই আছে কি না।

#Hierarchy আর IAM

Parameter-এর নামে slash থাকতে পারে, তাই এগুলো folder-এর মতো সাজানো যায়, ১৫ স্তর পর্যন্ত। চেনা একটা সাজানো হলো আগে application, তারপর environment, তারপর setting:

/shop/
    dev/
        db_url
        db_password          (SecureString)
        payment/mode
    prod/
        db_url
        db_password          (SecureString)
        payment/api_key      (SecureString)
/billing/
    prod/...

এর থেকে দুটো সুবিধা আসে:

  • এক লাইনের IAM-এ environment ধরে access। Parameter-এর ARN-এর ভেতরেই তার নাম, যেমন arn:aws:ssm:ap-southeast-1:111122223333:parameter/shop/prod/db_password। তাই parameter/shop/dev/*-এর ওপর একটা policy ঠিক development folder-টাই দেয়, আর কিছু না। IAM-এর সাধারণ নিয়মই খাটে: Allow না থাকা মানে implicit deny (লেসন ২.২)।
  • এক call-এ পুরো folder। /shop/dev/ path দিয়ে GetParametersByPath (sub-folder-এর জন্য --recursive সহ) ওই path-এর নিচের সব parameter ফেরত দেয়, এক page-এ ১০টা করে, তাই application-কে নামের তালিকা রাখতে হয় না। GetParameters একবারে নাম ধরে ১০টা পর্যন্ত parameter আনে।

Development-এর EC2 instance-এর role-এর শুধু এটুকু লাগে:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["ssm:GetParameter", "ssm:GetParameters", "ssm:GetParametersByPath"],
      "Resource": "arn:aws:ssm:ap-southeast-1:111122223333:parameter/shop/dev/*"
    },
    {
      "Effect": "Allow",
      "Action": "kms:Decrypt",
      "Resource": "arn:aws:kms:ap-southeast-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }
  ]
}

দ্বিতীয় statement-টা দরকার শুধু সেই SecureString value-র জন্য, যেগুলো customer managed key দিয়ে encrypt করা: parameter পড়া আর সেটা decrypt করা দুটো আলাদা অনুমতি। AWS managed key aws/ssm হলে তার key policy আগে থেকেই একই account-এর principal-দের Parameter Store-এর মাধ্যমে key ব্যবহার করতে দেয়।

Parameter Store থেকে configuration পড়া

ঢাকার একটা online shop তার setting রাখে /shop/dev/ আর /shop/prod/-এর নিচে। আলাদা IAM role নিয়ে দুটো EC2 app সেগুলো পড়ে। প্রতিটা call-এ IAM আর KMS কী কী যাচাই করে, দেখো।

পরিস্থিতি

Password জমা থাকে encrypt অবস্থায়; অনুমতি থাকা caller-এর জন্যই শুধু Parameter Store KMS-কে দিয়ে সেটা decrypt করায়।

Dev approle dev-app
Prod approle prod-app
Parameter Store
IAM policy
KMSalias/shop-prod
parameter চাই

Request

নাম

/shop/prod/db_password

Decryption সহ

true

ধাপ 1 / 4
1

চালু হওয়ার সময় prod app decryption চালু রেখে /shop/prod/db_password চায়। Password code-এ নেই, AMI-তে নেই, Git repository-তেও নেই, তাই repository ফাঁস হলেও কিছু ফাঁস হয় না।

#Public parameter আর Secrets Manager-এর reference

দুটো বিশেষ path জেনে রাখা ভালো:

  • /aws/service/...: AWS-এর প্রকাশ করা public parameter। সবচেয়ে পরিচিত হলো সবচেয়ে নতুন AMI ID, যেমন /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64। প্রতিটা Region-এ এটা আছে, সেই Region-এর ID নিয়ে, পড়তে কোনো টাকা লাগে না, আর launch template বা CloudFormation template নির্দিষ্ট AMI ID-র বদলে parameter-এর নাম লিখতে পারে (লেসন ৪.৩)। Region আর service-এর তালিকা, আর অন্য AMI (Windows, Bottlerocket, ECS-optimised)-ও AWS এভাবেই প্রকাশ করে।
  • /aws/reference/secretsmanager/<secret-name>: Secrets Manager পর্যন্ত সোজা রাস্তা। এই path-এ decryption চালু রেখে GetParameter করলে Secrets Manager থেকে secret-টা ফেরত আসে, তাই যে code বা tool আগে থেকে Parameter Store পড়ে, নতুন SDK ছাড়াই সে একটা secret পড়তে পারে। এই path-এ চলে শুধু GetParameter আর GetParameters (GetParametersByPath না, লেখা না, version না), আর caller-এর secret-এর ওপর অনুমতিও লাগে। Parameter Store নিজে কিছুই রাখে না: secret থাকে Secrets Manager-এই।

#Standard আর Advanced tier

প্রতিটা parameter একটা tier-এ থাকে, account আর Region ধরে:

StandardAdvanced
সর্বোচ্চ কতগুলো parameter (account আর Region প্রতি)১০,০০০১,০০,০০০
Value-র সর্বোচ্চ মাপ4 KB8 KB
Parameter policyনেইআছে
অন্য account-এর সাথে share (AWS Resource Access Manager)নাহ্যাঁ
রাখার খরচকোনো টাকা নেইপ্রতি parameter মাসে ০.০৫ USD (ঘণ্টা ধরে ভাগ করে)
সাধারণ throughput-এ API callকোনো টাকা নেইপ্রতি ১০,০০০ interaction-এ ০.০৫ USD
Tier বদলAdvanced-এ তোলা যায়Standard-এ আর ফেরানো যায় না

Advanced parameter-কে নামানো যায় না, কারণ তার value 4 KB-র বড় হতে পারে, তার policy হারিয়ে যাবে, আর তার encryption-এর ধরনও আলাদা। টাকা দেওয়া বন্ধ করতে হলে মুছে ফেলো, তারপর নতুন একটা Standard parameter বানাও। Account-এর একটা default tier setting-ও আছে (Standard, Advanced, বা Intelligent-Tiering, যেটা Advanced বাছে শুধু তখন, যখন request-এর সেটা লাগে, যেমন 4 KB-র বড় value বা policy); এটা শুধু নতুন parameter-এর ওপর খাটে।

#Throughput: সেকেন্ডে কতগুলো call

Tier ঠিক করে কী রাখা যাবে; throughput ঠিক করে সেকেন্ডে কত request, আর এটা আলাদা একটা setting:

  • Default throughput: সেকেন্ডে ৪০টা transaction পর্যন্ত, GetParameter, GetParameters আর GetParametersByPath মিলিয়ে, account আর Region প্রতি। Standard parameter-এর জন্য ফ্রি।
  • Higher throughput (account আর Region-এর একটাই setting): সেকেন্ডে ১০,০০০টা GetParameter, ১,০০০টা GetParameters আর ১০০টা GetParametersByPath পর্যন্ত। তখন প্রতিটা API interaction-এর দাম লাগে, প্রতি ১০,০০০-এ ০.০৫ USD, Standard parameter-এর জন্যও। একটা request-এর একটা parameter মানে একটা interaction, তাই যে call দশটা parameter ফেরত দেয়, সেটা গোনা হয় দশটা।
  • SecureString পড়ার সময় Region-এর KMS request quota আরও সীমা টানতে পারে।

Throttle হওয়ার সাধারণ কারণ হলো এমন application, যে প্রতিটা request-এ parameter পড়ে। চালু হওয়ার সময় একবার পড়ো (বা Lambda environment initialise হওয়ার সময়), আর কয়েক মিনিট cache করে রাখো। Lambda-র জন্য AWS Parameters and Secrets Lambda Extension হলো দুটো service-এর জন্যই বানিয়ে রাখা একটা local cache।

#Parameter policy (শুধু Advanced-এ)

Parameter policy হলো Advanced parameter-এর গায়ে লাগানো একটা নিয়ম, যেটা Parameter Store নিজের নিয়মিত scan দিয়ে মানিয়ে চলে, তোমার কোনো code লাগে না। একটা parameter-এ ১০টা policy পর্যন্ত, তিন ধরনের:

Policyকী করেউদাহরণ
Expirationনির্দিষ্ট তারিখ আর সময়ে parameter মুছে দেয় (গোপন ডেটার জন্য একটা TTL)১ ডিসেম্বর partner-এর token মুছে দাও
ExpirationNotificationমেয়াদ শেষের কয়েক দিন বা ঘণ্টা আগে EventBridge-এ একটা event পাঠায়১৫ দিন আগে সতর্ক করো
NoChangeNotificationকয়েক দিন বা ঘণ্টা ধরে parameter বদলানো না হলে EventBridge-এ event পাঠায়অনুমোদিত AMI ID ৬০ দিনের পুরোনো হলে জানাও
[
  { "Type": "Expiration", "Version": "1.0", "Attributes": { "Timestamp": "2026-12-01T00:00:00.000Z" } },
  { "Type": "ExpirationNotification", "Version": "1.0", "Attributes": { "Before": "15", "Unit": "Days" } },
  { "Type": "NoChangeNotification", "Version": "1.0", "Attributes": { "After": "60", "Unit": "Days" } }
]

দুটো খুঁটিনাটিতে অনেকে আটকায়: parameter-এর value বদলালে তার মেয়াদের তারিখ সরে না (সেজন্য policy বদলাতে হয়), আর নতুন policy দিয়ে put-parameter করলে parameter-এর আগের সব policy মুছে নতুনগুলো বসে, তাই প্রতিবার পুরো তালিকাটাই পাঠাও।

Tier, parameter policy আর throughput

Shop-এর ops engineer বড় value রাখে, partner-এর একটা token-এর মেয়াদ বেঁধে দেয়, আর flash sale সামলায়। Standard tier কোথায় থামে আর টাকার option কোথা থেকে শুরু, দেখো।

পরিস্থিতি

Standard parameter-এ সর্বোচ্চ 4 KB ধরে। এর বড় value-র জন্য Advanced tier লাগে।

Ops engineer
Order functionflash sale
Parameter Store
EventBridge
Ops email
6 KB রাখো

Request

নাম

/shop/prod/payment/routing

Tier

Standard

মাপ

6 KB

ধাপ 1 / 3
1

Engineer payment gateway-এর routing নিয়মের একটা 6 KB JSON Standard parameter হিসেবে রাখতে চায়, যেটা ফ্রি আর default।

#AWS Secrets Manager

#জিনিসটা কী

AWS Secrets Manager বানানোই হয়েছে শুধু secret-এর জন্য: database credential, third-party API key, OAuth client secret, SSH key। Parameter Store-এর তুলনায় এখানে এমন জিনিস যোগ হয়েছে, যেগুলো একটা secret-এর সারা জীবন ধরে লাগে:

  • একটা secret হলো একটা নাম আর একটা value, সাধারণত key-value জোড়ার একটা JSON document (database হলে: engine, host, port, user name, password), 64 KB পর্যন্ত। Binary-ও হতে পারে।
  • সবসময় KMS দিয়ে encrypt করা: AWS managed key aws/secretsmanager দিয়ে, বা তোমার বাছা customer managed key দিয়ে। Secrets Manager caller-এর হয়ে KMS ডাকে, তাই customer managed key হলে caller-এর secretsmanager:GetSecretValue-এর সাথে kms:Decrypt-ও লাগে।
  • Version আর staging label। প্রতিটা value একটা version; AWSCURRENT-এর মতো label বলে দেয় কোন version এখন চালু। সাধারণ GetSecretValue ফেরত দেয় AWSCURRENT version।
  • নির্দিষ্ট schedule-এ automatic rotation, সবচেয়ে বড় গুণ (পরের অংশে)।
  • Random password বানানো (GetRandomPassword), যাতে কাউকে password বানিয়ে ভাবতে না হয়।
  • secret-এর গায়ে resource policy, অন্য account থেকে access-এর জন্য।
  • Audit: প্রতিটা পড়া আর বদল CloudTrail-এ।
  • যোগাযোগ: RDS, Aurora, Redshift আর DocumentDB নিজেদের admin password এখানে রাখতে পারে; RDS Proxy নিজের credential এখান থেকে পড়ে; ECS আর EKS container-এ secret ঢুকিয়ে দেয়; CloudFormation dynamic reference দিয়ে পড়ে।

দাম: প্রতি secret মাসে ০.৪০ USD (মাসের অংশ হলে ভাগ করে), সাথে প্রতি ১০,০০০ API call-এ ০.০৫ USD। অন্য Region-এর একটা replica-রও bill হয় একটা secret হিসেবে। প্রতিটা setting Secrets Manager-এ না রাখার মূল কারণ এটাই।

#Automatic rotation

Notes এই বৈশিষ্ট্যকে বলেছে “automatic key rotation”। কথাটা সহজেই ভুল বোঝা যায়: Secrets Manager rotate করে secret-এর value (password বা API key), আর database বা service-এও সেটা বদলে দেয়; কোনো KMS key rotate করে না। KMS key material-এর rotation KMS-এর আলাদা একটা বৈশিষ্ট্য (লেসন ২১.২)।

Schedule। UTC-তে একটা rate() বা cron() expression, প্রতি ৪ ঘণ্টা থেকে শুরু করে প্রতি ৯৯৯ দিন পর্যন্ত, সাথে একটা rotation window (অন্তত ১ ঘণ্টা), যার মধ্যে rotation হবে। Rotation চালু করলে default হিসেবে তখনই একবার rotate হয়। হাতে value বদলালে সেটাও পরের তারিখের হিসাবে একটা rotation ধরা হয়।

কাজটা হয় দুই উপায়ে:

  • Managed rotation: secret-টা যে service-এর, সে নিজেই rotate করে, তোমার account-এ কোনো Lambda function ছাড়াই। Amazon RDS আর Aurora (master user), Redshift (admin password) আর DocumentDB (master user)-এ এটা আছে। “manage master credentials in AWS Secrets Manager” (--manage-master-user-password) চালু করে database বানালে password বানানো, রাখা আর rotate করা সবই হয়, default হিসেবে প্রতি ৭ দিনে, schedule বদলানো যায় (লেসন ৭.৪)।
  • Lambda function দিয়ে rotation: বাকি সব secret-এর জন্য। RDS আর Aurora-র engine (MySQL, PostgreSQL, MariaDB, Oracle, SQL Server, Db2), Redshift, DocumentDB আর ElastiCache-এর জন্য AWS function-এর template দেয়; অন্য কিছুর জন্য (যেমন third-party API key) generic template থেকে নিজে function লেখো।

একটা rotation function-কে চারবার ডাকা হয়, প্রতিটা ধাপে একবার, আর application-কে নিরাপদ রাখতে সে staging label ব্যবহার করে:

  1. createSecret

    নতুন একটা password বানাও আর সেটা AWSPENDING label দিয়ে নতুন version হিসেবে রাখো। AWSPENDING কেউ পড়ে না, তাই কোনো application এখনো এটা ব্যবহার করে না।

  2. setSecret

    Database-এ (বা service-এ) login করে credential বদলে AWSPENDING-এর value করে দাও।

  3. testSecret

    AWSPENDING-এর value দিয়ে login করে প্রমাণ করো যে সেটা কাজ করে।

  4. finishSecret

    AWSCURRENT নতুন version-এ সরিয়ে দাও। Secrets Manager পুরোনোটার গায়ে বসায় AWSPREVIOUS, অর্থাৎ শেষ ভালো value।

কোনো ধাপ ব্যর্থ হলে AWSCURRENT সরেনি, তাই application পুরোনো, এখনো চালু credential-ই রাখে; Secrets Manager window-এর মধ্যে আবার চেষ্টা করে আর ব্যর্থতাটা CloudTrail-এ লেখে, যেটা একটা EventBridge rule দিয়ে alert বানানো যায়।

Database user-এর জন্য দুটো rotation কৌশল:

  • Single user: একটাই user, তার password জায়গায় বসেই বদলায়। সহজ; কিন্তু setSecret-এর পর থেকে application নিজের কপি refresh করা পর্যন্ত, পুরোনো password দিয়ে নতুন login ব্যর্থ হয়। বেশিরভাগ application-এর জন্য চলে, যারা secret আবার পড়ে retry করে।
  • Alternating users: দুটো user (app_user আর app_user_clone) পালা করে কাজ করে। প্রতিটা rotation সেই user-কে বদলায়, যে এখন current না, তাই application-এর হাতে থাকা credential পরের rotation পর্যন্ত বৈধ থাকে। Password বদলানোর জন্য function-এর আলাদা একটা admin secret লাগে। Availability-র জন্য সবচেয়ে ভালো।

Secret rotation, label ধরে ধরে

Shop-এর orders database-এর user প্রতি ৩০ দিনে rotate হয়। Secret-এর version আর তাদের staging label, database কোন password মানছে, আর application কী করছে, ধাপে ধাপে দেখো।

পরিস্থিতি

চারটা ধাপ: createSecret, setSecret, testSecret, finishSecret। AWSCURRENT label সরে একদম শেষে।

কে কাজ করছে

এখনো কেউ না

Database মানছে

password A

Application

password A দিয়ে login করে

Secret-এর version আর label

v1 · password A

AWSCURRENT
ধাপ 1 / 6
1

০ দিন: secret-এর একটাই version, v1, label AWSCURRENT। অন্য label না চাইলে GetSecretValue AWSCURRENT-ই ফেরত দেয়, তাই application password A ব্যবহার করছে।

#Application থেকে secret ব্যবহার

পথটা সবসময় একই: application-এর IAM role GetSecretValue ডাকে, Secrets Manager IAM আর secret-এর resource policy দেখে, KMS decrypt করে, value TLS দিয়ে ফেরত আসে। বাস্তবে যেগুলো জরুরি:

  • Cache। চালু হওয়ার সময় secret পড়ো, কয়েক মিনিট পরপর refresh করো, আর authentication error দিয়ে login ব্যর্থ হলে আবার পড়ো (rotation-এর ঠিক পরের মুহূর্তটা এতে ঢাকা পড়ে)। AWS SDK-তে caching client আছে; Lambda-র জন্য AWS Parameters and Secrets Lambda Extension এই কাজ করে; EC2, container আর on-premises-এ করে Secrets Manager Agent (২০২৪)। BatchGetSecretValue এক call-এ ২০টা পর্যন্ত secret পড়ে।
  • Network। Secrets Manager-এ পৌঁছাতে হয় একটা public Regional endpoint-এ। Private subnet-এর কোনো function বা instance-এর লাগবে Secrets Manager-এর একটা interface VPC endpoint (private DNS থাকলে সাধারণ নামটাই চলে) বা একটা NAT gateway; না থাকলে call শুধু ঝুলে থাকে, timeout না হওয়া পর্যন্ত (লেসন ১৫.৩, লেসন ২২.২)। একটা rotation function-এর দুটো পথ লাগে: Secrets Manager পর্যন্ত, আর database-এর port পর্যন্ত।
  • Container। ECS task definition-এর secrets অংশে একটা Secrets Manager secret বা একটা Parameter Store parameter-এর নাম লেখা যায়, আর task চালু হওয়ার সময় ECS value-টা environment variable হিসেবে ঢুকিয়ে দেয় (লেসন ১৪.২); EKS ব্যবহার করে Secrets Store CSI driver। ঢুকিয়ে দেওয়া value secret rotate হলে বদলায় না, তাই task আবার চালু করতে হয়, নয়তো app-কে নিজেই secret পড়তে হয়।
  • RDS Proxy database-এর credential নিজেই Secrets Manager থেকে পড়ে আর rotation টের পেয়ে যায়, তাই একটা Lambda function-এর proxy পর্যন্ত শুধু IAM authentication লাগে (লেসন ৭.৪)।
  • CloudFormation-এর dynamic reference secret-কে template-এর বাইরে রাখে (লেসন ২৫.১): secret-এর জন্য {{resolve:secretsmanager:prod/shop/orders-db:SecretString:password}}, String parameter-এর জন্য {{resolve:ssm:/shop/prod/db_url}}, আর SecureString-এর জন্য {{resolve:ssm-secure:/shop/prod/db_password}}, যেটা শুধু কিছু resource property মানে। AWS::RDS::DBCluster-এর মতো resource সোজা ManageMasterUserPassword: true-ও দিতে পারে।

একটা application secret পড়ে

Shop-এর order function আর তার rotation function চলে private subnet-এ, কোনো NAT gateway নেই। Secrets Manager-এ পৌঁছানো হয় একটা interface VPC endpoint দিয়ে।

পরিস্থিতি

একটা GetSecretValue call, একবার KMS decrypt, তারপর database-এ login। Value cache-এ থাকে, প্রতি request-এ আনা হয় না।

VPC, private subnet
Order function
Rotation function
Endpoint
Orders DB
Secrets Manager
KMSalias/shop-secrets
GetSecretValue
ধাপ 1 / 5
1

নতুন একটা Lambda environment চালু হয়ে prod/shop/orders-db secret চায়। Private DNS-এর কারণে Secrets Manager-এর সাধারণ নামটাই endpoint-এর private IP-তে resolve হয়, তাই code বদলাতে হয় না।

#অন্য account থেকে access

একটা secret-এর গায়ে resource policy বসিয়ে অন্য account-এর কোনো principal-কে অনুমতি দেওয়া যায়, যেমন account 444455556666-এর একটা Lambda role account 111122223333-এর prod/shop/orders-db পড়বে। তিনটা জায়গাতেই অনুমতি থাকতে হবে:

  1. Secret-এর resource policy অন্য account-এর role-কে secretsmanager:GetSecretValue দেয়।
  2. Secret encrypt করা একটা customer managed key দিয়ে, যার key policy ওই role-কে kms:Decrypt দেয়। AWS managed key aws/secretsmanager অন্য account থেকে ব্যবহার করা যায় না, তাই ওই key দিয়ে encrypt করা secret share করা যায় না।
  3. Role-এর নিজের IAM policy ওই ARN-গুলোর ওপর দুটো action-ই দেয়।

Parameter Store-এ resource policy নেই। Advanced parameter অন্য account-এর সাথে AWS Resource Access Manager দিয়ে share করা যায় (শুধু পড়া, পুরো ARN দিয়ে), কিন্তু পরীক্ষায় cross-account secret-এর উত্তর হলো resource policy-সহ Secrets Manager।

#Multi-Region secret

যে application দুটো Region-এ চলে, যেমন active-active, বা Aurora global database-এর ওপর disaster recovery-র জন্য একটা warm standby (লেসন ৭.৩), তার দুই জায়গাতেই একই credential লাগে। Multi-Region secret:

  • Secret বানাও একটা primary Region-এ, তারপর replica Region যোগ করো। Secrets Manager encrypted value আর তার metadata (tag, resource policy) কপি করে, আর replica-গুলোকে primary-র সাথে sync রাখে।
  • Replica-র নাম একই; তার ARN-এ শুধু Region-টা আলাদা। তাই প্রতিটা Region-এর code নিজের Region-এর endpoint থেকে একই নাম পড়ে, latency কম, আর অন্য Region-এর ওপর নির্ভরতা নেই।
  • প্রতিটা replica encrypt হয় তার নিজের Region-এর একটা KMS key দিয়ে (সেখানকার aws/secretsmanager, বা তোমার বলে দেওয়া customer managed key, যেমন লেসন ২১.২-এর একটা multi-Region key)।
  • Rotation চলে শুধু primary-তে; নতুন value প্রতিটা replica-তে পৌঁছে যায়।
  • দুর্যোগের সময় একটা replica-কে standalone secret-এ promote করা যায়: তখন সেটা ওই Region-এর একটা সাধারণ secret, যেটা বদলানো, rotate করা আর পরে আবার replicate করা যায়।

Multi-Region secret

একটা telco তার self-care app চালায় Singapore-এ, আর Mumbai-তে একটা warm standby রাখে, Aurora global database-এর ওপর। দুই Region-এই একই database password লাগে।

পরিস্থিতি

একটা secret, অন্য Region-এ replicate করা, Secrets Manager নিজেই sync রাখে।

Singaporeap-southeast-1
Mumbaiap-south-1
App
Aurora
Primary secret
Aurora
App
Replica secretsync করা
replicate
ধাপ 1 / 3
1

Secret বানানো হয় Singapore-এ, replica Region হিসেবে Mumbai দিয়ে। Replica-র নাম একই, আর তার ARN-এ শুধু Region-টা আলাদা।

#Parameter Store, নাকি Secrets Manager?

SSM Parameter StoreAWS Secrets Manager
কীসের জন্য বানানোConfiguration আর সাধারণ secretSecret (credential, API key)
Encryptionঐচ্ছিক (KMS দিয়ে SecureString)সবসময়, KMS দিয়ে
Automatic rotationনেইআছে (managed, বা Lambda function)
মেয়াদ আর বদলের সতর্কতাParameter policy (Advanced)এমন policy নেই; বদলে আছে rotation
Value-র সর্বোচ্চ মাপ4 KB (Standard), 8 KB (Advanced)64 KB
Region প্রতি সর্বোচ্চ সংখ্যা১০,০০০ (Standard), ১,০০,০০০ (Advanced)৫,০০,০০০
খরচStandard: রাখা আর সাধারণ throughput ফ্রি; Advanced: প্রতিটা মাসে ০.০৫ USDপ্রতি secret মাসে ০.৪০ USD + প্রতি ১০,০০০ call-এ ০.০৫ USD
Hierarchy আর GetParametersByPathআছেFolder নেই (নামে slash থাকতে পারে); BatchGetSecretValue
Cross-account accessAWS Resource Access Manager দিয়ে Advanced parameter shareSecret-এর resource policy + customer managed key
Cross-Region replicationনেইMulti-Region secret
Database-এর সাথে নিজস্ব যোগনেইRDS, Aurora, Redshift, DocumentDB, RDS Proxy
AWS-এর public ডেটা/aws/service/-এর নিচে AMI ID আর আরও কিছুনেই
CloudFormation dynamic referencessm, ssm-securesecretsmanager

একটা চেনা, বুদ্ধিমান ভাগাভাগি হলো দুটোই ব্যবহার করা: configuration আর সস্তা, স্থির secret Parameter Store-এ, যে credential rotate করতেই হবে সেগুলো Secrets Manager-এ, আর একই code দিয়ে সব Parameter Store-এর মাধ্যমে পড়তে চাইলে /aws/reference/secretsmanager/ path।

Parameter Store, নাকি Secrets Manager?

প্রতিটা card একটা scenario-র চাহিদা। সবচেয়ে মানানসই service-টা বাছো, তারপর কারণটা পড়ো।

1.২০০টা feature flag আর dev ও prod-এর database URL রাখতে হবে, যত কম খরচে সম্ভব।

2.Compliance-এর জন্য RDS for PostgreSQL-এর password প্রতি ৩০ দিনে আপনা-আপনি rotate করতে হবে।

3.Launch template-কে প্রতিটা Region-এ সবসময় সবচেয়ে নতুন Amazon Linux 2023 AMI নিতে হবে।

4.Partner-এর credential-এর 30 KB-র একটা bundle একটা value হিসেবে রাখতে হবে।

5.Disaster recovery-র জন্য একই database credential Singapore আর Mumbai দুই জায়গায় থাকতে হবে, আর আপনা-আপনি sync থাকতে হবে।

6.একটা অস্থায়ী courier token ৩০ দিন পরে মুছে যেতে হবে, ৭ দিন আগে একটা email-সহ, কোনো code না লিখে।

7.RDS Proxy-কে database-এ login করতে হবে, application-এ কোনো credential না রেখে।

8.একটা SMS gateway-র API key encrypt করে রাখতে হবে। কখনো rotate করার দরকার নেই, আর বাজেট কম।

9.6 KB-র একটা application configuration file, গোপন কিছু না, এক জায়গায় রাখতে হবে।

10.Account 444455556666-এর একটা Lambda function-কে account 111122223333-এর একটা database password পড়তে হবে, জমা রাখা value-র ওপর resource policy দিয়ে।

প্রথমবারেই ঠিক: 0 / 0 (10)

#কোথায় কোথায় গোলমাল হয়

  • ssm:GetParameter বা secretsmanager:GetSecretValue-এর অনুমতি থাকার পরও AccessDeniedException: value-টা customer managed key দিয়ে encrypt করা, আর role-এর সেই key-তে kms:Decrypt নেই (বা key policy তাকে বিশ্বাস করে না)। KMS-এর অনুমতি যোগ করো।
  • Dev server production-এর value পড়তে পারছে: IAM policy-তে parameter/shop/dev/*-এর বদলে লেখা parameter/*। Resource ARN ঠিক করো; production-এর জন্য আলাদা account-এর কথাও ভাবো (লেসন ২০.১)।
  • SecureString ফেরত আসছে লম্বা একটা encrypted লেখা হয়ে: call-এ decryption চাওয়া হয়নি (--with-decryption / WithDecryption=true)।
  • 5 KB-র value-তে ValidationException: parameter-টা Standard (4 KB)। Advanced নাও, আর 8 KB-র বড় হলে Secrets Manager বা S3।
  • ভিড়ের সময় Parameter Store থেকে ThrottlingException: default সেকেন্ডে ৪০টা, সব get call মিলিয়ে। Value cache করো, Lambda environment-এ একবার পড়ো, নয়তো higher throughput চালু করো (টাকা লাগে)।
  • একটা parameter উধাও: Expiration policy সেটা মুছে দিয়েছে। আগে সতর্ক হতে ExpirationNotification রাখো, তারিখের আগেই নতুন করো।
  • নতুন policy যোগ করার পর পুরোনোগুলো নেই: নতুন policy-র তালিকা পুরোনো তালিকার জায়গা নেয়। প্রতিবার সব policy পাঠাও।
  • Rotation timeout দিয়ে ব্যর্থ: rotation function database-এর VPC-তে নেই, database port-এ তার security group-এর অনুমতি নেই, বা Secrets Manager পর্যন্ত যাওয়ার endpoint বা NAT gateway নেই। AWSCURRENT পুরোনো value-তেই থাকে, তাই application চলে, কিন্তু password rotate হয় না। EventBridge দিয়ে ব্যর্থ rotation-এর alert রাখো।
  • সফল rotation-এর ক’দিন পরে “password authentication failed”: application একবার secret পড়ে চিরকাল cache করে রেখেছিল, আর টের পেল পরের নতুন connection-এ (একটা failover, pool আবার চালু)। সময়সীমা দিয়ে cache রাখো, authentication error হলে আবার পড়ো, বা RDS Proxy নয়তো alternating users ব্যবহার করো।
  • ECS task এখনো পুরোনো password ব্যবহার করছে: environment variable হিসেবে ঢোকানো value পড়া হয় শুধু task চালুর সময়। Rotation-এর পর task আবার চালু করো, বা app-কে দিয়ে secret পড়াও।
  • দুর্যোগের সময় standby Region login করতে পারছে না: secret ছিল শুধু বন্ধ হয়ে যাওয়া Region-এ। App যেসব Region-এ চলে, সবখানে replicate করো।
  • অন্য account share করা secret পড়তে পারছে না: secret encrypt করা aws/secretsmanager দিয়ে, বা key policy, resource policy কিংবা caller-এর IAM policy-র কোনো একটা নেই। তিনটাতেই অনুমতি লাগবে।
  • Secrets Manager-এর অবাক করা bill: শত শত সাধারণ setting secret হিসেবে রাখা, বা প্রতিটা request-এ secret পড়া। Configuration Parameter Store-এ সরাও, আর পড়াগুলো cache করো।

#System design-এ কোথায় বসে

যেসব নকশা বারবার দেখবে:

  • Twelve-factor configuration: build-এর ভেতরে কোনো configuration না; একই AMI বা container image dev আর prod-এ চলে, আর চালু হওয়ার সময় /app/<env>/... পড়ে নেয়।
  • Golden AMI pipeline: একটা EC2 Image Builder pipeline সবচেয়ে নতুন অনুমোদিত AMI ID একটা parameter-এ লেখে; launch template আর Auto Scaling group সেই parameter-এর দিকে তাকায়।
  • Serverless-এ ডেটা access: Lambda → RDS Proxy (IAM auth) → database, database-এর credential Secrets Manager-এ (লেসন ১৫.৩)।
  • একাধিক account: secret থাকে workload account-এ; একটা কেন্দ্রীয় security account organization trail দিয়ে পড়াগুলো audit করে।
  • Disaster recovery: application-এর লাগে এমন প্রতিটা secret recovery Region-এ replicate করা, আর runbook-এ সেটা promote করার ধাপও থাকে।

#নিজে করে দেখো

Command-গুলো AWS CLI v2 দিয়ে, ap-southeast-1-এ। প্রতিটা secret মাসে ০.৪০ USD আর Advanced parameter মাসে ০.০৫ USD, তাই শেষে মুছে দিয়ো। নিচের সব value বানানো উদাহরণ।

# 1. Plain and encrypted parameters in a hierarchy (Standard tier, no charge)
aws ssm put-parameter --name /shop/dev/db_url --type String --value "shop-dev.example:5432"
aws ssm put-parameter --name /shop/dev/db_password --type SecureString --value "EXAMPLE-dev-pass"
aws ssm put-parameter --name /shop/dev/payment/mode --type String --value sandbox

# 2. Read the whole dev folder, decrypted
aws ssm get-parameters-by-path --path /shop/dev --recursive --with-decryption \
  --query 'Parameters[].[Name,Type,Value]' --output table
# -------------------------------------------------------------
# |                    GetParametersByPath                    |
# +---------------------------+--------------+----------------+
# |  /shop/dev/db_password    |  SecureString|  EXAMPLE-dev-pass
# |  /shop/dev/db_url         |  String      |  shop-dev.example:5432
# |  /shop/dev/payment/mode   |  String      |  sandbox       |
# +---------------------------+--------------+----------------+

# 3. The newest Amazon Linux 2023 AMI from a public parameter
aws ssm get-parameter --name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 \
  --query Parameter.Value --output text
# ami-0abcdef1234567890

# 4. An Advanced parameter with an expiry, a warning 15 days before, and a no-change alert
aws ssm put-parameter --name /shop/prod/courier/token --type SecureString --tier Advanced \
  --value "EXAMPLE-courier-token" \
  --policies '[{"Type":"Expiration","Version":"1.0","Attributes":{"Timestamp":"2026-12-01T00:00:00.000Z"}},
               {"Type":"ExpirationNotification","Version":"1.0","Attributes":{"Before":"15","Unit":"Days"}},
               {"Type":"NoChangeNotification","Version":"1.0","Attributes":{"After":"20","Unit":"Days"}}]'
aws ssm describe-parameters --parameter-filters "Key=Name,Values=/shop/prod/courier/token" \
  --query 'Parameters[0].[Tier,Policies[].PolicyType]'
# [ "Advanced", [ "Expiration", "ExpirationNotification", "NoChangeNotification" ] ]

# 5. A secret with a generated password, and a 30-day rotation using an existing rotation function
PW=$(aws secretsmanager get-random-password --password-length 32 --exclude-punctuation \
  --query RandomPassword --output text)
aws secretsmanager create-secret --name prod/shop/orders-db \
  --secret-string "{\"engine\":\"postgres\",\"host\":\"orders.example\",\"port\":5432,\"username\":\"app_user\",\"password\":\"$PW\"}"
aws secretsmanager rotate-secret --secret-id prod/shop/orders-db \
  --rotation-lambda-arn arn:aws:lambda:ap-southeast-1:111122223333:function:shop-rotate-postgres \
  --rotation-rules '{"ScheduleExpression":"rate(30 days)","Duration":"3h"}'

# 6. See the versions and their staging labels after a rotation
aws secretsmanager describe-secret --secret-id prod/shop/orders-db --query VersionIdsToStages
# { "a1b2c3d4-1111-2222-3333-444455556666": [ "AWSPREVIOUS" ],
#   "e5f6a7b8-7777-8888-9999-000011112222": [ "AWSCURRENT" ] }

# 7. Read the current value, and the same secret through Parameter Store
aws secretsmanager get-secret-value --secret-id prod/shop/orders-db --query SecretString --output text
aws ssm get-parameter --name /aws/reference/secretsmanager/prod/shop/orders-db --with-decryption \
  --query Parameter.Value --output text

# 8. Replicate to Mumbai, and promote the replica (run in the replica Region) during a DR test
aws secretsmanager replicate-secret-to-regions --secret-id prod/shop/orders-db \
  --add-replica-regions Region=ap-south-1
aws secretsmanager stop-replication-to-replica --secret-id prod/shop/orders-db --region ap-south-1

# 9. An RDS instance whose master password RDS manages in Secrets Manager
aws rds create-db-instance --db-instance-identifier orders-demo --engine postgres \
  --db-instance-class db.t4g.micro --allocated-storage 20 \
  --master-username admin_user --manage-master-user-password

# 10. Clean up
aws ssm delete-parameters --names /shop/dev/db_url /shop/dev/db_password /shop/dev/payment/mode /shop/prod/courier/token
aws secretsmanager delete-secret --secret-id prod/shop/orders-db --force-delete-without-recovery --region ap-south-1
aws secretsmanager delete-secret --secret-id prod/shop/orders-db --recovery-window-in-days 7
aws rds delete-db-instance --db-instance-identifier orders-demo --skip-final-snapshot

Console-এও করে দেখো: Parameter Store খুলে Create parameter বাছো, আর দেখো Advanced tier কী কী খুলে দেয় (parameter policy)। তারপর একটা Secrets Manager secret খুলে Rotation-এ যাও, schedule expression আর rotation window দেখো।

#সারসংক্ষেপ

মূল কথা

  • Configuration আর secret রাখো code আর AMI-র বাইরে, এমন service-এ যেখানে প্রতিটা value-র জন্য IAM, KMS encryption আর CloudTrail audit আছে।
  • SSM Parameter Store: String, StringList, SecureString (KMS); version; hierarchy (/shop/prod/db_url), সাথে parameter/shop/dev/*-এ IAM আর GetParametersByPath; /aws/service/-এর নিচে AMI-র public parameter; /aws/reference/secretsmanager/ দিয়ে secret পড়া।
  • Tier: Standard ১০,০০০ parameter, 4 KB, ফ্রি; Advanced ১,০০,০০০, 8 KB, মাসে ০.০৫ USD, parameter policy, share; নামানো যায় না। Throughput: default সেকেন্ডে ৪০, higher throughput-এ টাকা লাগে।
  • Parameter policy (শুধু Advanced): Expiration (মুছে দেয়), ExpirationNotification আর NoChangeNotification (EventBridge event)।
  • Secrets Manager: 64 KB পর্যন্ত secret, সবসময় KMS-এ encrypt, প্রতি secret মাসে ০.৪০ USD + API call; secret-এর automatic rotation (KMS key-এর না), প্রতি ৪ ঘণ্টা থেকে; RDS, Aurora, Redshift, DocumentDB-তে managed rotation, বাকিদের জন্য Lambda function: createSecret → setSecret → testSecret → finishSecret, আর label AWSPENDING → AWSCURRENT → AWSPREVIOUS।
  • Rotation function-এর network পথ লাগে database পর্যন্ত আর Secrets Manager পর্যন্ত (endpoint বা NAT); rotation ব্যর্থ হলে AWSCURRENT যেখানে ছিল সেখানেই থাকে।
  • Cross-account: secret-এর resource policy + customer managed key। Multi-Region secret: sync রাখা replica, একই নাম, নিজের Region-এর KMS key, DR-এ standalone-এ promote।
  • পরীক্ষার keyword: কম খরচের configuration, hierarchy, 5–8 KB, মেয়াদের policy → Parameter Store; automatic rotation, RDS-এর সাথে যোগ, multi-Region sync, cross-account secret → Secrets Manager।