Բոլոր դասերը
DevOps և ամպՄիջին15 րոպե ընթերցումԱրժե իմանալ

AWS

Ամենամեծ cloud-ը՝ հարյուրավոր ծառայություններ, որոնցից մի քանիսն են իսկապես կարևոր, և հաշիվ, որին պետք է հետևել։

  • EC2
  • S3
  • RDS
  • Lambda
  • CloudFront
  • VPC & IAM
Քայլ 1/5
Մեկ VPS՝ էժան ու պարզ, բայց admin-ն էլ դու ես, backup-ներ անողն էլ, գիշերվա 3-ի զարթուցիչն էլ։

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 կանչ գրանցելու համար։

json
{
  "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։

bash
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-անման արտադրանքը փաթեթային գնով, մեղմ մուտքի կետ։

Լավագույն պրակտիկաներ

  1. Root հաշիվը փակիր MFA-ով, իսկ մարդկանց համար օգտագործիր IAM Identity Center։
  2. Հավելվածներին տուր IAM role-եր, երբեք՝ երկարակյաց access key-եր կոնֆիգ ֆայլերում։
  3. Բազաները պահիր private subnet-ներում և մուտք թույլ տուր միայն հավելվածի security group-ից։
  4. S3 bucket-ների վրա արգելափակիր public access-ը, եթե չես մատուցում CloudFront-ով՝ origin access control-ով։
  5. Budget-ներն ու ծանուցումները դրիր առաջին իսկ օրը և tag տուր յուրաքանչյուր ռեսուրսի։
  6. Միացրու 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-ը կարող է վերարտադրել որոշումը։

json
{
  "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-ի համար հասնել նաև մասնավոր բազաներին։

bash
# 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-ի։

Իրական իրավիճակներ

01

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, որը մերժում է այն ռեգիոնները, որոնք երբեք չես օգտագործում։

02

Ամսական հաշիվը կրկնապատկվել է առանց նոր 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-եր և կարճ ամսական ծախսերի վերանայում, որի պատասխանատուն կոնկրետ մարդ է։

03

Հավելվածը 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-ից դեպի ինտերնետ․ սովորաբար փոխանցման հենց այն ուղղությունն է, որ գումար արժե։

Պրոդուկտի գաղափար ունե՞ք։Եկեք ստեղծենք այն։

Պատմեք ձեր գաղափարի, պրոդուկտի կամ թիմի մասին։ Սովորաբար պատասխանում եմ մեկ աշխատանքային օրվա ընթացքում։