ЁЯПл The SchoolтА║ЁЯкк AWSтА║ЁЯдЦ рдзрдбрд╛ 12 тАФ рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рддреАрд▓ EC2: checklists, badges, рдЖрдгрд┐ рддрд╛рдлреЗ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯдЦ рдзрдбрд╛ 12 тАФ рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рддреАрд▓ EC2: checklists, badges, рдЖрдгрд┐ рддрд╛рдлреЗ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 12 тАФ рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛! ┬╖ рдорд╛рдЧреЗ: lesson-11-ebs-snapshots-ami


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рд╕рдЧрд│реЗ 12 рдзрдбреЗ тАФ рд╕рдВрдкреВрд░реНрдг course. рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛ IAM рдЖрдгрд┐ EC2 рдПрдХрд╛ machine рдордзреНрдпреЗ рдмрд╛рдВрдзрддреЛ, рдЖрдгрд┐ рдордЧ рдЗрддрд░ courses рдордзреНрдпреЗ рддреБрдореНрд╣реА рдЖрддрд╛рдкрд░реНрдпрдВрдд рдХрд╛рдп рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрдд рд╣реЛрддрд╛ рддреЗ рдЙрдШрдб рдХрд░рддреЛ. рдЦрд▒реНрдпрд╛ files:

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рддреАрди рдпреБрдХреНрддреНрдпрд╛ рд╣рд╛рддрд╛рдиреЗ рд╕рд╛рдВрднрд╛рд│рд▓реЗрд▓реНрдпрд╛ рдПрдХрд╛ рдмрд╛рдХрд╛рд▓рд╛ рдЖрдкреЛрдЖрдк рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рддрд╛рдлреНрдпрд╛рдд рдмрджрд▓рддрд╛рдд:

  1. Boot рдЪреА checklist ЁЯУЛ (user-data). рдкреНрд░рддреНрдпреЗрдХ рдирд╡реНрдпрд╛ рдмрд╛рдХрд╛рд▓рд╛ рдЪрд┐рдХрдЯрд╡рд▓реЗрд▓реА: "рдкрд╣рд┐рд▓реНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛: nginx install рдХрд░рд╛, рд╕реНрд╡рд╛рдЧрдд рдкрд╛рди рд▓рд╛рд╡рд╛, рд╕реЗрд╡рд╛ рджреЗрдгреЗ рд╕реБрд░реВ рдХрд░рд╛." рдмрд╛рдХ рд╕реНрд╡рддрдГрдЪ рд╕реНрд╡рддрдГрд▓рд╛ setup рдХрд░рддреЛ тАФ рдореНрд╣рдгреВрдирдЪ рдзрдбрд╛ 07 рдЪрд╛ instance рддреБрдореНрд╣реА рд╣рд╛рдд рд▓рд╛рд╡рдгреНрдпрд╛рдЖрдзреАрдЪ web server рд╣реЛрддрд╛. рдорд╛рдгреВрд╕ рдирд╛рд╣реА, drift рдирд╛рд╣реА, рдЖрдгрд┐ checklist git рдордзреНрдпреЗ рд░рд╛рд╣рддреЗ (user-data.sh).

  2. Badge рдЪреА рдЦрд╛рдЪ ЁЯОй (metadata service). рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдХрд╛рдЪреНрдпрд╛ рдЖрдд, 169.254.169.254 рдпрд╛ рдЬрд╛рджреБрдИ рдкрддреНрддреНрдпрд╛рд╡рд░, рдПрдХ рдЫреЛрдЯрд╛ рдбреНрд░реЙрд╡рд░ рдЕрд╕рддреЛ рдЬреНрдпрд╛рд▓рд╛ machine рд╡рд┐рдЪрд╛рд░реВ рд╢рдХрддреЗ: "рдореА рдХреЛрдг рдЖрд╣реЗ? рдорд╛рдЭрд╛ IP рдХрд╛рдп? тАжрдЖрдгрд┐ рдорд▓рд╛ рдЖрдЬрдЪреА credentials рдорд┐рд│рддреАрд▓ рдХрд╛?" тАФ рдмрд╛рдХрд╛рдЪреНрдпрд╛ IAM рдЯреЛрдкреАрд╕рд╛рдареА рддрд╛рдЬреА рддрд╛рддреНрдкреБрд░рддреА creds (рдзрдбрд╛ 05, рдЖрддрд╛ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд). рд╣реЗ IAM рдЖрдгрд┐ EC2 рдЪреЗ рд╣рд╕реНрддрд╛рдВрджреЛрд▓рди рдЖрд╣реЗ. Disk рд╡рд░ keys рдирд╛рд╣реАрдд, рдХреБрдареЗрд╣реА.

  3. рддрд╛рдлреНрдпрд╛рдЪрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ ЁЯСп (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

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рд╣рд╛ рдзрдбрд╛ course рдЪрд╛ рдкреНрд░рдмрдВрдз рд╕рд┐рджреНрдз рдХрд░рддреЛ: рдУрд│рдЦ (рднрд╛рдЧ 1) рдЖрдгрд┐ compute (рднрд╛рдЧ 2) metadata рдбреНрд░реЙрд╡рд░рдордзреНрдпреЗ рднреЗрдЯрддрд╛рдд, рдЖрдгрд┐ "cattle, not pets" рдпрд╛рдВрддреНрд░рд┐рдХ рдмрдирддреЗ тАФ templates + checklists

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (~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 рд▓рд╛рд╡рдгрд╛рд░реЗ рджреЛрди рдмрд╛рдХ

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯОУ рдкрд╛рдпрд╛ рдШрд╛рддрд▓рд╛ рдЧреЗрд▓рд╛

IAM: рдХрд╛рд░реНрдбреЗ, рдЪрд┐рдареНрдареНрдпрд╛, рдЯреЛрдкреНрдпрд╛, badges. EC2: рдмрд╛рдХ, рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреНрдпрд╛ рдпрд╛рджреНрдпрд╛, рдбреНрд░реЙрд╡рд░, templates, рддрд╛рдлреЗ. рдЖрддрд╛ рдирд╡реНрдпрд╛ рдирдЬрд░реЗрдиреЗ рдкреБрдиреНрд╣рд╛ рдлреЗрд░рдлрдЯрдХрд╛ рдорд╛рд░рд╛:

  1. ЁЯН▒ Docker & ECR тАФ рддреЛ 12 рддрд╛рд╕рд╛рдВрдЪрд╛ ECR pass? рдПрдХ IAM badge.
  2. тШ╕я╕П Kubernetes тАФ nodes? рддреБрдордЪреЗрдЪ рдмрд╛рдХ, рдПрдХрд╛ ASG рдордзреНрдпреЗ.
  3. ЁЯдЦ ArgoCD тАФ "credentials рдХрдзреАрдЪ cluster рд╕реЛрдбрдд рдирд╛рд╣реАрдд"? рдЦрд╛рд▓рдкрд░реНрдпрдВрдд рд╕рдЧрд│реАрдХрдбреЗ рдЯреЛрдкреНрдпрд╛рдЪ.
git checkout main

ЁЯдЦ Lesson 12 тАФ EC2 in real life: checklists, badges, and fleets

ЁЯУН You are here: Lesson 12 of 12 тАФ the final lesson! ┬╖ Previous: lesson-11-ebs-snapshots-ami


ЁЯУж What's in this branch

All 12 lessons тАФ the complete course. The finale ties IAM and EC2 into one machine, then reveals what you've been renting all along in the other courses. Real files:

ЁЯзТ Explain like I'm 5

Three tricks turn one hand-tended desk into a self-running fleet:

  1. The boot checklist ЁЯУЛ (user-data). Taped to every new desk: "on first start: install nginx, put up the welcome page, start serving." The desk sets ITSELF up тАФ that's why lesson 07's instance was a web server before you ever touched it. No human, no drift, and the checklist lives in git (user-data.sh).

  2. The badge slot ЁЯОй (metadata service). Inside every desk, at the magic address 169.254.169.254, is a little drawer the machine can ask: "who am I? what's my IP? тАжand may I have today's credentials?" тАФ fresh temporary creds for the desk's IAM hat (lesson 05, now physical). This is IAM and EC2 shaking hands. No keys on disk, anywhere.

  3. The fleet manager ЁЯСп (Auto Scaling Group). "There shall always be N desks, built from THIS template, spread across buildings." Desk dies тЖТ replaced. Load rises тЖТ more desks. Recognize the sentence? It's the k8s course's class monitor (lesson 03), one layer down тАФ ASGs are Deployments for computers.

And the curtain pull ЁЯОн: an EKS node group = an ASG of EC2 desks, baked from an EKS-flavored AMI, whose user-data says "join the school cluster", wearing a hat that allows pulling from ECR. Every course you've done was running on THIS lesson.

ЁЯЧ║я╕П Diagram

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

тЭУ What

ЁЯдФ Why

This lesson is the course's thesis proved: identity (Part 1) and compute (Part 2) meet in the metadata drawer, and "cattle, not pets" becomes mechanical тАФ templates + checklists + fleet managers. From here, the EKS bill, a NotReady node, or a pod that can't pull from ECR are all things you can reason about from first principles.

ЁЯзк Try it (~10 min, ~1┬в тАФ the grand finale)

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

тЬЕ Verify тАФ what you should see

terminate one desk in the Auto Scaling Group; within minutes describe-auto-scaling-groups shows a replacement тАФ the fleet manager did its job.

ЁЯз╣ Clean up тАФ do not leave running

terraform destroy тАФ an ASG left at desired=2 is two desks billing all night

тЪая╕П Common mistakes

ЁЯОУ The foundations are laid

IAM: cards, slips, hats, badges. EC2: desks, guest lists, drawers, templates, fleets. Now re-take the tour with new eyes:

  1. ЁЯН▒ Docker & ECR тАФ that 12-hour ECR pass? An IAM badge.
  2. тШ╕я╕П Kubernetes тАФ nodes? Your desks, in an ASG.
  3. ЁЯдЦ ArgoCD тАФ "credentials never leave the cluster"? Hats all the way down.
git checkout main
тЖР Previousebs snapshots amiNext тЖТvpc

This page is the lesson's README from the lesson-12-ec2-in-real-life branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.