1.3
Console, CLI, SDK ও CloudShell
AWS-এ ঢোকার তিনটা দরজা, access key, আর কেন যেকোনো কাজ শেষমেশ একটা API call।
18 মিনিট পড়া + Animation
টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।
এই লেসন শেষে তুমি যা পারবে
- বুঝিয়ে বলতে পারবে, Management Console, CLI, SDK আর CloudShell কেন একই resource দেখে: চারটাই আসলে একই AWS API-র client।
- access key কী, এটা দিয়ে কী করা যায় আর কী যায় না, আর secret-টা তোমার মেশিন থেকে একবারও বের না করে কীভাবে একটা request sign হয়, বলতে পারবে।
aws configureদিয়ে AWS CLI সেট করতে পারবে, তার দুটো file পড়তে পারবে, নাম দেওয়া profile ব্যবহার করতে পারবে, আর আগেই বলে দিতে পারবে CLI কোন credential নেবে।- CloudShell ব্যবহার করতে পারবে আর তার সীমা জানবে: কার permission নিয়ে চলে, কী জমা রাখে, কতদিন, কোথায়।
- রোজকার গোলমালগুলো ধরতে পারবে: ভুল Region, credential না থাকা বা বাতিল হওয়া, ভুল signature, ঘড়ির গরমিল, আর access denied।
- access key ফাঁস হলে ঠিক কী করতে হয় জানবে, আর এমনভাবে design করতে পারবে যাতে ফাঁস হওয়ার মতো লম্বা মেয়াদের কোনো key-ই না থাকে।
#সব রাস্তা গিয়ে মেশে একই API-তে
lesson 1.2-এ দেখেছ AWS তার data center কোথায় কোথায় রাখে। এই লেসনের বিষয় হলো, তুমি নিজের laptop-এ বসে সেই data center-গুলোকে কাজের কথা কীভাবে বলো।
রোজকার কাজে ঢোকার দরজা চারটা:
- AWS Management Console: সেই website, যেখানে password দিয়ে sign in করো। তুমি click করো।
- AWS CLI (Command Line Interface): terminal-এর একটা program। তুমি লেখো
aws s3 ls। - AWS SDK (Software Development Kit): তোমার নিজের program-এর ভেতরের একটা library। তোমার code ডাকে
s3.list_buckets()। - AWS CloudShell: console-এর ভেতরেই খোলে এমন একটা terminal, যেটা আগে থেকেই তোমার নামে sign in করা।
দেখতে চারটা একদম আলাদা, কিন্তু ভেতরে সবাই হুবহু একই কাজ করে। AWS-এ যেকোনো কাজ, server চালু করা থেকে একটা file পড়া পর্যন্ত, আসলে একটা API call: ec2.us-east-1.amazonaws.com-এর মতো একটা service endpoint-এ পাঠানো একটা HTTPS request, যার সাথে থাকে একটা signature, যেটা প্রমাণ করে request-টা কে পাঠিয়েছে। তুমি button চাপলে console সেই request বানায়; তোমার command থেকে বানায় CLI; তোমার function call থেকে বানায় SDK। তুমি কোন দরজা দিয়ে এলে, AWS সেটা জানতেও পারে না, জানার দরকারও নেই। সে দেখে শুধু দুটো জিনিস: কে চাইছে (authentication) আর তার অনুমতি আছে কি না (authorization)।
এর একটা বাস্তব ফল আছে, যেটা পরীক্ষায় খুব আসে: console-এ যা বানাবে, CLI আর SDK থেকেও সেটা দেখা যাবে, উল্টোটাও সত্যি। তোমার account-এর আলাদা কোনো “console কপি” নেই।
| দরজা | এটা কী | কীভাবে প্রমাণ করে তুমি কে | কোন কাজে সবচেয়ে ভালো |
|---|---|---|---|
| Management Console | AWS sign-in page-এর web app | password + MFA, তারপর একটা অস্থায়ী session | শেখা, ঘুরে দেখা, একবারের কাজ, বিল দেখা, dashboard দেখা |
| AWS CLI | open-source command-line program | access key, অথবা aws login, IAM Identity Center বা role থেকে পাওয়া অস্থায়ী credential | script, বারবার করার মতো admin কাজ, pipeline-এ automation |
| AWS SDK | তোমার programming language-এর library | CLI-র মতোই; AWS-এর compute-এ চললে instance বা function-এর role | যে application AWS service ব্যবহার করে |
| CloudShell | console-এর ভেতরের browser terminal | তোমার console session নিজে থেকেই কাজে লাগায় | কিছু install বা configure না করে ঝটপট CLI-র কাজ |
চারটা দরজা, ভেতরে একটাই API
তুমি click করো, command লেখো বা code চালাও, শেষমেশ প্রতিটা কাজ একটা Region-এর service endpoint-এ গিয়ে একটা API call হয়ে যায়। দেখো একই instance প্রতিটা দরজা দিয়ে দেখা যাচ্ছে, আর ভুল Region-এ খুঁজলে কীভাবে “উধাও” হয়ে যাচ্ছে।
পরিস্থিতি
তুমি mouse দিয়ে একটা instance launch করলে। button-এর পেছনে আছে একটা সাধারণ API call।
তুমি password (আর MFA) দিয়ে console-এ sign in করলে। console হলো AWS-এর চালানো একটা web application। এটা খোদ AWS না, বরং সেই একই API-র একটা client, যে API তুমি নিজেও ডাকতে পারো।
#Endpoint আর Region
বেশির ভাগ AWS service regional: us-east-1-এর EC2 আর eu-west-1-এর EC2 দুটো আলাদা করে চলা service, যাদের endpoint-ও আলাদা (ec2.us-east-1.amazonaws.com, ec2.eu-west-1.amazonaws.com)। প্রতিটা request যায় ঠিক একটা Region-এ। console-এ Region ঠিক হয় ডান দিকের ওপরের selector দিয়ে; CLI আর SDK-তে ঠিক হয় region setting, একটা environment variable, বা --region option দিয়ে।
হাতে গোনা কয়েকটা service global, তার মধ্যে প্রথম যেটার সাথে দেখা হয় সেটা IAM: console-এ যে Region-ই দেখাক, user আর policy একই থাকে, আর console Region-এর নামের জায়গায় লেখে “Global”। (কোন service global আর কোনটা regional, তার list আছে lesson 1.2-এ।)
#Management Console
সবাই শুরু করে console দিয়েই। তুমি AWS sign-in page খুলে দুই ধরনের identity-র যেকোনো একটা দিয়ে ঢোকো:
- root user: যে email আর password দিয়ে account খোলা হয়েছিল। account-এর ওপর এর ক্ষমতা সীমাহীন, তাই setup শেষ হলেই একে তালা দিয়ে রাখা উচিত (lesson 2.3)।
- IAM user: তুমি দাও account ID (১২ অঙ্কের) বা account-এর alias, তারপর user name আর password, সাধারণত সাথে একটা MFA code। প্রতিটা account-এর নিজের একটা sign-in link থাকে, দেখতে এমন:
https://<account-id>.signin.aws.amazon.com/console।
sign in করার পর console একটা অস্থায়ী session ধরে রাখে, আর তুমি যে page-ই খোলো, সেটা এই session দিয়ে API call করে। কয়েকটা কথা জেনে রাখো:
- Region selector ঠিক করে প্রতিটা page কোন regional endpoint-এর সাথে কথা বলবে। এটা page-এর ব্যাপার, account-এর না।
- search bar দিয়ে service, feature আর documentation খুঁজে পাওয়া যায়; প্রিয় service-গুলো pin করেও রাখা যায়।
- console-ও আর দশটা client-এর মতোই: তোমার permission কোনো কাজের অনুমতি না দিলে console একটা access denied banner দেখায়, ঠিক যেখানে CLI একটা error দেখাত।
- click করে করে করা কাজ আবার হুবহু করা কঠিন, review করাও কঠিন। লোকে মজা করে একে বলে
ClickOps। শেখা আর দেখার জন্য console ব্যবহার করো; যে কাজ দুবার করতে হবে, তার জন্য CLI, SDK বা infrastructure as code।
#Access key: program-এর পরিচয়পত্র
একটা program তো web page-এ password টাইপ করতে পারে না, তাই AWS program-কে দেয় আলাদা ধরনের একটা credential: access key। access key আসলে একটা জোড়া:
| অংশ | উদাহরণ (AWS documentation থেকে, আসল না) | অনেকটা… | গোপন? |
|---|---|---|---|
| Access key ID | AKIAIOSFODNN7EXAMPLE | user name-এর মতো | না, প্রতিটা request-এ আর log-এ এটা দেখা যায় |
| Secret access key | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY | password-এর মতো | হ্যাঁ, একদম password-এর মতোই সামলাবে |
এগুলো নিয়ে যা অবশ্যই জানতে হবে:
- এগুলো শুধু CLI, SDK আর সরাসরি API call-এর জন্য। access key দিয়ে Management Console-এ sign in করা যায় না, আবার console-এর password দিয়েও CLI চালানো যায় না। দুটো আলাদা দরজার জন্য দুটো আলাদা credential।
- এগুলো একজন IAM user-এর (অথবা, বিপজ্জনকভাবে, root user-এর), আর ঠিক সেই user-এর permission নিয়েই চলে।
- secret দেখা যায় মাত্র একবার, key বানানোর মুহূর্তে। হারিয়ে গেলে আর খুঁজে বের করা যায় না: নতুন key বানাও, পুরনোটা মুছে দাও।
- একজন user-এর সর্বোচ্চ দুটো access key থাকতে পারে। এটা পাশ কাটানোর মতো কোনো বাধা না; এটা রাখা হয়েছে যাতে কাজ না থামিয়েই rotate করা যায়: দ্বিতীয় key বানাও, application-গুলোকে তাতে সরাও, তারপর প্রথমটা inactive করে মুছে দাও।
- একটা key হয় Active, নয়তো Inactive। inactive করলে সাথে সাথে বন্ধ হয়ে যায়, কিন্তু কিছু ভেঙে গেলে আবার চালু করা যায়; delete করলে চিরতরে শেষ।
- লম্বা মেয়াদের key নিজে থেকে কখনো মেয়াদোত্তীর্ণ হয় না। এদের ID শুরু হয় AKIA দিয়ে। আর অস্থায়ী credential, যেমন role বা
aws loginযেটা দেয়, তার ID শুরু হয় ASIA দিয়ে, সাথে থাকে session token নামে তৃতীয় একটা অংশ, আর মেয়াদ শেষ হয় কয়েক মিনিট বা কয়েক ঘণ্টায়। - root user-এর কোনো access key থাকাই উচিত না। থাকলে মুছে দাও।
#একটা request কীভাবে sign হয় (SigV4)
secret যদি password-এর মতোই হয়, তাহলে CLI secret না পাঠিয়ে কীভাবে প্রমাণ করে যে secret-টা তার জানা? এর জন্য সে ব্যবহার করে Signature Version 4 (SigV4), AWS-এর প্রতিটা API যে নিয়মে request sign করে।
request তৈরি
CLI তোমার command-কে একটা HTTPS request বানায়: method, endpoint, path, parameter, body-র একটা hash, আর এখনকার সময়।
signing key বের করা
secret access key থেকে সে এমন একটা key বের করে, যেটা শুধু এই তারিখ, এই Region আর এই service-এর জন্য কাজ করে। আজ
us-east-1-এর EC2-র জন্য বানানো signature কাল অন্য Region-এর S3-র জন্য কোনো কাজে আসবে না।sign করা
সেই key দিয়ে request-এর ওপর একটা signature হিসাব করে, তারপর access key ID আর scope (তারিখ, Region, service) সহ সেটা বসিয়ে দেয় request-এর
Authorizationheader-এ। secret নিজে request-এ কোথাও থাকে না।AWS একই হিসাব আবার করে
AWS access key ID দেখে তার সাথের secret খুঁজে নেয়, হাতে আসা request-এর ওপর একই হিসাব করে, তারপর মিলিয়ে দেখে। signature মিলে গেলে বোঝা যায় request সত্যিই key-এর মালিকের, আর পথে কিছু বদলায়নি। এরপর IAM permission দেখে।
এই design-এর জন্য একটা signature একসাথে তিনটা জিনিস রক্ষা করে:
- পরিচয়: secret যার কাছে আছে, শুধু সে-ই এই signature বানাতে পারত।
- অখণ্ডতা: একটা parameter বদলালেই (একটা instance-কে পঞ্চাশটা) hash বদলে যায়, signature ভেঙে যায়।
- টাটকা থাকা: বেশির ভাগ ক্ষেত্রে request-কে তার সময় থেকে পাঁচ মিনিটের মধ্যে AWS-এ পৌঁছাতে হয়, তাই কেউ ধরে রাখা request পরে আবার পাঠাতে পারে না।
নিজে হাতে তোমাকে প্রায় কখনো sign করতে হবে না: CLI আর SDK করে দেয়। SigV4-এর সাথে তোমার দেখা হবে কেবল যখন এটা ব্যর্থ হয়, আর তখন error-ই বলে দেয় কোন ধাপে গোলমাল হয়েছে।
একটা sign করা API request-এর ভেতরে
secret access key কখনো তোমার laptop ছেড়ে যায় না। এটা দিয়ে শুধু একটা signature হিসাব করা হয়, আর AWS নিজে সেই একই signature আবার হিসাব করে মিলিয়ে দেখে। আগে একটা ঠিকঠাক request দেখো, তারপর পাঁচভাবে সেটা কীভাবে ব্যর্থ হয়।
পরিস্থিতি
তুমি চালালে aws ec2 describe-instances। CLI default profile পড়ে: একটা access key ID (user name-এর মতো, গোপন না) আর একটা secret access key (password-এর মতো, গোপন)।
#চেনা error-গুলো পড়তে শেখা
| যা দেখছ | এর মানে | সাধারণ সমাধান |
|---|---|---|
Unable to locate credentials | CLI কোথাও credential পায়নি, তাই কিছুই পাঠায়নি | aws configure, aws login বা aws configure sso চালাও; EC2-তে একটা role লাগাও |
InvalidClientTokenId / “security token included in the request is invalid” (EC2-তে: AuthFailure) | access key ID অচেনা, মুছে ফেলা, বা inactive | চালু থাকা key ব্যবহার করো; দেখো account গুলিয়ে ফেলছ কি না |
SignatureDoesNotMatch | key ID চেনা, কিন্তু signature মিলছে না: secret ভুল, বা request পথে বদলেছে | secret আবার কপি করো (space ছাড়া); হারিয়ে গেলে নতুন key বানাও |
ExpiredToken | অস্থায়ী credential-এর মেয়াদ পেরিয়ে গেছে | আবার sign in করো (aws login, aws sso login), অথবা role-কে নিজে নবায়ন করতে দাও |
| “Signature expired” / “request time too skewed” | তোমার মেশিনের ঘড়ি মোটামুটি পাঁচ মিনিটের বেশি এদিক-ওদিক | automatic time sync চালু করো |
AccessDenied / UnauthorizedOperation | পরিচয় নিশ্চিত, কিন্তু কোনো policy এই কাজের অনুমতি দেয় না (বা কোনোটা deny করে) | যে permission নেই সেটা চাও; AWS কীভাবে সিদ্ধান্ত নেয়, দেখাবে lesson 2.2 |
| যেখানে resource থাকার কথা, সেখানে ফাঁকা list | error না: তুমি ভুল Region-কে (বা ভুল account-কে) জিজ্ঞেস করছ | --region, তোমার profile আর aws sts get-caller-identity দেখো |
ওপরের পাঁচটা row আর ছয় নম্বরটার পার্থক্য খেয়াল করো। প্রথম পাঁচটা authentication-এর ব্যর্থতা: তুমি কে, AWS সেটা জানে না বা বিশ্বাস করে না। access denied হলো authorization-এর ব্যর্থতা: তুমি কে, AWS ঠিকই জানে, আর সিদ্ধান্ত নিয়েছে এই কাজ তুমি করতে পারবে না। পরীক্ষা আর বাস্তবের গোলমাল, দুই জায়গাতেই এই দুটো আলাদা করে চিনতে পারাটা জরুরি।
নিজেকে যাচাই করোপ্রশ্ন
একজন developer-এর script একটা S3 object মুছতে গিয়ে access denied error পায়। একই script bucket-এর list কোনো ঝামেলা ছাড়াই দেখাতে পারে। এ থেকে কী বোঝা যায়?
#AWS CLI
AWS CLI একটা open-source program (এর code GitHub-এ আছে), যেটা terminal থেকে সরাসরি AWS service-এর public API ব্যবহারের সুযোগ দেয়। console-এ যা করা যায়, এটা দিয়েও করা যায়, সাধারণত আরো কিছু বেশি, কারণ কিছু feature console-এ আসার আগেই API-তে চলে আসে।
- version 2 install করো। version 1 এখন maintenance mode-এ, শুধু জরুরি fix পায়; AWS version 2-এ যেতে বলে।
- এটা Linux, macOS আর Windows-এ চলে, আর CloudShell ও Amazon Linux-এ আগে থেকেই install করা থাকে।
- প্রতিটা command-এর গড়ন একই:
aws <service> <operation> [options], যেমনaws ec2 describe-instances --region eu-west-1। operation-এর নাম হলো API action-এর নামটাই, ছোট হাতের অক্ষরে আর hyphen দিয়ে:DescribeInstancesহয়ে যায়describe-instances। - default output হলো JSON;
--output tableবা--output textপড়তে, বা shell script-এ পাঠাতে সহজ, আর--queryদিয়ে শুধু দরকারি field-গুলো বেছে নেওয়া যায়। - EC2-র অনেক command
--dry-runনেয়: AWS কিছু না করেই তোমার permission আর parameter যাচাই করে দেয়। aws <service> help(বাaws <service> <operation> help) internet ছাড়াই পুরো reference দেখায়।
#aws configure আর দুটো file
CLI-কে credential দেওয়ার সবচেয়ে দ্রুত উপায় aws configure। এটা চারটা প্রশ্ন করে, আর উত্তরগুলো তোমার home directory-র লুকানো .aws folder-এর দুটো সাধারণ text file-এ লিখে রাখে:
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-east-1
Default output format [None]: json
# ~/.aws/credentials (Windows: C:\Users\<you>\.aws\credentials)
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[prod]
aws_access_key_id = AKIAI44QH8DHBEXAMPLE
aws_secret_access_key = je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
# ~/.aws/config (Windows: C:\Users\<you>\.aws\config)
[default]
region = us-east-1
output = json
[profile prod]
region = eu-west-1
credentials-এ থাকে গোপন জিনিস: key ID, secret key, session token।config-এ থাকে বাকি সব: Region, output format, role-এর setting, IAM Identity Center-এর setting।- প্রতিটা section একটা profile। কোনো নাম না বললে ব্যবহার হয়
default। বাকি profile-এর নাম credentials file-এ লেখা হয়[prod], কিন্তু config file-এ[profile prod], ছোট্ট এই পার্থক্যে অনেকেই হোঁচট খায়। - একটা command-এর জন্য profile বাছতে দাও
--profile prod, আর পুরো terminal session-এর জন্যexport AWS_PROFILE=prod(PowerShell-এ:$env:AWS_PROFILE = "prod")। - file দুটো সাধারণ text। তোমার home directory যে পড়তে পারে, সে তোমার secret-ও পড়তে পারে, আর এটা অল্প মেয়াদের credential বেছে নেওয়ার আরেকটা কারণ।
“CLI আসলে কী ব্যবহার করছে?”, এই প্রশ্নের উত্তর দেয় দুটো command:
aws sts get-caller-identityদেখায় তোমার credential কোন account-এর কোন identity-র। এর জন্য কোনো permission লাগে না, তাই credential ঠিক থাকলে এটা সবসময় কাজ করে।aws configure listপ্রতিটা value (key, secret, Region, profile) দেখায়, আর দেখায় সেটা কোথা থেকে এল: file থেকে, environment variable থেকে, নাকি অন্য কোথাও থেকে।
#CLI credential কোথায় কোথায় খোঁজে
CLI আর SDK একটা নির্দিষ্ট ক্রমে কয়েকটা জায়গা খোঁজে, আর যেখানে প্রথম credential পায়, সেটাই নেয়। সহজ করে বললে ক্রমটা এই:
- command-line option, যেমন
--profileবা--region। - environment variable:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_SESSION_TOKEN,AWS_PROFILE,AWS_REGION। - shared file, মানে
~/.aws/credentialsআর~/.aws/config, বেছে নেওয়া profile-এর জন্য (যে profile role assume করে, IAM Identity Center ব্যবহার করে, বাaws loginব্যবহার করে, সেগুলোও এখানেই পড়ে)। - container credential, যে code role সহ container task-এ চলছে তার জন্য।
- EC2 instance role, যেটা আসে instance metadata service (IMDS) থেকে।
এই ক্রম জানলে অনেক অবাক করা ঘটনা বোঝা যায়। environment variable file-এর আগে, তাই এক ঘণ্টা আগে export করা একটা key চুপচাপ তোমার যত্ন করে বাছা profile-কে হারিয়ে দেয়। আর শেষ দুটো ধাপের কারণেই AWS-এর compute-এ চলা code-এ কিছুই configure করতে হয় না: role লাগানো থাকলে credential নিজে থেকেই চলে আসে।
CLI আর SDK credential কোথায় কোথায় খোঁজে
CLI একটা নির্দিষ্ট ক্রমে কয়েকটা জায়গা খোঁজে, আর যেখানে প্রথম credential পায় সেখানেই থেমে যায়। এই ক্রমটা জানলে “ভুল account কেন ব্যবহার হচ্ছে?” ধরনের বেশির ভাগ রহস্যের উত্তর মিলে যায়।
পরিস্থিতি
তুমি laptop-এ কোনো option ছাড়াই চালালে aws s3 ls। CLI প্রথমে command line দেখে: কোনো --profile নেই, কোনো key-ও নেই।
#মানুষের জন্য অল্প মেয়াদের credential
laptop-এ রাখা লম্বা মেয়াদের key-ই ফাঁস হয়। মানুষের জন্য এর চেয়ে ভালো দুটো উপায় আছে:
aws login(CLI version 2.32.0 আর তার পরের version) তোমার সাধারণ console credential দিয়ে browser-এ sign in করিয়ে CLI-কে অস্থায়ী credential দেয়, যেটা ১২ ঘণ্টা পর্যন্ত নিজে নিজে নবায়ন হতে থাকে। স্থায়ী কিছুই জমা থাকে না।- IAM Identity Center (
aws configure sso, তারপরaws sso login) পুরো প্রতিষ্ঠানের জন্য উপায়: মানুষ একবার sign in করে, আর যে account আর permission set তাকে দেওয়া আছে, সেগুলোর জন্য অল্প মেয়াদের credential পায়। এর সাথে দেখা হবে lesson 2.4-এ, আবার advanced identity অধ্যায়ে।
access key-এর জায়গা এখনো আছে, যেমন AWS-এর বাইরের এমন একটা script, যেটা নিজে sign in করতে পারে না। কিন্তু এটা হওয়া উচিত ব্যতিক্রম: যতটুকু দরকার ততটুকুই permission, আর নিয়মিত rotate।
#AWS SDK
AWS SDK হলো এমন library, যা দিয়ে তোমার নিজের code AWS-কে ডাকতে পারে। জনপ্রিয় প্রতিটা language-এর জন্য একটা করে আছে: Python (boto3), JavaScript আর TypeScript, Java, Go, .NET, PHP, Ruby, C++, Rust আরো অনেক; সাথে Android আর iOS-এর জন্য mobile library (Amplify দিয়ে) আর ছোট IoT hardware-এর জন্য device SDK। CLI নিজেও তৈরি botocore-এর ওপর, যেটা Python SDK-এর মূল অংশ।
import boto3
ec2 = boto3.client("ec2", region_name="us-east-1")
for r in ec2.describe_instances()["Reservations"]:
for i in r["Instances"]:
print(i["InstanceId"], i["State"]["Name"])
import { S3Client, ListBucketsCommand } from "@aws-sdk/client-s3";
const s3 = new S3Client({ region: "us-east-1" });
const { Buckets } = await s3.send(new ListBucketsCommand({}));
console.log(Buckets.map((b) => b.Name));
SDK তোমার হয়ে যা করে দেয়:
- credential খুঁজে নেয়, CLI-র মতোই খোঁজার নিয়মে, তাই একই code এক লাইনও না বদলে চলে তোমার laptop-এ (profile বা
aws login), pipeline-এ (environment variable) আর EC2 বা Lambda-য় (তার role)। - Region অনুযায়ী endpoint বেছে নেয়, আর প্রতিটা request SigV4 দিয়ে sign করে।
- throttle হওয়া বা সাময়িকভাবে ব্যর্থ request exponential backoff দিয়ে আবার চেষ্টা করে।
- লম্বা ফলাফল page ধরে ধরে আনে, আর উত্তরকে সেই language-এর নিজের object বানিয়ে দেয়।
সবচেয়ে জরুরি নিয়ম: code-এ কখনো credential লিখবে না। খেয়াল করো, ওপরের দুটো উদাহরণের কোনোটাতেই key-এর নামগন্ধ নেই। code শুধু একটা client বানায়; credential কোথা থেকে আসবে, সেটা ঠিক করে দেয় code যে পরিবেশে চলছে সেই পরিবেশ।
#AWS CloudShell
CloudShell হলো তোমার browser-এর ভেতরের একটা terminal, console-এর ওপরের bar-এর icon থেকে খোলে। পেছনে AWS তোমার জন্য একটা ছোট Linux environment চালু করে, যেখানে AWS CLI, Python, Node.js, git আর চেনা tool-গুলো আগে থেকেই install করা।
কেন এটা কাজের:
- setup নেই, key-ও নেই। console-এ যে sign in করে আছে, CloudShell নিজে থেকেই তার credential ব্যবহার করে।
aws configureচালাতে হয় না, আর disk-এ ফাঁস হওয়ার মতো কোনো access key-ও থাকে না। - ঠিক তোমার permission। console-এ তুমি যা পারো, CloudShell-ও ততটুকুই পারে, এর বেশি না। এটা কোনো পেছনের দরজা না। CloudShell ব্যবহার করতেও আলাদা permission লাগে (AWS-এর তৈরি
AWSCloudShellFullAccessmanaged policy আছে), তাই যাদের internet-যুক্ত shell পাওয়া উচিত না, administrator তাদের জন্য এটা বন্ধ রাখতে পারেন। - বাড়তি খরচ নেই। টাকা দিতে হয় শুধু তোমার command যে AWS resource বানায় তার জন্য।
এর সীমাগুলো, যেগুলো পরীক্ষা আর রোজকার কাজ, দুই জায়গাতেই দরকার:
| সীমা | মান |
|---|---|
| স্থায়ী storage | প্রতি Region-এ 1 GB, তোমার home directory-তে ($HOME), শুধু তোমার, এক session থেকে আরেক session পর্যন্ত থাকে |
$HOME-এর বাইরের সব | প্রতিটা session শেষে মুছে নতুন করে দেওয়া হয়: পুরো system-এ install করা tool পরের বার আর থাকে না |
| অব্যবহৃত Region | ওই Region-এ শেষ session-এর পর ১২০ দিন home directory রাখা হয়, তারপর মুছে যায় |
| নিষ্ক্রিয় থাকার সীমা | keyboard বা mouse না ছুঁলে ২০–৩০ মিনিট পর session শেষ (চলতে থাকা process-কে কাজ হিসেবে ধরা হয় না) |
| সবচেয়ে লম্বা session | মোটামুটি ১২ ঘণ্টা, তুমি সক্রিয় থাকলেও |
| একসাথে কয়টা shell | account-প্রতি প্রতি Region-এ ১০টা পর্যন্ত |
| Network | শুধু বাইরের internet-এ যাওয়া যায়: ভেতরে ঢোকার কোনো port নেই, public IP address নেই |
প্রতিটা Region-এর home directory আলাদা, তাই us-east-1-এ রাখা একটা script eu-west-1-এ CloudShell খুললে পাবে না। Actions menu দিয়ে file upload আর download করা যায়, বা S3 দিয়ে সরানো যায়। CloudShell চাইলে তোমার কোনো VPC-র ভেতরেও চালু করা যায়, private resource-এ পৌঁছানোর জন্য; ওই VPC environment-গুলোতে কোনো স্থায়ী storage-ই থাকে না।
একটা CloudShell session
CloudShell তোমার console-এর identity ধার করে, আর প্রতিটা Region-এ তোমাকে একটা ছোট, স্থায়ী home directory দেয়। দেখো কী টিকে থাকে, কী থাকে না, আর এটা কী পারে না।
পরিস্থিতি
তুমি dev-alice হিসেবে console-এ sign in করলে। CloudShell-এর জন্য আর কোনো পরিচয় দিতে হবে না, এটুকুই যথেষ্ট।
নিজেকে যাচাই করোপ্রশ্ন
একজন engineer CloudShell-এ sudo দিয়ে একটা tool install করল, আর নিজের home directory-তে একটা config file রাখল। পরের দিন একই Region-এ সে কী দেখবে?
#ফাঁস হওয়া key: সবচেয়ে দামি ভুল
access key internet-এর যেকোনো জায়গা থেকে কাজ করে, password বা MFA ছাড়াই, তাই key ফাঁস মানে account ফাঁস। চেনা গল্পটা এরকম: একজন developer “শুধু test করার জন্য” একটা config file-এ key লিখে দেয়, project-টা একটা public GitHub repository-তে push করে, আর কয়েক মিনিটের মধ্যেই স্বয়ংক্রিয় scanner সেটা খুঁজে পায়। আক্রমণকারী console ছুঁয়েও দেখে না; নিজের মেশিন থেকে API ডেকে প্রতিটা Region-এ বড় বড় instance চালু করে, সাধারণত cryptocurrency mine করার জন্য। এক দিনেই বিল হাজার হাজার ডলারে পৌঁছাতে পারে।
AWS নিজেও public code খুঁজে দেখে। তোমার কোনো key পেলে সে user-এর সাথে AWSCompromisedKeyQuarantineV3 managed policy লাগিয়ে দেয়, যেটা instance চালু করা বা user বানানোর মতো ঝুঁকির কাজ deny করে, তারপর একটা support case খোলে আর তোমাকে email করে। এতে ক্ষতি কমে। কিন্তু যা আগেই চালু হয়ে গেছে, সেটা ফেরত যায় না, আর policy-টা নিজে থেকে সরানো উচিতও না; বরং support case-এর নির্দেশ মেনে চলো।
GitHub-এ ফাঁস হয়ে যাওয়া একটা access key
code-এর ভেতরে লম্বা মেয়াদের key রাখা AWS account দখল হওয়ার সবচেয়ে চেনা রাস্তা। দেখো কত দ্রুত ঘটে, তখন কী করতে হয়, আর কোন design-এ এটা ঘটতেই পারে না।
পরিস্থিতি
একজন developer “তাড়াতাড়ি test করার জন্য” config.py-তে একটা access key সরাসরি লিখে দিল, তারপর project-টা একটা public repository-তে push করল।
কী করবে, ঠিক এই ক্রমে:
key-টাকে অকেজো করো
সাথে সাথে IAM-এ সেটা inactive করো (বা মুছে দাও)। file বা commit মুছে ফেলা যথেষ্ট না: key থেকে যায় git history-তে, fork-গুলোতে, আর scanner-রা আগেই যত কপি নিয়েছে সবগুলোতে।
বদলে দাও
application-কে একটা বিকল্প দাও, সবচেয়ে ভালো হয় নতুন key-এর বদলে একটা IAM role। key সত্যিই লাগলে আগে নতুনটা বানাও (দ্বিতীয় key-এর জায়গাটা এই জন্যই), সেটায় সরে যাও, তারপর পুরনোটা মুছে দাও।
কী ঘটেছে খুঁজে বের করো
CloudTrail দিয়ে দেখো ওই access key ID দিয়ে কোন কোন API call হয়েছে, সব Region-এ: কী কী resource বানানো হয়েছে, কোন user বা key যোগ হয়েছে, কোন policy বদলেছে।
পরিষ্কার করো
অচেনা instance আর অন্য resource terminate করো, আক্রমণকারীর বানানো user, key বা role মুছে দাও, বিল দেখো, আর AWS-এর support case ধরে ধরে কাজ শেষ করো।
আটকানোর উপায় মূলত design, শুধু সাবধান থাকা না:
- code-এ কোনো credential না, কখনোই না। SDK-কে খুঁজে নিতে দাও।
- AWS-এ চলা কাজের জন্য role, মানুষের জন্য অল্প মেয়াদের credential (
aws login, IAM Identity Center)। - যে key রাখতেই হবে, তার জন্য least privilege, যাতে ফাঁস হলেও ক্ষতি সীমিত থাকে।
- একটা
.gitignore, যেটা.aws/folder আর.envfile বাদ দেয়, আর একটা secret-scanning hook, যেটা key-এর মতো দেখতে লেখা থাকলে commit আটকে দেয়। - নিয়মিত audit: IAM-এর credentials report প্রতিটা key-এর বয়স আর শেষ কবে ব্যবহার হয়েছে দেখায় (lesson 2.4)। মাসের পর মাস কেউ ছোঁয়নি এমন key মুছে দেওয়া উচিত।
#command টাইপ করার বাইরে: infrastructure as code
একটা একটা কাজের জন্য CLI দারুণ, কিন্তু বাস্তবের একটা system-এ resource থাকে শত শত। লম্বা একটা CLI script দিয়ে সেগুলো বানানো ভঙ্গুর: ৪০ নম্বর ধাপ fail করলে কী হবে, বা একই setup অন্য Region-এ লাগলে? এটাই infrastructure as code (IaC)-এর কাজ: শেষে কী চাও সেটা তুমি একটা file-এ লেখো, আর একটা tool নিজে হিসাব করে API call-গুলো করে।
- AWS CloudFormation একটা template (JSON বা YAML) পড়ে, তার সব resource একসাথে একটা stack হিসেবে বানায়, বদলায় বা মোছে। stack মুছলে তার বানানো সব মুছে যায়।
- AWS CDK (Cloud Development Kit) দিয়ে একই জিনিস লেখা যায় TypeScript, Python, Java বা অন্য language-এ; সে একটা CloudFormation template বানিয়ে deploy করে।
- Terraform আর এরকম অন্য কোম্পানির tool একই কাজ করে, কয়েকটা cloud জুড়ে।
ভেতরে সবাই CLI-র মতোই একই API, একই credential আর একই permission ব্যবহার করে। এই course-এ যখনই কোনো design-এ “বারবার একইভাবে”, “কয়েকটা account জুড়ে” বা “কয়েকটা Region জুড়ে” কথাটা আসবে, এদের দেখা পাবে।
#ঠিক দরজাটা বেছে নেওয়া
| কাজ | সবচেয়ে ভালো দরজা | কেন |
|---|---|---|
| নতুন একটা service ঘুরে দেখা, শেখা | Console | চোখে দেখা যায়, ধাপে ধাপে দেখায়, অজানা option-ও সামনে আনে |
| বিল দেখা, budget সেট করা | Console | billing-এর page-গুলো এই কাজের জন্যই বানানো (lesson 1.4) |
| কিছু install না করে ঝটপট একটা command | CloudShell | আগেই sign in করা, CLI আগেই install করা |
| বারবার করার মতো admin কাজ, রাতের script | CLI | script করা যায়; প্রতিবার একই ফল |
| S3-এ file রাখে এমন একটা application | SDK, IAM role সহ | language-এর নিজের object, retry, code-এ কোনো key নেই |
| পুরো একটা environment, তিনটা Region-এ হুবহু এক | CloudFormation বা CDK | ফল বর্ণনা করো, review করা যায়, আবার বানানো আর মোছা সহজ |
| EC2-তে চলা code, যেটা DynamoDB ডাকে | SDK + instance role | instance metadata service থেকে অস্থায়ী credential, ফাঁস হওয়ার কিছুই নেই |
#নিজে করে দেখো
# ১. CLI install করো বা যাচাই করো (version 2)
aws --version # aws-cli/2.x ...
# ২. লম্বা মেয়াদের key ছাড়া sign in (CLI 2.32.0+), নিতান্ত দরকার হলে key দিয়ে configure
aws login # browser খোলে, অস্থায়ী credential
# aws configure # ~/.aws/credentials আর ~/.aws/config লেখে
# ৩. আমি কে, আর প্রতিটা setting কোথা থেকে এল?
aws sts get-caller-identity
aws configure list
# ৪. একই প্রশ্ন, দুটো Region: Region-এর সীমানা নিজের চোখে দেখো
aws ec2 describe-instances --region us-east-1 --query "Reservations[].Instances[].InstanceId"
aws ec2 describe-instances --region eu-west-1 --query "Reservations[].Instances[].InstanceId"
# ৫. দ্বিতীয় একটা profile, একবারের জন্য আর পুরো session-এর জন্য
aws configure --profile prod
aws s3 ls --profile prod
export AWS_PROFILE=prod && aws sts get-caller-identity && unset AWS_PROFILE
# ৬. instance চালু না করেই AWS-কে জিজ্ঞেস করো, তুমি চালু করতে পারতে কি না
aws ec2 run-instances --dry-run --instance-type t3.micro \
--image-id resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
# "Request would have succeeded, but DryRun flag is set" = তোমার permission আছে
# ৭. কাজ না থামিয়ে একটা access key rotate করো (user name আর key ID নিজেরটা বসাও)
aws iam list-access-keys --user-name dev-alice
aws iam create-access-key --user-name dev-alice # দ্বিতীয় key; secret এখনই রেখে দাও
aws iam update-access-key --user-name dev-alice --access-key-id AKIA_OLD_KEY_ID --status Inactive
aws iam delete-access-key --user-name dev-alice --access-key-id AKIA_OLD_KEY_ID
তারপর console থেকে CloudShell খোলো, সেখানে aws sts get-caller-identity চালাও (কোনো setup ছাড়াই তোমার console-এর identity দেখাবে), echo hi > ~/note.txt দিয়ে একটা file বানাও, console-কে অন্য Region-এ নিয়ে যাও, আবার CloudShell খোলো আর ls ~ চালাও: file-টা সেখানে নেই।
#সারসংক্ষেপ
মূল কথাগুলো
- Console, CLI, SDK আর CloudShell একই API-র চারটা client। প্রতিটা কাজ একটা Region-এর service endpoint-এ পাঠানো একটা sign করা HTTPS request; AWS আগে দেখে তুমি কে, তারপর দেখে তোমার অনুমতি আছে কি না।
- বেশির ভাগ service regional: ভুল Region-এ খুঁজলে account ফাঁকা দেখায়, কিছু মোছা হয় না। IAM global।
- Access key = access key ID (user name-এর মতো) + secret access key (password-এর মতো)। শুধু CLI, SDK আর API-র জন্য, console sign in-এর জন্য কখনো না। secret দেখা যায় একবারই; প্রতি user-এর সর্বোচ্চ দুটো, rotate করার জন্য; Active বা Inactive; root-এর একটাও থাকা উচিত না। AKIA = লম্বা মেয়াদের, ASIA = অস্থায়ী, সাথে session token।
- SigV4 প্রতিটা request sign করে secret থেকে বের করা এমন একটা key দিয়ে, যেটা একটা তারিখ, একটা Region আর একটা service-এর জন্যই কাজ করে। secret কখনো পাঠানো হয় না; signature প্রমাণ করে পরিচয়, অখণ্ডতা আর টাটকা থাকা (মোটামুটি পাঁচ মিনিট)।
aws configureলেখে~/.aws/credentials(গোপন জিনিস) আর~/.aws/config(Region, output, profile, যেখানে নাম লেখা হয়[profile name])।--profileবাAWS_PROFILEব্যবহার করো;aws sts get-caller-identityআরaws configure listদিয়ে যাচাই করো।- CLI আর SDK খোঁজে option → environment variable → shared file → container role → instance role, আর প্রথম যে credential পায় সেটাই নেয়। রয়ে যাওয়া environment variable তোমার profile-কে হারিয়ে দেয়।
- অল্প মেয়াদের credential বেছে নাও: মানুষের জন্য
aws loginবা IAM Identity Center, AWS-এ চলা code-এর জন্য IAM role। - CloudShell: তোমার console-এর permission নিয়ে চলা browser terminal, কোনো key নেই, খরচ নেই, প্রতি Region-এ 1 GB স্থায়ী home, ১২০ দিন অব্যবহৃত থাকলে মুছে যায়, ২০–৩০ মিনিট নিষ্ক্রিয় থাকলে session শেষ, সর্বোচ্চ মোটামুটি ১২ ঘণ্টা।
- ফাঁস হওয়া বা code-এ লেখা key: সাথে সাথে inactive আর rotate করো, CloudTrail দিয়ে খোঁজ নাও, পরিষ্কার করো, আর কাজটাকে একটা role-এ সরিয়ে নাও।
- Infrastructure as code (CloudFormation, CDK, Terraform) একটা বর্ণনাকে সেই একই API call-এ পরিণত করে, তাই environment বারবার একইভাবে বানানো আর মোছা যায়।
আগে নিজে উত্তর দাও, তারপর ব্যাখ্যাটা পড়ো। ঠিক হলেও পড়ো, কারণ ভুল Option-গুলো কেন ভুল, সেটাও ওখানে আছে।
নিজেকে যাচাই করোপ্রশ্ন
একটা টিম Management Console-এ একটা S3 bucket বানাল। পরে একজন developer একই account-এর credential দিয়ে AWS CLI-তে bucket-এর list দেখল। bucket-টা কেন দেখা যাচ্ছে?
নিজেকে যাচাই করোপ্রশ্ন
AWS access key কী কাজে লাগে?
নিজেকে যাচাই করোপ্রশ্ন
একজন নতুন administrator sign-in page-এ access key ID আর secret access key paste করে AWS Management Console-এ ঢুকতে চাইলেন। কী হবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা Linux laptop-এ aws configure চালানোর পর access key আর default Region কোথায় জমা থাকে?
নিজেকে যাচাই করোপ্রশ্ন
একজন developer গত মাসে বানানো একটা access key-এর secret access key হারিয়ে ফেলেছে। তার কী করা উচিত?
নিজেকে যাচাই করোপ্রশ্ন
একজন IAM user-এর একসাথে সর্বোচ্চ কয়টা access key থাকতে পারে, আর সংখ্যাটা কেন এটাই?
নিজেকে যাচাই করোপ্রশ্ন
security review-তে দেখা গেল একজন developer AWS access key একটা public GitHub repository-তে commit করে ফেলেছে। application চলে Amazon EC2-তে। সবচেয়ে ভালো পদক্ষেপ কোনটা?
নিজেকে যাচাই করোপ্রশ্ন
একটা EC2 instance-এর application-কে S3 থেকে object পড়তে হবে। তাকে credential দেওয়ার সবচেয়ে নিরাপদ উপায় কোনটা?
নিজেকে যাচাই করোপ্রশ্ন
AWS CloudShell তোমাকে কতটা স্থায়ী storage দেয়?
নিজেকে যাচাই করোপ্রশ্ন
read-only permission আছে এমন একজন IAM user console থেকে AWS CloudShell খুললেন। ওই shell-এর AWS CLI command-গুলোর permission কী হবে?
নিজেকে যাচাই করোপ্রশ্ন
একজন developer গতকাল console-এ কয়েকটা EC2 instance চালু করেছে। আজ aws ec2 describe-instances একটা ফাঁকা list দিচ্ছে। instance-গুলো এখনো চলছে, বিলও হচ্ছে। সবচেয়ে সম্ভাব্য কারণ কী?
নিজেকে যাচাই করোপ্রশ্ন
একদম নতুন একটা laptop-এ প্রতিটা AWS CLI command Unable to locate credentials দিয়ে ব্যর্থ হচ্ছে। এর মানে কী?
নিজেকে যাচাই করোপ্রশ্ন
একজন developer-এর ~/.aws/credentials-এর default profile dev account-এর, কিন্তু aws s3 ls দেখাচ্ছে একটা test account-এর bucket। একই terminal-এ সে আগে test account-এর key export করেছিল। কেন এমন হচ্ছে?
নিজেকে যাচাই করোপ্রশ্ন
একটা call ব্যর্থ হলো, error বলছে request-এর signature মিলছে না। access key ID ঠিক আছে আর active। সবচেয়ে সম্ভাব্য কারণ কী?
নিজেকে যাচাই করোপ্রশ্ন
একজন IAM user aws ec2 terminate-instances চালিয়ে error পেলেন যে এই কাজ করার অনুমতি তাঁর নেই। aws sts get-caller-identity ঠিকঠাক কাজ করছে। কোন কথাটা ঠিক?
নিজেকে যাচাই করোপ্রশ্ন
গতকাল যে script কাজ করছিল, আজ সেটা signature expired error দিচ্ছে। credential-এ কিছুই বদলায়নি, কিন্তু রাতে server-এর battery বদলানো হয়েছে। সমাধান কী?
নিজেকে যাচাই করোপ্রশ্ন
SigV4 request-এর সাথে secret access key কখনো পাঠায় না কেন?
নিজেকে যাচাই করোপ্রশ্ন
AWS CLI কোন AWS SDK-এর ওপর তৈরি?
নিজেকে যাচাই করোপ্রশ্ন
AWS CloudShell সম্পর্কে নিচের কোনটা সত্যি নয় (NOT)?
নিজেকে যাচাই করোপ্রশ্ন
পুরনো snapshot পরিষ্কার করার একটা script চলতে তিন ঘণ্টা লাগে। একজন engineer সেটা CloudShell-এ চালিয়ে দুপুরের খাবার খেতে চলে গেলেন। সম্ভবত কী হবে?
নিজেকে যাচাই করোপ্রশ্ন
একজন engineer us-east-1-এ কাজ করার সময় CloudShell-এর home directory-তে কয়েকটা script রেখেছিলেন। ap-south-1-এ CloudShell খুলে দেখলেন script-গুলো নেই। কেন?
নিজেকে যাচাই করোপ্রশ্ন
AWS CDK আর AWS CloudFormation-এর মধ্যে সম্পর্ক কী?
নিজেকে যাচাই করোপ্রশ্ন
একটা log-এ দুটো access key ID পেলে: একটা শুরু AKIA দিয়ে, আরেকটা ASIA দিয়ে। এই শুরুর অক্ষরগুলো কী বলে?
নিজেকে যাচাই করোপ্রশ্ন
একটা কোম্পানি চায় তাদের developer-রা নিজেদের laptop-এ AWS CLI ব্যবহার করুক, কিন্তু লম্বা মেয়াদের কোনো access key জমা না রেখে। কোন উপায়ে এটা হয়?
নিজেকে যাচাই করোপ্রশ্ন
account audit করতে গিয়ে দেখলে root user-এর একটা active access key আছে। তোমার কী করা উচিত?
নিজেকে যাচাই করোপ্রশ্ন
AWS access key নিয়ে কোন দুটো কথা সত্যি? (দুটো বেছে নাও।)
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
ফাঁস হওয়া একটা access key আক্রমণকারী ব্যবহার করেছে। প্রথমে কোন দুটো কাজ করা উচিত? (দুটো বেছে নাও।)
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
AWS-এর সাথে কাজের কোন দুটো উপায়ে নিজের কম্পিউটারে একটা web browser ছাড়া আর কিছুই install বা configure করতে হয় না? (দুটো বেছে নাও।)
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
SigV4 signature একটা AWS API request-কে নিচের কোন দুটো থেকে রক্ষা করে? (দুটো বেছে নাও।)
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একজন developer চায় AWS CLI prod profile ব্যবহার করুক। কোন দুটো উপায়ে হবে? (দুটো বেছে নাও।)
বেছে নাও ২