AWS
Ամենամեծ cloud-ը՝ հարյուրավոր ծառայություններ, որոնցից մի քանիսն են իսկապես կարևոր, և հաշիվ, որին պետք է հետևել։
30 վայրկյանում
Amazon Web Services-ը վայրկյանային վճարով վարձով է տալիս հաշվողական «աղյուսներ»՝ վիրտուալ սերվերներ, պահոց, տվյալների բազաներ, ցանց, հերթեր և շատ ավելին։ Վճարում ես միայն օգտագործածի համար և կարող ես աճել մեկ սերվերից մինչև հազարներ։ Այդ ուժը բարդության հետ է գալիս. ցանցն ու թույլտվությունները պետք է ինքդ նախագծես, իսկ ծախսերը կարող են անակնկալ մատուցել, եթե ոչ ոք չի հետևում դրանց։
Իմ ամենօրյա stack-ում չէ․ գիտեմ հիմնական գաղափարները և մանրամասները կսովորեմ, երբ նախագիծը դա պահանջի։
Ինչու է սա կարևոր
- AWS-ը կարևոր է, որովհետև այն ամենաշատ օգտագործվող cloud-ն է, ու շատ ընկերություններ, աշխատանքի հայտարարություններ և ինտեգրացիաներ ենթադրում են հենց այն։
- Թիմին այն պետք է դառնում, երբ առանձին սերվերներն այլևս չեն բավարարում. ավտոմատ failover-ով կառավարվող բազաները, գլոբալ CDN-ները, autoscaling-ը և բազմաթիվ ռեգիոնները մենակ կառուցելը դժվար է։
- Նրա managed ծառայությունները սերվերների սպասարկումը փոխարինում են կոնֆիգուրացիայով, ինչը փոքր թիմին կարող է ազատել patch-երից ու backup-ներից։
- Իմ նախագծերի համար ես հիմնականում օգտագործում եմ VPS սերվերներ Docker Compose-ով, որն այդ մասշտաբում ավելի էժան ու պարզ է. AWS-ը լավ իմանալն է, որ թույլ է տալիս ինձ հասկանալ, թե երբ է այդ հաշվարկը փոխվում։
Ինչպես է աշխատում
01Ռեգիոններ, availability zone-ներ և ընդհանուր պատասխանատվություն
AWS-ը բաժանված է ռեգիոնների՝ առանձին աշխարհագրական տարածքների, օրինակ՝ Ֆրանկֆուրտ կամ Իռլանդիա, որոնցից յուրաքանչյուրն ունի ծառայությունների մեծ մասի իր պատճենը։ Ռեգիոնը պարունակում է մի քանի availability zone (AZ)՝ մեկ կամ ավելի դատա կենտրոններ անկախ սնուցմամբ, սառեցմամբ և ցանցով, բավական մոտ իրար՝ արագ կապի համար։ Հավելվածն առնվազն երկու AZ-ում աշխատեցնելը պաշտպանում է մեկ դատա կենտրոնի խափանումից, իսկ մի քանի ռեգիոն օգտագործելը՝ ամբողջ ռեգիոնի խափանումից, բայց շատ ավելի բարձր գնով ու բարդությամբ։ Ընտրիր օգտատերերին մոտ և տվյալների կանոններին համապատասխանող ռեգիոն։ Անվտանգությունը ընդհանուր է. AWS-ը պատասխանատու է cloud-ի անվտանգության համար (սարքավորումներ, դատա կենտրոններ, hypervisor), իսկ դու՝ cloud-ի ներսում անվտանգության համար՝ քո IAM թույլտվությունները, ցանցային կանոնները, EC2 սերվերների patch-երը, տվյալների գաղտնագրումն ու դրանք բաց չթողնելը։
- Ռեգիոն = աշխարհագրական տարածք, AZ = դրա ներսում մեկուսացված դատա կենտրոն(ներ)։
- Բարձր հասանելիություն = բաշխված առնվազն երկու AZ-ի վրա։
- Քո կողմից սխալ կոնֆիգուրացիան cloud-ում արտահոսքերի ամենատարածված պատճառն է։
02Հիմնական ծառայությունները և երբ օգտագործել դրանք
Հարյուրավոր ծառայություններ պետք չեն. մեկ տասնյակը ծածկում է վեբ հավելվածների մեծ մասը։ Compute-ը լինում է երեք տեսակի՝ EC2 վիրտուալ մեքենաներ, որոնք ինքդ ես կառավարում, կոնտեյներներ ECS-ում (ավելի պարզ, AWS-ի սեփական) կամ EKS-ում (managed Kubernetes), ցանկության դեպքում՝ serverless Fargate-ով, և Lambda ֆունկցիաներ, որոնք աշխատում են իրադարձություններով՝ առանց սերվերների։ Տվյալները պահվում են S3-ում՝ ֆայլերի համար, և RDS-ում կամ Aurora-ում՝ կառավարվող ռելյացիոն բազաների համար։ CloudFront-ը առջևում կանգնած CDN-ն է, Route 53-ը՝ DNS և health check-ով routing։ VPC-ն քո մասնավոր ցանցն է, IAM-ը որոշում է, թե ով ինչ կարող է անել, իսկ SQS-ը կառավարվող հերթ է՝ աշխատանքը իրարից անջատելու համար։
- EC2՝ լիարժեք վերահսկողություն, երկար աշխատող սերվերներ, ցանկացած ծրագիր։
- ECS / EKS (+ Fargate)՝ կոնտեյներներ՝ առանց scheduler-ներն ինքդ կառավարելու։
- Lambda՝ կարճ, իրադարձություններով աշխատող խնդիրներ (մինչև 15 րոպե), վճար՝ ամեն կանչի համար։
- S3՝ object storage upload-ների, backup-ների, ստատիկ կայքերի համար. versioning և lifecycle կանոններ։
- RDS / Aurora՝ կառավարվող PostgreSQL կամ MySQL՝ backup-ներով, Multi-AZ failover-ով, replica-ներով։
- CloudFront + Route 53՝ CDN և DNS, SQS՝ հերթեր, VPC + IAM՝ ցանց և թույլտվություններ։
03Ցանց՝ VPC-ի խելամիտ կառուցվածք
VPC-ն (virtual private cloud) ռեգիոնի ներսում քո մեկուսացված ցանցն է։ Այն բաժանում ես subnet-ների, որոնցից յուրաքանչյուրը մեկ availability zone-ում է։ Public subnet-ներն ունեն route դեպի internet gateway և պարունակում են միայն այն, ինչը պարտադիր պետք է նայի ինտերնետին, սովորաբար load balancer-ը։ Private subnet-ներում են հավելվածի սերվերներն ու բազաները. դրանց ինտերնետից ուղղակիորեն հասնել հնարավոր չէ։ Security group-երը stateful firewall-ներ են, որոնք կցվում են յուրաքանչյուր ռեսուրսի. load balancer-ն ընդունում է 443-ը ցանկացած տեղից, հավելվածը տրաֆիկ է ընդունում միայն load balancer-ի security group-ից, բազան՝ միայն հավելվածի security group-ից։ Private ռեսուրսները, որոնց պետք է ելք դեպի ինտերնետ՝ փաթեթների թարմացումների կամ արտաքին API-ների համար, օգտագործում են NAT gateway, որը հարմար է, բայց ծախսերի դասական անակնկալներից մեկն է, ուստի արժե ավելացնել VPC endpoint-ներ S3-ի և AWS-ի այլ ծառայությունների համար։
- Public subnet՝ միայն load balancer։
- Private subnet՝ հավելված և բազա, որոնց հասնում են security group-ի հղումներով։
- Քո շերտերի միջև հղվիր security group-երին, ոչ թե IP միջակայքերին։
04IAM և least privilege
IAM-ը (Identity and Access Management) որոշում է, թե ով որ AWS API-ն կարող է կանչել որ ռեսուրսի վրա։ Least privilege սկզբունքը նշանակում է, որ յուրաքանչյուր identity ստանում է միայն այն թույլտվությունները, որոնք պետք են իր գործի համար։ Root հաշիվը պաշտպանիր MFA-ով և երբեք մի օգտագործիր ամենօրյա աշխատանքում։ Մարդիկ պետք է մտնեն IAM Identity Center-ով՝ ժամանակավոր credentials-ով, ոչ թե երկարակյաց access key-երով։ Հավելվածները պետք է օգտագործեն role-եր. EC2 instance profile-ը, ECS task role-ը կամ Lambda execution role-ը կոդին ավտոմատ տալիս են կարճաժամկետ credentials, ու ոչ մի key չի մնում .env ֆայլերում։ Գրիր նեղ policy-ներ, ինչպես օրինակում, որը հավելվածին թույլ է տալիս կարդալ ու գրել միայն մեկ bucket-ի մեկ prefix-ում։ Օգտագործիր IAM Access Analyzer՝ չօգտագործվող կամ չափազանց լայն թույլտվությունները գտնելու համար, և միացրու CloudTrail-ը՝ յուրաքանչյուր API կանչ գրանցելու համար։
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::example-app-uploads/uploads/*"
}
]
}
05Ծախսերի թակարդներ և ինչպես խուսափել դրանցից
AWS-ի հաշիվները հազվադեպ են մեծանում մեկ մեծ սերվերի պատճառով. դրանք աճում են մանր բաներից, որոնց ոչ ոք չի հետևում։ NAT gateway-ները գանձում են ամեն ժամի և մշակված ամեն գիգաբայթի համար։ Դեպի ինտերնետ և availability zone-ների միջև data transfer-ը աննկատ կուտակվում է։ Յուրաքանչյուր public IPv4 հասցե վճարովի է ժամավճարով։ Չկցված EBS volume-ները, հին snapshot-ները, պարապ load balancer-ները և մոռացված թեստային միջավայրերը շարունակում են գումար «ուտել»։ CloudWatch-ում լոգերի ընդունումը կարող է ավելի թանկ արժենալ, քան այդ լոգերը գրող սերվերները։ RDS Multi-AZ-ը մոտավորապես կրկնապատկում է բազայի արժեքը. դա հաճախ ճիշտ է, բայց պետք է գիտակցված ընտրություն լինի։ Պաշտպանվիր առաջին օրվանից՝ դրիր AWS Budgets ծանուցումներ, յուրաքանչյուր ռեսուրսի tag տուր նախագծով ու միջավայրով, ամսական նայիր Cost Explorer-ը, սահմանիր լոգերի պահպանման ժամկետ և կայուն բեռների համար օգտագործիր Savings Plans կամ reserved capacity։
aws budgets create-budget --account-id 111122223333 \
--budget '{"BudgetName":"monthly","BudgetLimit":{"Amount":"200","Unit":"USD"},"TimeUnit":"MONTHLY","BudgetType":"COST"}' \
--notifications-with-subscribers '[{"Notification":{"NotificationType":"ACTUAL","ComparisonOperator":"GREATER_THAN","Threshold":80},"Subscribers":[{"SubscriptionType":"EMAIL","Address":"[email protected]"}]}]'
06AWS, թե՞ VPS
DigitalOcean-ի, Hetzner-ի կամ նմանատիպ մատակարարի VPS-ը տալիս է ֆիքսված ամսական գին, առատ ներառված bandwidth և մեկ պարզ կառավարման վահանակ։ Մեկ հավելվածի համար լավ կազմակերպված VPS-ը Docker Compose-ով, off-site backup-ներով և մոնիթորինգով հաճախ մի քանի անգամ ավելի էժան է, քան համարժեքը AWS-ում, և փոքր թիմի համար ավելի հեշտ է հասկանալի։ AWS-ը հաղթում է, երբ քեզ պետք է այն, ինչ ինքդ կառուցելը դժվար է՝ ավտոմատ failover-ով և point-in-time recovery-ով կառավարվող բազաներ, autoscaling կտրուկ փոփոխվող տրաֆիկի համար, բազմաթիվ ռեգիոններ, compliance սերտիֆիկացիաներ, որոնք պահանջում են enterprise հաճախորդները, կամ խորը ինտեգրացիա AWS-ի այլ ծառայությունների հետ։ Տարածված միջին ճանապարհը VPS-ն է compute-ի համար՝ գումարած մի քանի նպատակային managed ծառայություն, օրինակ՝ S3-համատեղելի պահոց upload-ների համար և CDN։ Որոշիր պահանջներով ու թիմի հմտություններով, ոչ թե մոդայով։
Օգտագործեք, երբ
- Տրաֆիկ, որը շատ է փոփոխվում, և որտեղ autoscaling-ն ու pay-per-use-ը իրական գումար են խնայում։
- Երբ պետք է կառավարվող բարձր հասանելիություն՝ Multi-AZ բազաներ, load balancer-ներ, failover DNS։
- Enterprise կամ կարգավորվող ոլորտի հաճախորդներ, որոնք պահանջում են կոնկրետ compliance ծրագրեր կամ ռեգիոններ։
- Իրադարձություններով աշխատող բեռներ, որոնք լավ են տեղավորվում Lambda-ի, SQS-ի և S3 trigger-ների մեջ։
Մի՛ օգտագործեք, երբ
- Մեկ փոքր կամ միջին հավելված կայուն տրաֆիկով. VPS-ն ավելի էժան ու պարզ է։
- Թիմ, որտեղ չկա մեկը, ով կտիրապետի IAM-ին, ցանցին ու ծախսերին. սխալ կոնֆիգուրացիան գլխավոր ռիսկն է։
- Bandwidth-ով ծանր բեռներ, որտեղ data transfer-ի գնագոյացումը գերակշռում է հաշվում։
Այլընտրանքներ
- VPS մատակարարներ (DigitalOcean, Hetzner)
Կանխատեսելի գներ, պարզ ցանց, իդեալական է մեկից մի քանի սերվերի համար։
- Google Cloud
Ուժեղ է Kubernetes-ում (GKE), տվյալների ու analytics-ի մեջ. նման «աղյուսներ»։
- Microsoft Azure
Տարածված է enterprise-ների մոտ, որոնք արդեն Microsoft-ի identity-ի ու գործիքների վրա են։
- Lightsail
AWS-ի սեփական VPS-անման արտադրանքը փաթեթային գնով, մեղմ մուտքի կետ։
Լավագույն պրակտիկաներ
- Root հաշիվը փակիր MFA-ով, իսկ մարդկանց համար օգտագործիր IAM Identity Center։
- Հավելվածներին տուր IAM role-եր, երբեք՝ երկարակյաց access key-եր կոնֆիգ ֆայլերում։
- Բազաները պահիր private subnet-ներում և մուտք թույլ տուր միայն հավելվածի security group-ից։
- S3 bucket-ների վրա արգելափակիր public access-ը, եթե չես մատուցում CloudFront-ով՝ origin access control-ով։
- Budget-ներն ու ծանուցումները դրիր առաջին իսկ օրը և tag տուր յուրաքանչյուր ռեսուրսի։
- Միացրու CloudTrail-ը և ենթակառուցվածքը պահիր կոդում (Terraform կամ CloudFormation)։
Տարածված սխալներ
- Access key-երը Git-ում commit անել, որտեղ բոտերը րոպեների ընթացքում գտնում ու չարաշահում են դրանք։
- Bucket-ը public դարձնել՝ թույլտվությունների սխալն արագ «ուղղելու» համար։
- Բազան դնել public subnet-ում՝ security group-ում 0.0.0.0/0-ով։
- Թեստային միջավայրերն ու NAT gateway-ները ամիսներով միացված թողնել։
- Ամեն ինչի համար մեկ AWS հաշիվ օգտագործել՝ production-ն ու փորձարկումները չբաժանելով։
Խորը վերլուծություն
07Ինչպես է IAM-ը որոշում՝ թույլատրել, թե մերժել
AWS API-ի յուրաքանչյուր կանչ ստուգվում է իրեն վերաբերող բոլոր policy-ներով, և տրամաբանությունը խիստ է։ Ամեն ինչ սկսվում է անուղղակի մերժումից (implicit deny)։ Ցանկացած կիրառելի policy-ում բացահայտ Deny-ը միշտ հաղթում է։ Մեկ հաշվի ներսում հարցումը թույլատրվում է միայն այն դեպքում, երբ որևէ identity-based կամ resource-based policy թույլ է տալիս այն, և ոչինչ չի մերժում։ Դրանից վերև կան սահմանափակիչներ, որոնք կարող են միայն իրավունքներ վերցնել, երբեք չեն տալիս․ AWS Organizations-ի service control policy-ները, role-ի permission boundary-ները և session policy-ները նույնպես պետք է թույլ տան գործողությունը։ Condition-ները policy-ները դարձնում են ճշգրիտ․ սահմանափակել ըստ աղբյուր VPC endpoint-ի, պահանջել գաղտնագրում փոխանցման ժամանակ, պահանջել MFA կամ թույլ տալ միայն մեկ նախագծի tag ունեցող ռեսուրսները։ Երբ մուտքը ձախողվում է, սխալի հաղորդագրությունը և CloudTrail-ը սովորաբար ասում են, թե policy-ի որ տեսակն է մերժել, իսկ IAM policy simulator-ը կարող է վերարտադրել որոշումը։
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyInsecureTransport",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": ["arn:aws:s3:::example-app-uploads", "arn:aws:s3:::example-app-uploads/*"],
"Condition": { "Bool": { "aws:SecureTransport": "false" } }
}
]
}
08Բազմահաշվային կառուցվածք AWS Organizations-ով
AWS հաշիվը (account) մեկուսացման ամենաուժեղ սահմանն է, որ առաջարկում է AWS-ը․ առանձին իրավունքներ, առանձին quota-ներ և հաշվում առանձին տող։ Այդ պատճառով հասուն համակարգերը օգտագործում են բազմաթիվ հաշիվներ՝ կառավարվող AWS Organizations-ով, այլ ոչ թե մեկ հաշիվ ամեն ինչի համար։ Տիպիկ կառուցվածքում կա management հաշիվ՝ միայն billing-ի և կազմակերպության կարգավորումների համար, log archive հաշիվ, որն ստանում է CloudTrail-ի և config-ի log-երը մնացած բոլոր հաշիվներից, և որը հավելվածների թիմերը չեն կարող փոփոխել, security հաշիվ՝ աուդիտի գործիքների համար, և առանձին workload հաշիվներ production-ի, staging-ի և sandbox-ների համար։ Կազմակերպության մակարդակի service control policy-ները պարտադրում են կանոններ, որոնք հաշվի ներսում ոչ ոք չի կարող շրջանցել, օրինակ՝ արգելել կազմակերպությունից դուրս գալը, արգելել CloudTrail-ի անջատումը կամ արգելել ցանկացած ռեգիոն, բացի օգտագործվողներից։ Մարդիկ մեկ անգամ մուտք են գործում IAM Identity Center-ով և անցնում են յուրաքանչյուր հաշվի role-երին։ AWS Control Tower-ը կարող է այս landing zone-ը կարգավորել խելամիտ լռելյայն արժեքներով։
- Վնասի շառավիղ․ staging-ի արտահոսած credential-ը չի կարող դիպչել production-ին։
- Quota-ներն ու ծախսերը բաժանված են ըստ հաշվի և ըստ թիմի։
- SCP-ները սահմանափակիչներ են․ դրանք նեղացնում են իրավունքները, բայց երբեք չեն տալիս։
09EC2-ին ճիշտ մուտք․ IMDSv2 և Session Manager
Յուրաքանչյուր EC2 instance կարող է կարդալ իր metadata-ն, ներառյալ իր instance role-ի ժամանակավոր credential-ները, լոկալ 169.254.169.254 հասցեից։ Սկզբնական IMDSv1-ում աշխատում էր ցանկացած պարզ GET հարցում, ուստի հավելվածում server-side request forgery (SSRF) սխալը, որը ստիպում է սերվերին բեռնել հարձակվողի տված URL-ը, կարող էր արտահոսել այդ credential-ները։ Հենց այդպես են տեղի ունեցել մի քանի հայտնի արտահոսքեր։ IMDSv2-ը պահանջում է PUT հարցումով ստացված session token և hop-երի սահմանափակում, ինչը փակում է SSRF-ի ուղիների մեծ մասը․ պարտադրիր այն յուրաքանչյուր instance-ի վրա, իսկ նոր instance տեսակներն ու AMI-ները գնալով ավելի հաճախ այն միացված են ունենում լռելյայն։ Shell մուտքի համար AWS Systems Manager Session Manager-ը session է բացում SSM agent-ի միջոցով՝ IAM-ով նույնականացված և CloudTrail-ում գրանցված, առանց մուտքային 22 port-ի, առանց bastion host-ի և առանց ռոտացիա պահանջող SSH key-երի։ Դրանով port forwarding անելով կարելի է debug-ի համար հասնել նաև մասնավոր բազաներին։
# require IMDSv2 on an existing instance
aws ec2 modify-instance-metadata-options --instance-id i-0123456789abcdef0 \
--http-tokens required --http-endpoint enabled
# shell without SSH or open ports
aws ssm start-session --target i-0123456789abcdef0
# tunnel to a private RDS instance through that host
aws ssm start-session --target i-0123456789abcdef0 \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["db.internal.example.com"],"portNumber":["5432"],"localPortNumber":["5432"]}'
10Ուր է գնում ցանցի գումարը, և ինչպես այն պահել
Ցանցն այն տեղն է, որտեղ AWS-ի հաշիվները մարդկանց ամենից հաճախ են զարմացնում, որովհետև տրաֆիկը գնահատվում է ըստ ուղու։ Ինտերնետից AWS մտնող տվյալներն անվճար են։ Դեպի ինտերնետ դուրս եկող տվյալները վճարովի են ըստ գիգաբայթի, ընդ որում CloudFront-ի սակագները սովորաբար ավելի ցածր են, քան EC2-ից կամ S3-ից ուղղակի մատուցելիս, և կա անվճար ամսական ծավալ, ուստի CDN-ը հաճախ խնայում է և՛ գումար, և՛ latency։ Availability zone-երի միջև տրաֆիկը վճարովի է երկու ուղղությամբ, ուստի տարբեր zone-երում գտնվող «շատախոս» service-ները կամ այլ zone-երում գտնվող replica-ները իրական արժեք ունեն։ NAT gateway-ը վճար է գանձում ըստ ժամի և ըստ մշակված գիգաբայթի՝ սովորական փոխանցման վրա ավելացած, ուստի NAT-ով մեծ image-ներ կամ backup-ներ քաշող մասնավոր սերվերները վճարում են երկու անգամ։ S3-ի և DynamoDB-ի gateway VPC endpoint-ներն անվճար են և այդ տրաֆիկը հանում են NAT-ի ուղուց․ այլ ծառայությունների interface endpoint-ները վճարովի են ըստ ժամի, բայց դեռ կարող են ավելի էժան լինել։ Յուրաքանչյուր հանրային IPv4 հասցե նույնպես վճարովի է ըստ ժամի։
- Մասնավոր subnet-ներ ունեցող յուրաքանչյուր VPC-ում ավելացրու անվճար S3 gateway endpoint-ը։
- Հանրային asset-ները մատուցիր CloudFront-ով, ոչ թե ուղիղ S3-ից կամ EC2-ից։
- NAT-ի և փոխանցման ծախսերը գտնելու համար օգտագործիր Cost Explorer-ը՝ խմբավորած ըստ usage type-ի։
Իրական իրավիճակներ
Access key-ը push է արվել հանրային repository
Խնդիր
GitHub-ը զգուշացում է ուղարկում, որ AWS access key-ը քսան րոպե առաջ հայտնվել է հանրային commit-ում։ Key-ը պատկանում է լայն իրավունքներով IAM user-ի, որին deploy-ի համար օգտագործում էր մի script։
Ինչպես լուծել
Անմիջապես ապաակտիվացրու key-ը IAM-ում, ապա ջնջիր այն, հենց համոզվես, որ ոչ մի օրինական բան դրանից կախված չէ։ Ենթադրիր, որ այն արդեն օգտագործվել է․ CloudTrail-ում բոլոր ռեգիոններով փնտրիր key-ի ID-ն՝ նոր IAM user-ներ կամ key-եր, անսովոր ռեգիոններում գործարկված instance-ներ (տիպիկ է կրիպտոմայնինգը), փոփոխված security group-եր և S3-ից ընթերցումներ։ Հեռացրու այն ամենը, ինչ ստեղծել է հարձակվողը, ներառյալ նոր access key-երը կամ role-երը։ Ստուգիր հաշիվը և արտահոսքի մասին AWS Health-ի ծանուցումները։ Ապա վերացրու պատճառը․ IAM user-ին փոխարինիր role-ով, CI-ի համար՝ OIDC-ով, միացրու secret scanning-ը push protection-ով և ավելացրու SCP, որը մերժում է այն ռեգիոնները, որոնք երբեք չես օգտագործում։
Ամսական հաշիվը կրկնապատկվել է առանց նոր feature-ների
Խնդիր
Ֆինանսական բաժինը հարցնում է, թե ինչու է AWS-ի հաշիվը մոտ 900-ից դարձել 1,800 դոլար։ Տրաֆիկը աճել է շատ քիչ, և ոչ ոք չի հիշում, որ որևէ մեծ բան գործարկած լինի։
Ինչպես լուծել
Բացիր Cost Explorer-ը, խմբավորիր ըստ ծառայության, ապա ըստ usage type-ի և համեմատիր նախորդ ամսվա հետ։ Տարածված մեղավորներ՝ NAT gateway-ի մշակած բայթերը, երբ ինչ-որ job սկսել է S3-ից տվյալներ քաշել NAT-ով, AZ-երի միջև փոխանցումը նոր replica-ից, CloudWatch Logs-ի ընդունումը debug logging-ը միացնելուց հետո կամ մոռացված թեստային միջավայր։ Յուրաքանչյուրը շտկիր ճիշտ գործիքով․ անվճար S3 gateway endpoint, «շատախոս» service-ները մեկ տեղում տեղադրել, log-ի մակարդակներ և retention, անգործ ռեսուրսների ջնջում։ Ապա կանխիր կրկնությունը․ Cost Anomaly Detection զգուշացումներով, budget-ներ ըստ հաշվի, պարտադիր project և environment tag-եր և կարճ ամսական ծախսերի վերանայում, որի պատասխանատուն կոնկրետ մարդ է։
Հավելվածը VPS-ից AWS տեղափոխել քայլ առ քայլ
Խնդիր
Աճող SaaS-ն աշխատում է մեկ VPS-ի վրա։ Կորպորատիվ հաճախորդն այժմ պահանջում է կառավարվող բազա՝ ավտոմատ failover-ով, և վերականգնման փաստաթղթավորված գործընթաց, բայց «մեկ հարվածով» միգրացիան ռիսկային է թվում։
Ինչպես լուծել
Տեղափոխիր մեկ շերտ միաժամանակ, յուրաքանչյուրը՝ իր rollback-ով։ Նախ՝ upload-ները․ ֆայլերը պատճենիր S3 aws s3 sync-ով, փոխիր հավելվածի storage driver-ը և մատուցիր դրանք CloudFront-ով։ Երկրորդ՝ բազան․ ստեղծիր RDS Multi-AZ մասնավոր subnet-ում, replication կարգավորիր VPS-ից logical replication-ով կամ AWS DMS-ով, ապա անցում կատարիր կարճ, նախապես հայտարարված պատուհանում։ Երրորդ՝ compute-ը․ անհրաժեշտության դեպքում հավելվածը container-ի մեջ դիր և գործարկիր ECS-ով Fargate-ի վրա երկու zone-ում՝ ALB-ի հետևում, մինչ DNS-ը դեռ կարելի է վերադարձնել VPS-ին։ Սկզբից ենթակառուցվածքը նկարագրիր Terraform-ով և VPS-ը պահիր, մինչև ամբողջ մեկ ամիս կայուն աշխատանք։
Արագ ուղեցույց
- Ո՞ր identity-ով եմ աշխատում
aws sts get-caller-identity- Մուտք IAM Identity Center-ով
aws sso login --profile prod-admin- Մասնավոր ֆայլի ժամանակավոր ներբեռնման հղում
aws s3 presign s3://example-app-uploads/report.pdf --expires-in 600- Հետևել Lambda-ի log-երին իրական ժամանակում
aws logs tail /aws/lambda/process-upload --follow- Աշխատող instance-ների կոմպակտ ցանկ
aws ec2 describe-instances --filters Name=instance-state-name,Values=running --query "Reservations[].Instances[].[InstanceId,InstanceType,Placement.AvailabilityZone]" --output table- IMDSv2-ը պարտադիր դարձնել instance-ի վրա
aws ec2 modify-instance-metadata-options --instance-id i-0123456789abcdef0 --http-tokens required- Shell instance-ում առանց SSH-ի
aws ssm start-session --target i-0123456789abcdef0- Retention սահմանել, որ log-երն այլևս չաճեն
aws logs put-retention-policy --log-group-name /app/prod --retention-in-days 30- Ստուգել bucket-ի public access block-ը
aws s3api get-public-access-block --bucket example-app-uploads
Հարցեր և պատասխաններ
Q1Բացատրիր AWS-ի shared responsibility մոդելը։
AWS-ը պաշտպանում է բուն cloud-ը՝ ֆիզիկական դատա կենտրոնները, սարքավորումները, ցանցի ողնաշարը և վիրտուալացման շերտը, ինչպես նաև managed ծառայությունների հիմքում ընկած ենթակառուցվածքը։ Հաճախորդը պաշտպանում է այն ամենը, ինչ դնում է cloud-ի մեջ՝ IAM օգտատերերն ու role-երը, security group-երը, գաղտնագրման ընտրությունները, տվյալների դասակարգումը և EC2 instance-ների օպերացիոն համակարգն ու ծրագրերը։ Սահմանը տեղաշարժվում է ծառայության հետ. EC2-ում OS-ի patch-երը դու ես անում, RDS-ում AWS-ն է patch անում բազայի engine-ը, բայց ցանցային մուտքն ու credentials-ը դեռ դու ես վերահսկում, Lambda-ում քոնն են միայն կոդը և դրա թույլտվությունները։ Իրական արտահոսքերի մեծ մասը հաճախորդի կողմից է՝ սովորաբար public bucket-ներ կամ արտահոսած key-եր։
Q2Ե՞րբ կընտրես EC2, ECS Fargate-ով, թե Lambda։
EC2՝ երբ պետք է մեքենայի լիարժեք վերահսկողություն, երկար աշխատող պրոցեսներ, հատուկ ծրագրեր կամ կայուն բեռի համար ամենացածր գին, և ընդունում եմ, որ patch-երն ու կառավարումը իմ վրա են։ ECS Fargate-ով՝ երբ հավելվածն արդեն կոնտեյներացված է, և ուզում եմ, որ AWS-ը աշխատեցնի կոնտեյներները՝ առանց host-երը կառավարելու. դա հարմար է API-ների, worker-ների և վեբ հավելվածների համար՝ կայուն կամ չափավոր փոփոխվող տրաֆիկով։ Lambda՝ իրադարձություններով աշխատող կարճ խնդիրների համար՝ նկարների մշակում S3 upload-ի ժամանակ, webhook-ներ, պլանավորված job-եր, կտրուկ փոփոխվող API-ներ։ Lambda-ի ամեն request-ի համար գնագոյացումը հիանալի է ցածր կամ պոռթկումային ծավալների դեպքում, բայց երկար job-երը, ծանր մշտական տրաֆիկը և cold start-ի նկատմամբ զգայուն ուղիները սովորաբար ավելի էժան կամ ավելի լավ են կոնտեյներներում։
Q3Ինչպե՞ս կպաշտպանես S3 bucket-ը, որտեղ պահվում են օգտատերերի upload-ները։
Block Public Access-ը միացված պահիր հաշվի և bucket-ի մակարդակում, և թող լռելյայն bucket-owner-enforced object ownership-ը, որպեսզի ACL-ները անջատված լինեն։ Հավելվածը ստանում է IAM role՝ policy-ով, որը սահմանափակված է անհրաժեշտ գործողություններով միայն այդ bucket-ի կամ prefix-ի վրա։ Օգտատերերը վերբեռնում ու ներբեռնում են backend-ի գեներացրած կարճաժամկետ presigned URL-ներով, կամ public ասեթների դեպքում՝ CloudFront-ով origin access control-ով։ Encryption at rest-ը լռելյայն միացված է. օգտագործիր KMS key-եր, եթե պետք է աուդիտ կամ key-երի վերահսկողություն։ Միացրու versioning-ը և lifecycle կանոնները, որպեսզի պատահական ջնջումները վերականգնելի լինեն, իսկ հին տարբերակները ժամկետանց դառնան, և անհրաժեշտության դեպքում մուտքերը գրանցիր CloudTrail data event-ներով։
Q4IAM user, թե՞ IAM role. ո՞րն է տարբերությունը։
IAM user-ը երկարակյաց identity է մշտական credentials-ով՝ գաղտնաբառով կամ access key-երով։ Role-ը մշտական credentials չունի. վստահելի principal-ը, օրինակ՝ EC2 instance-ը, Lambda ֆունկցիան, մեկ այլ հաշվի օգտատերը կամ federated մարդը, assume է անում այն և ստանում ժամանակավոր credentials, որոնք ավտոմատ ժամկետանց են դառնում։ Այսօր լավագույն պրակտիկան IAM user-ներից գրեթե ամբողջությամբ խուսափելն է։ Մարդիկ մտնում են IAM Identity Center-ով կամ արտաքին identity provider-ով և assume անում role-եր, իսկ workload-ները օգտագործում են instance profile-ներ, task role-եր կամ execution role-եր։ Դա վերացնում է երկարակյաց key-երը, որոնք արտահոսքերի ամենատարածված աղբյուրն են, և մուտքը հեշտ է դարձնում աուդիտ անելն ու հետ վերցնելը։
Q5Ինչպե՞ս հավելվածը դարձնել բարձր հասանելի AWS-ում։
Նախ վերացրու single point of failure-ները ռեգիոնի ներսում։ Աշխատեցրու առնվազն երկու հավելվածի instance կամ task տարբեր availability zone-ներում՝ Application Load Balancer-ի հետևում, health check-ներով, որպեսզի անառողջ target-ները փոխարինվեն։ Օգտագործիր RDS կամ Aurora Multi-AZ-ով, որպեսզի բազան ավտոմատ failover անի, իսկ session-ներն ու cache-ը պահիր կառավարվող Redis-համատեղելի ծառայությունում, ոչ թե instance-ների վրա։ Ֆայլերը պահիր S3-ում, ոչ թե լոկալ դիսկում։ Ստատիկ կոնտենտի համար առջևում դիր CloudFront։ Autoscaling-ը հզորությունը համապատասխանեցնում է բեռին։ Multi-region կառուցվածքները ավելացնում են Route 53 failover և տվյալների ռեպլիկացիա, բայց շատ ավելի թանկ են, ուստի արդարացված են միայն իրական բիզնես պահանջներով։
Q6Ինչո՞ւ կարող է ընկերությունը AWS-ում ավելի շատ վճարել, քան VPS-ում, և ինչպե՞ս վերահսկել դա։
Որովհետև AWS-ը շատ մանր բաների համար առանձին է գանձում՝ NAT gateway-ի ժամեր և մշակված տվյալներ, դեպի դուրս և zone-ների միջև data transfer, public IPv4 հասցեներ, load balancer-ներ, լոգերի ընդունում, snapshot-ներ և պարապ volume-ներ։ Ավելորդ մեծ instance-ներն ու մոռացված միջավայրերը էլ ավելին են ավելացնում։ VPS-ը compute-ն ու առատ bandwidth-ը փաթեթավորում է մեկ գնի մեջ։ AWS-ի ծախսը վերահսկելու համար՝ դրիր budget-ներ և անոմալիաների ծանուցումներ, ռեսուրսներին tag տուր նախագծով ու միջավայրով, instance-ների չափը ընտրիր իրական մետրիկաներով, կայուն բեռի համար օգտագործիր Graviton instance-ներ և Savings Plans, ավելացրու VPC endpoint-ներ՝ NAT տրաֆիկը կրճատելու համար, սահմանիր լոգերի պահպանման ժամկետ և ջնջիր այն, ինչը ոչ ոքի չի պատկանում։ Հաշիվը ամսական վերանայեք որպես թիմային սովորություն։
Սենիոր մակարդակի հարցեր
S1Նախագծիր բարձր հասանելիությամբ վեբ հավելված AWS-ում միջին բյուջեով։ Որտե՞ղ ես փոխզիջման գնում։
Երկու availability zone, ոչ թե երեք, ինչը ծածկում է data center-ի խափանումը ավելի ցածր գնով։ Application Load Balancer հանրային subnet-ներում, ECS-ի task-եր Fargate-ով մասնավոր subnet-ներում, առնվազն երկու task՝ բաշխված zone-երով, autoscaling ըստ CPU-ի կամ հարցումների քանակի։ RDS PostgreSQL Multi-AZ՝ ավտոմատ failover-ի համար, ավտոմատ backup-ներով և PITR-ով, գումարած ElastiCache՝ session-ների և քեշի համար։ S3 CloudFront-ով՝ asset-ների և upload-ների համար։ Փոխզիջումները․ մեկ NAT gateway՝ յուրաքանչյուր zone-ի համար մեկի փոխարեն, ընդունելով, որ zone-ի խափանումը մինչև շտկումը կոտրում է մյուս zone-ի ելքային կանչերը, ինչը մեղմվում է S3 gateway endpoint-ներով․ Graviton instance-ներ և Compute Savings Plan․ մեկ ռեգիոն՝ disaster recovery-ի համար backup-ների միջռեգիոնային պատճեններով, ոչ թե active-active։ Յուրաքանչյուր փոխզիջում փաստաթղթավորվում է իր ռիսկով, որպեսզի բիզնեսը այն գիտակցաբար ընդունի։
S2SQS, SNS, EventBridge, թե Kinesis․ ինչպե՞ս ընտրել։
SQS-ը հերթ է․ մեկ հաղորդագրությունը մշակում է մեկ consumer՝ retry-ներով, visibility timeout-ներով և dead-letter հերթերով։ Օգտագործիր այն worker-ների խմբի համար աշխատանքը բուֆերացնելու նպատակով։ FIFO հերթերը ավելացնում են հերթականություն ըստ խմբի և deduplication՝ ավելի ցածր throughput-ի գնով։ SNS-ը publish-subscribe fan-out է․ մեկ հաղորդագրությունը ուղարկվում է բազմաթիվ subscriber-ների, հաճախ SQS հերթերի, ուստի յուրաքանչյուր consumer ստանում է իր հուսալի պատճենը։ EventBridge-ը event bus է՝ բովանդակության վրա հիմնված routing կանոններով, schema registry-ով, archive-ով և replay-ով, ինչպես նաև SaaS-ի և AWS ծառայությունների event-ների ինտեգրացիաներով․ այն հարմար է event-driven ճարտարապետությունների համար, որտեղ շատ թիմեր արձագանքում են domain event-ներին, ավելի բարձր latency-ի և ըստ event-ի վճարի գնով։ Kinesis Data Streams-ը կարգավորված, վերընթերցվող log է՝ բաժանված shard key-ով, ամենամոտը Kafka-ին, մեծ ծավալի հոսքերի համար, ինչպիսիք են clickstream-ը կամ telemetry-ն, որոնք մի քանի consumer կարդում են անկախ և իրենց տեմպով։
S3Բացատրիր AWS-ի disaster recovery ռազմավարությունները և թե ինչպես կընտրես դրանցից մեկը։
AWS-ը նկարագրում է չորսը՝ ըստ աճող արժեքի և նվազող վերականգնման ժամանակի։ Backup and restore․ տվյալները backup են արվում այլ ռեգիոն, իսկ ենթակառուցվածքն անհրաժեշտության դեպքում վերստեղծվում է կոդից․ RTO-ն ժամեր է, արժեքը՝ ամենացածրը։ Pilot light․ հիմնական տվյալները շարունակաբար replicate են արվում, օրինակ՝ բազայի միջռեգիոնային replica, իսկ compute-ը նկարագրված է, բայց անջատված․ RTO-ն տասնյակ րոպեներ է։ Warm standby․ երկրորդ ռեգիոնում աշխատում է փոքրացված, բայց լիովին գործող պատճեն, որը failover-ի ժամանակ մեծացվում է․ RTO-ն րոպեներ է։ Multi-site active-active․ երկու ռեգիոններն էլ սպասարկում են տրաֆիկ, RTO-ն գրեթե զրո է, բայց խնդիրներն ամենաբարդն են, հատկապես տվյալների համաձայնեցվածությունը և կոնֆլիկտների լուծումը։ Ընտրությունը հետևում է բիզնեսի RPO-ին և RTO-ին և պարապուրդի արժեքին։ Ընկերությունների մեծ մասին լիովին բավարարում է backup and restore-ը կամ pilot light-ը, պայմանով, որ failover-ը փորձարկված է, և ենթակառուցվածքը կոդում է։
S4Ո՞ր պահից է Lambda-ն ավելի թանկ, քան container-ները։
Lambda-ն վճար է գանձում ըստ հարցման և կատարման գիգաբայթ-վայրկյանի և ոչինչ չի գանձում պարապ ժամանակի համար։ Կտրուկ տատանվող կամ ցածր տրաֆիկի դեպքում դժվար է դրանից լավը գտնել․ օրական մի քանի հազար անգամ կանչվող ֆունկցիան գրեթե ոչինչ չարժե, ակնթարթորեն scale է լինում և capacity planning չի պահանջում։ Երբ տրաֆիկը դառնում է բարձր և կայուն, վճարում ես յուրաքանչյուր հարցման յուրաքանչյուր միլիվայրկյանի համար, մինչդեռ Fargate-ի կամ EC2-ի վրա container-ը սպասարկում է բազմաթիվ զուգահեռ հարցումներ այն capacity-ի վրա, որի համար վճարում ես մեկ անգամ, հատկապես Savings Plan-ներով։ Հատման կետը կախված է տևողությունից, հիշողությունից և զուգահեռությունից, ուստի հաշվարկիր իրական թվերով։ Կարևոր են նաև այլ գործոններ․ տասնհինգ րոպեից երկար task-եր, cold start-ի նկատմամբ զգայուն latency, ռելյացիոն բազաների կապերի սահմանափակումներ (հաճախ պետք է RDS Proxy) և container-ներ վարելու օպերացիոն արժեքը։ Շատ համակարգեր համակցում են երկուսը․ container-ներ հիմնական API-ի համար, Lambda՝ event-ների և «սոսնձի» համար։
Բառարան
- ARN
- Amazon Resource Name․ ցանկացած AWS ռեսուրսի եզակի նույնացուցիչ, որով policy-ներում ճշգրիտ նշվում է, թե ինչն է թույլատրված։
- Principal
- Նա, ով կատարում է հարցումը․ user, role, AWS ծառայություն կամ federated identity, որին policy-ները թույլ են տալիս կամ մերժում։
- SCP
- Service control policy․ կազմակերպության մակարդակի սահմանափակիչ, որը որոշում է անդամ հաշիվներում հասանելի առավելագույն իրավունքները։
- Instance profile
- Կոնտեյներ, որը IAM role-ը կցում է EC2 instance-ին՝ դրա ծրագրերին ավտոմատ տալով ժամանակավոր credential-ներ։
- IMDSv2
- EC2 instance metadata service-ի token-ի վրա հիմնված տարբերակը, որը փակում է SSRF սխալներով credential-ների գողության մեծ մասը։
- NAT gateway
- Կառավարվող ծառայություն, որը մասնավոր subnet-ի ռեսուրսներին ելքային մուտք է տալիս ինտերնետ․ վճարովի է ըստ ժամի և գիգաբայթի։
- VPC endpoint
- Մասնավոր կապ քո VPC-ից դեպի AWS ծառայություն, որպեսզի տրաֆիկը չանցնի ինտերնետով կամ NAT-ով։
- Multi-AZ
- Տեղակայում, որտեղ այլ availability zone-ում կա պահուստային պատճեն, որն ավտոմատ ստանձնում է աշխատանքը, եթե հիմնականը խափանվի։
- Savings Plan
- Մեկ կամ երեք տարվա պարտավորություն՝ ծախսել որոշակի ժամային գումար, compute-ի մեծ զեղչի դիմաց։
- Egress
- Ցանցից դուրս եկող տվյալներ, օրինակ՝ AWS-ից դեպի ինտերնետ․ սովորաբար փոխանցման հենց այն ուղղությունն է, որ գումար արժե։
Շարունակեք սովորել
Պրոդուկտի գաղափար ունե՞ք։Եկեք ստեղծենք այն։
Պատմեք ձեր գաղափարի, պրոդուկտի կամ թիմի մասին։ Սովորաբար պատասխանում եմ մեկ աշխատանքային օրվա ընթացքում։