ЁЯдЦ рдзрдбрд╛ 12 тАФ рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рддреАрд▓ EC2: checklists, badges, рдЖрдгрд┐ рддрд╛рдлреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 12 тАФ рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛! ┬╖ рдорд╛рдЧреЗ: lesson-11-ebs-snapshots-ami
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╕рдЧрд│реЗ 12 рдзрдбреЗ тАФ рд╕рдВрдкреВрд░реНрдг course. рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛ IAM рдЖрдгрд┐ EC2 рдПрдХрд╛ machine рдордзреНрдпреЗ рдмрд╛рдВрдзрддреЛ, рдЖрдгрд┐ рдордЧ рдЗрддрд░ courses рдордзреНрдпреЗ рддреБрдореНрд╣реА рдЖрддрд╛рдкрд░реНрдпрдВрдд рдХрд╛рдп рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрдд рд╣реЛрддрд╛ рддреЗ рдЙрдШрдб рдХрд░рддреЛ. рдЦрд▒реНрдпрд╛ files:
- ec2/user-data.sh тАФ boot рдЪреА checklist
- ec2/ec2.tf тАФ рдЬрд┐рдереЗ checklist рдЖрдгрд┐ рдЯреЛрдкреА рдЬреЛрдбрд▓реА рдЬрд╛рддреЗ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рддреАрди рдпреБрдХреНрддреНрдпрд╛ рд╣рд╛рддрд╛рдиреЗ рд╕рд╛рдВрднрд╛рд│рд▓реЗрд▓реНрдпрд╛ рдПрдХрд╛ рдмрд╛рдХрд╛рд▓рд╛ рдЖрдкреЛрдЖрдк рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рддрд╛рдлреНрдпрд╛рдд рдмрджрд▓рддрд╛рдд:
Boot рдЪреА checklist ЁЯУЛ (user-data). рдкреНрд░рддреНрдпреЗрдХ рдирд╡реНрдпрд╛ рдмрд╛рдХрд╛рд▓рд╛ рдЪрд┐рдХрдЯрд╡рд▓реЗрд▓реА: "рдкрд╣рд┐рд▓реНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛: nginx install рдХрд░рд╛, рд╕реНрд╡рд╛рдЧрдд рдкрд╛рди рд▓рд╛рд╡рд╛, рд╕реЗрд╡рд╛ рджреЗрдгреЗ рд╕реБрд░реВ рдХрд░рд╛." рдмрд╛рдХ рд╕реНрд╡рддрдГрдЪ рд╕реНрд╡рддрдГрд▓рд╛ setup рдХрд░рддреЛ тАФ рдореНрд╣рдгреВрдирдЪ рдзрдбрд╛ 07 рдЪрд╛ instance рддреБрдореНрд╣реА рд╣рд╛рдд рд▓рд╛рд╡рдгреНрдпрд╛рдЖрдзреАрдЪ web server рд╣реЛрддрд╛. рдорд╛рдгреВрд╕ рдирд╛рд╣реА, drift рдирд╛рд╣реА, рдЖрдгрд┐ checklist git рдордзреНрдпреЗ рд░рд╛рд╣рддреЗ (user-data.sh).
Badge рдЪреА рдЦрд╛рдЪ ЁЯОй (metadata service). рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдХрд╛рдЪреНрдпрд╛ рдЖрдд,
169.254.169.254рдпрд╛ рдЬрд╛рджреБрдИ рдкрддреНрддреНрдпрд╛рд╡рд░, рдПрдХ рдЫреЛрдЯрд╛ рдбреНрд░реЙрд╡рд░ рдЕрд╕рддреЛ рдЬреНрдпрд╛рд▓рд╛ machine рд╡рд┐рдЪрд╛рд░реВ рд╢рдХрддреЗ: "рдореА рдХреЛрдг рдЖрд╣реЗ? рдорд╛рдЭрд╛ IP рдХрд╛рдп? тАжрдЖрдгрд┐ рдорд▓рд╛ рдЖрдЬрдЪреА credentials рдорд┐рд│рддреАрд▓ рдХрд╛?" тАФ рдмрд╛рдХрд╛рдЪреНрдпрд╛ IAM рдЯреЛрдкреАрд╕рд╛рдареА рддрд╛рдЬреА рддрд╛рддреНрдкреБрд░рддреА creds (рдзрдбрд╛ 05, рдЖрддрд╛ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд). рд╣реЗ IAM рдЖрдгрд┐ EC2 рдЪреЗ рд╣рд╕реНрддрд╛рдВрджреЛрд▓рди рдЖрд╣реЗ. Disk рд╡рд░ keys рдирд╛рд╣реАрдд, рдХреБрдареЗрд╣реА.рддрд╛рдлреНрдпрд╛рдЪрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ ЁЯСп (Auto Scaling Group). "рдиреЗрд╣рдореА N рдмрд╛рдХ рдЕрд╕рддреАрд▓, рдпрд╛ template рдордзреВрди рдмрдирд╡рд▓реЗрд▓реЗ, рдЗрдорд╛рд░рддреАрдВрдордзреНрдпреЗ рдкрд╕рд░рд▓реЗрд▓реЗ." рдмрд╛рдХ рдореЗрд▓рд╛ тЖТ рдмрджрд▓рд▓рд╛. рднрд╛рд░ рд╡рд╛рдврд▓рд╛ тЖТ рдЖрдгрдЦреА рдмрд╛рдХ. рд╡рд╛рдХреНрдп рдУрд│рдЦрд▓реЗ? рд╣рд╛ k8s course рдЪрд╛ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ (рдзрдбрд╛ 03) рдЖрд╣реЗ, рдПрдХ рдерд░ рдЦрд╛рд▓реА тАФ ASGs рдореНрд╣рдгрдЬреЗ computers рд╕рд╛рдареАрдЪреЗ Deployments.
рдЖрдгрд┐ рдкрдбрджрд╛ рдЙрдШрдбрддреЛ ЁЯОн: рдПрдХ EKS node group = EC2 рдмрд╛рдХрд╛рдВрдЪрд╛ ASG, EKS-рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ AMI рдордзреВрди рдмрдирд╡рд▓реЗрд▓рд╛, рдЬреНрдпрд╛рдЪрд╛ user-data рдореНрд╣рдгрддреЛ "рд╢рд╛рд│реЗрдЪреНрдпрд╛ cluster рдордзреНрдпреЗ рд╕рд╛рдореАрд▓ рд╡реНрд╣рд╛", рдЖрдгрд┐ ECR рдордзреВрди pull рдХрд░реВ рджреЗрдгрд╛рд░реА рдЯреЛрдкреА рдШрд╛рддрд▓реЗрд▓рд╛. рддреБрдореНрд╣реА рдХреЗрд▓реЗрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ course рдпрд╛рдЪ рдзрдбреНрдпрд╛рд╡рд░ рдЪрд╛рд▓рдд рд╣реЛрддрд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
ud["ЁЯУЛ user-data<br/>boot checklist, runs once"]
meta["ЁЯОй metadata service<br/>169.254.169.254<br/>hands out the hat's creds"]
desk["ЁЯЦея╕П instance<br/>self-configured,<br/>self-authorized"]
asg["ЁЯСп Auto Scaling Group<br/>'always N desks'<br/>a Deployment, for computers"]
eks["тШ╕я╕П EKS node group<br/>= ASG + EKS AMI +<br/>'join the cluster' checklist"]
ud -->|"1"| desk
meta -->|"2"| desk
desk -->|"3 templated ├ЧN"| asg
asg -->|"4 the reveal"| eks
тЭУ рдХрд╛рдп
- user-data: рдкрд╣рд┐рд▓реНрдпрд╛ boot рд▓рд╛, root рдореНрд╣рдгреВрди, рдПрдХрджрд╛рдЪ рдЪрд╛рд▓рддреЗ (cloud-init). рдореЛрдареНрдпрд╛ setups рдордзреНрдпреЗ рддреЗ "config agent install рдХрд░рд╛" рдЗрддрдХреЗ рд▓рд╣рд╛рди рд╣реЛрддреЗ рдХрд┐рдВрд╡рд╛ golden AMI рдордзреНрдпреЗ рдмрдирд╡рд▓реЗ рдЬрд╛рддреЗ (рдзрдбрд╛ 11) тАФ checklist рд╡рд┐рд░реБрджреНрдз рдЖрдзреАрдЪ рддрдпрд╛рд░ рдмрд╛рдХ, рдзреНрдпреЗрдп рддреЗрдЪ.
- IMDSv2: рдЖрдзреБрдирд┐рдХ metadata protocol (рдЖрдзреА token, рдордЧ рд╡рд┐рдЪрд╛рд░рд╛) тАФ v1 рдЪреНрдпрд╛ рдЙрдШрдбреНрдпрд╛
рдбреНрд░реЙрд╡рд░рдореБрд│реЗ рдкреНрд░рд╕рд┐рджреНрдз breaches рдЭрд╛рд▓реЗ. Terraform:
http_tokens = "required". - ASG рдЪреЗ рднрд╛рдЧ: launch template (рдХреЛрдгрддрд╛ рдмрд╛рдХ), min/desired/max, health checks, multi-AZ рдкрд╕рд░рд╡рдгреЗ. HPAтЖФASG рдЪреА рдЬреЛрдбреА: HPA pods рд╡рд╛рдврд╡рддреЛ, рдЖрдгрд┐ pods рдмрд╕реЗрдирд╛рд╕реЗ рдЭрд╛рд▓реЗ рдХреА cluster autoscaler ASG рдХрдбреЗ рдмрд╛рдХ рдорд╛рдЧрддреЛ.
ЁЯдФ рдХрд╛
рд╣рд╛ рдзрдбрд╛ course рдЪрд╛ рдкреНрд░рдмрдВрдз рд╕рд┐рджреНрдз рдХрд░рддреЛ: рдУрд│рдЦ (рднрд╛рдЧ 1) рдЖрдгрд┐ compute (рднрд╛рдЧ 2) metadata рдбреНрд░реЙрд╡рд░рдордзреНрдпреЗ рднреЗрдЯрддрд╛рдд, рдЖрдгрд┐ "cattle, not pets" рдпрд╛рдВрддреНрд░рд┐рдХ рдмрдирддреЗ тАФ templates + checklists
- рддрд╛рдлреНрдпрд╛рдЪреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ. рдЗрдереВрди рдкреБрдвреЗ EKS рдЪреЗ bill, NotReady node, рдХрд┐рдВрд╡рд╛ ECR рдордзреВрди pull рдХрд░реВ рди рд╢рдХрдгрд╛рд░рд╛ pod тАФ рдпрд╛ рд╕рдЧрд│реНрдпрд╛рдВрдЪрд╛ рддреБрдореНрд╣реА рдореВрд│ рддрддреНрддреНрд╡рд╛рдВрдкрд╛рд╕реВрди рд╡рд┐рдЪрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (~10 рдорд┐рдирд┐рдЯреЗ, ~1┬в тАФ рднрд╡реНрдп рд╢реЗрд╡рдЯ)
cd ec2 && terraform apply -var my_ip=$(curl -s ifconfig.me)/32
# 1) the checklist already worked:
curl http://$(terraform output -raw public_ip) # "set up by user-data, no human touched me"
# 2) shake hands with the metadata service FROM INSIDE the desk (via SSM):
aws ssm start-session --target $(aws ec2 describe-instances \
--filters Name=tag:Name,Values=school-desk Name=instance-state-name,Values=running \
--query 'Reservations[0].Instances[0].InstanceId' --output text)
# inside the session:
# TOKEN=$(curl -sX PUT http://169.254.169.254/latest/api/token -H "X-aws-ec2-metadata-token-ttl-seconds: 60")
# curl -sH "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/
# тЖТ school-desk-role тЖР the hat, fetched by the machine itself ЁЯОйЁЯдп
# exit
# 3) ЁЯз╣ always:
terraform destroy -var my_ip=$(curl -s ifconfig.me)/32
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
Auto Scaling Group рдордзрд▓рд╛ рдПрдХ рдмрд╛рдХ terminate рдХрд░рд╛; рдХрд╛рд╣реА рдорд┐рдирд┐рдЯрд╛рдВрдд describe-auto-scaling-groups рддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреА рдирд╡рд╛ рджрд╛рдЦрд╡рддреЛ тАФ рддрд╛рдлреНрдпрд╛рдЪреНрдпрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рдиреЗ рддреНрдпрд╛рдЪреЗ рдХрд╛рдо рдХреЗрд▓реЗ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдХрд╛рд╣реАрд╣реА рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛
terraform destroy тАФ desired=2 рд╡рд░ рд╕реЛрдбрд▓реЗрд▓рд╛ ASG рдореНрд╣рдгрдЬреЗ рд░рд╛рддреНрд░рднрд░ bill рд▓рд╛рд╡рдгрд╛рд░реЗ рджреЛрди рдмрд╛рдХ
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- packages рдЖрдзреАрдЪ рдЖрд╣реЗрдд рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рдгрд╛рд░рд╛ user-data тАФ рддреЛ рджрд░ рд╡реЗрд│реА рдирд╡реНрдпрд╛ box рд╡рд░ рдЪрд╛рд▓рддреЛ
- ASG рдордзрд▓рд╛ рдПрдХ instance рд╣рд╛рддрд╛рдиреЗ configure рдХрд░рдгреЗ (рддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреА рд╕реНрд╡рдЪреНрдЫ instance рдпреЗрдИрд▓)
- min = desired = max = 1 рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ high availability рдореНрд╣рдгрдгреЗ
ЁЯОУ рдкрд╛рдпрд╛ рдШрд╛рддрд▓рд╛ рдЧреЗрд▓рд╛
IAM: рдХрд╛рд░реНрдбреЗ, рдЪрд┐рдареНрдареНрдпрд╛, рдЯреЛрдкреНрдпрд╛, badges. EC2: рдмрд╛рдХ, рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреНрдпрд╛ рдпрд╛рджреНрдпрд╛, рдбреНрд░реЙрд╡рд░, templates, рддрд╛рдлреЗ. рдЖрддрд╛ рдирд╡реНрдпрд╛ рдирдЬрд░реЗрдиреЗ рдкреБрдиреНрд╣рд╛ рдлреЗрд░рдлрдЯрдХрд╛ рдорд╛рд░рд╛:
- ЁЯН▒ Docker & ECR тАФ рддреЛ 12 рддрд╛рд╕рд╛рдВрдЪрд╛ ECR pass? рдПрдХ IAM badge.
- тШ╕я╕П Kubernetes тАФ nodes? рддреБрдордЪреЗрдЪ рдмрд╛рдХ, рдПрдХрд╛ ASG рдордзреНрдпреЗ.
- ЁЯдЦ ArgoCD тАФ "credentials рдХрдзреАрдЪ cluster рд╕реЛрдбрдд рдирд╛рд╣реАрдд"? рдЦрд╛рд▓рдкрд░реНрдпрдВрдд рд╕рдЧрд│реАрдХрдбреЗ рдЯреЛрдкреНрдпрд╛рдЪ.
git checkout main