ЁЯЦ╝я╕П рдзрдбрд╛ 03 тАФ AMIs рдЖрдгрд┐ launch templates: рдбреЗрд╕реНрдХрдЪрд╛ рд╕рд╛рдЪрд╛ рдЖрдгрд┐ recipe card
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-instance-types ┬╖ рдкреБрдвреЗ: lesson-04-storage
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ instance рдХрд╢рд╛рдкрд╛рд╕реВрди рдмрдирддреЛ рддреЗ: AMI (рдбреЗрд╕реНрдХрдЪрд╛ рд╕рд╛рдЪрд╛), launch template (AMI, type, disk, badge рдЖрдгрд┐ рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рдпрд╛рджреА рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ recipe card), рдЖрдгрд┐ user data тАФ рдкрд╣рд┐рд▓реНрдпрд╛ boot рдЪреА script, ec2/templates/user-data.sh. Recipe card рд╕реНрд╡рддрдГ ec2/templates/web.json рдЖрд╣реЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЕрднреНрдпрд╛рд╕рд┐рдХреЗрдд рдирд╡рд╛ рдбреЗрд╕реНрдХ рдЖрд▓рд╛ рдХреА рддреЛ рд╢реВрдиреНрдпрд╛рдкрд╛рд╕реВрди рддрдпрд╛рд░ рдХрд░рд╛рдпрд▓рд╛ рдХреЛрдгрд╛рд▓рд╛рдЪ рдЖрд╡рдбрдд рдирд╛рд╣реА: рджрд┐рд╡рд╛ рдмрд╕рд╡рд╛, stationery рдареЗрд╡рд╛, рднрд┐рдВрддреАрд╡рд░ рд╡реЗрд│рд╛рдкрддреНрд░рдХ рдЪрд┐рдХрдЯрд╡рд╛. рдореНрд╣рдгреВрди рдХрдВрдкрдиреА рдПрдХ рдбреЗрд╕реНрдХрдЪрд╛ рд╕рд╛рдЪрд╛ ЁЯЦ╝я╕П рдареЗрд╡рддреЗ тАФ рдЕрдЧрджреА рдлреЛрдЯреЛрд╕рд╛рд░рдЦрд╛ рдкрд░рд┐рдкреВрд░реНрдг, рдЖрдзреАрдЪ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓рд╛ рдбреЗрд╕реНрдХ. рдкреНрд░рддреНрдпреЗрдХ рдирд╡рд╛ рдбреЗрд╕реНрдХ рддреНрдпрд╛рдЪреА рдирдХреНрдХрд▓ рдХрд░реВрди рдмрдирддреЛ. рддреЛ рд╕рд╛рдЪрд╛ рдореНрд╣рдгрдЬреЗ AMI (Amazon Machine Image).
рдордЧ рднрд┐рдВрддреАрд╡рд░ рд▓рд╛рд╡рд▓реЗрд▓реЗ рдПрдХ recipe card ЁЯУЗ рдЕрд╕рддреЗ: "рдПрдХ t4g.small рдбреЗрд╕реНрдХ, ami-0abcтАж рд╕рд╛рдЪреНрдпрд╛рд╡рд░реВрди рдирдХреНрдХрд▓ рдХреЗрд▓реЗрд▓рд╛, 16 GB рдбреНрд░реЙрд╡рд░рд╕рд╣, рд╣рд╛ badge, рд╣реА рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рдпрд╛рджреА тАФ рдЖрдгрд┐ рддреЛ рдирд╡рд╛ рдЕрд╕рддрд╛рдирд╛ рдпрд╛ рддреАрди рдкрд╛рдпрд▒реНрдпрд╛ рдПрдХрджрд╛ рдЪрд╛рд▓рд╡рд╛". рддреЗ card рдореНрд╣рдгрдЬреЗ launch template. "рдпрд╛ рдкрд╛рдпрд▒реНрдпрд╛ рдПрдХрджрд╛ рдЪрд╛рд▓рд╡рд╛" рд╣рд╛ рднрд╛рдЧ рдореНрд╣рдгрдЬреЗ user data.
Card рдХрд╢рд╛рд╕рд╛рдареА? рдХрд╛рд░рдг рджрд╣рд╛рд╡рд╛ рдбреЗрд╕реНрдХ рдкрд╣рд┐рд▓реНрдпрд╛рд╕рд╛рд░рдЦрд╛рдЪ рд╣реБрдмреЗрд╣реВрдм рдЕрд╕рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ. рдПрдЦрд╛рджрд╛ рдбреЗрд╕реНрдХ рдмрд┐рдШрдбрд▓рд╛ рддрд░ рддреБрдореНрд╣реА рддреЛ рдПрдХреЗрдХ screw рдХрд░реВрди рджреБрд░реБрд╕реНрдд рдХрд░рдд рдирд╛рд╣реА тАФ рддреЛ рдлреЗрдХреВрди рджреЗрдКрди card рд╡рд░реВрди рдирд╡рд╛ рдмрдирд╡рддрд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
ami["ЁЯЦ╝я╕П AMI ami-0abc1234example<br/>OS + software, arm64"]
lt["ЁЯУЗ launch template web.json<br/>t4g.small ┬╖ 16 GB gp3 ┬╖ badge school-web ┬╖ sg-0web"]
ud["ЁЯУЬ user-data.sh<br/>dnf install nginx ┬╖ write index.html ┬╖ enable nginx"]
d1["ЁЯЦея╕П desk 1"]
d2["ЁЯЦея╕П desk 2"]
d3["ЁЯЦея╕П desk 3"]
ami -->|"1 copied from"| lt
ud -->|"2 runs once, as root, first boot"| lt
lt -->|"3 launch"| d1
lt --> d2
lt --> d3
same["тЬЕ every desk identical тАФ broken? replace, never repair manually"]
d3 -.-> same
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/ec2/lesson-diagrams.html#l03
тЭУ рдХрд╛рдп
- AMI тАФ boot рдХрд░рдгреНрдпрд╛рд╕рд╛рдареАрдЪреА image: root volume рдЪрд╛ snapshot (рдзрдбрд╛ 04)
рдЖрдгрд┐ metadata (architecture
x86_64рдХрд┐рдВрд╡рд╛arm64, boot mode, block device mapping, рддреА рдХреЛрдг launch рдХрд░реВ рд╢рдХрддреЛ). AMIs regional рдЕрд╕рддрд╛рдд тАФ рддреЗрдЪ Amazon Linux рдкреНрд░рддреНрдпреЗрдХ Region рдордзреНрдпреЗ рд╡реЗрдЧрд│реНрдпрд╛ AMI ID рдиреЗ рдЕрд╕рддреЗ тАФ рдЖрдгрд┐ рддреБрдореНрд╣реА рд╕реНрд╡рддрдГрдЪреНрдпрд╛ AMIs рдЗрддрд░ Regions рдордзреНрдпреЗ copy рдХрд░реВ рд╢рдХрддрд╛. - AMIs рдХреБрдареВрди рдпреЗрддрд╛рдд тАФ AWS (Amazon Linux 2023, Windows), vendors (Ubuntu, Red Hat, Marketplace), рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА (рдПрдХ "golden" AMI, рдзрдбрд╛ 12). рдХрд╛рд▓рдмрд╛рд╣реНрдп рд╣реЛрдгрд╛рд░рд╛ ID hard-code рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА рдирд╡реАрдирддрдо Amazon Linux рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ SSM parameters рдордзреВрди рд╢реЛрдзрд╛.
- Launch template тАФ versions рдЕрд╕рд▓реЗрд▓реА recipe:
ImageId,InstanceType,IamInstanceProfile(badge, рдзрдбрд╛ 07),SecurityGroupIds(рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рдпрд╛рджреА, рдзрдбрд╛ 05),BlockDeviceMappings(disks, рдзрдбрд╛ 04),MetadataOptions, tags рдЖрдгрд┐UserData. рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓рд╛рдиреЗ рдирд╡реА version рдмрдирддреЗ; рддреБрдореНрд╣реА рдЧреЛрд╖реНрдЯреА$LatestрдХрд┐рдВрд╡рд╛$DefaultрдХрд┐рдВрд╡рд╛ рдПрдЦрд╛рджреНрдпрд╛ рдХреНрд░рдорд╛рдВрдХрд╛рдХрдбреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛. Auto Scaling (рдзрдбрд╛ 09) рдПрдХрд╛ template рд╡рд░реВрди launch рдХрд░рддреЗ. - User data тАФ рдПрдХ script (рдХрд┐рдВрд╡рд╛ cloud-init config) рдЬреА default рдиреБрд╕рд╛рд░ рдкрд╣рд┐рд▓реНрдпрд╛ boot рд▓рд╛, root рдореНрд╣рдгреВрди, рдПрдХрджрд╛рдЪ рдЪрд╛рд▓рддреЗ. Launch template рдордзреНрдпреЗ рддреА base64-encoded рдЕрд╕рд╛рд╡реА рд▓рд╛рдЧрддреЗ; рдореВрд│ script рдЪреА рдорд░реНрдпрд╛рджрд╛ 16 KB рдЖрд╣реЗ. Instance рдЪреЗ attributes рд╡рд╛рдЪреВ рд╢рдХрдгрд╛рд░рд╛ рдХреЛрдгреАрд╣реА рддреА рд╡рд╛рдЪреВ рд╢рдХрддреЛ тАФ рдореНрд╣рдгреВрди user data рдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА secrets рдирдХреЛрдд.
- Bake рд╡рд┐рд░реБрджреНрдз bootstrap тАФ рдЧреЛрд╖реНрдЯреА AMI рдордзреНрдпреЗ рдареЗрд╡рд╛ (рдЬрд▓рдж boot, рдХрд╛рд│рд╛рдд рдЧреЛрдард▓реЗрд▓реЗ) рдХрд┐рдВрд╡рд╛ user data рдордзреНрдпреЗ install рдХрд░рд╛ (рдиреЗрд╣рдореА рддрд╛рдЬреЗ, boot рдордВрдж). рдмрд╣реБрддреЗрдХ teams рджреЛрдиреНрд╣реА рдХрд░рддрд╛рдд: bake рдХреЗрд▓реЗрд▓рд╛ рдкрд╛рдпрд╛, рдЖрдгрд┐ рдЫреЛрдЯрд╛ bootstrap.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рд╣рд╛рддрд╛рдиреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓рд╛ server рдкреБрдиреНрд╣рд╛ рдХреЛрдгрд╛рд▓рд╛рдЪ рдмрдирд╡рддрд╛ рдпреЗрдд рдирд╛рд╣реА. Recipe card рдореБрд│реЗ рджрд╣рд╛рд╡рд╛ рдбреЗрд╕реНрдХ рдкрд╣рд┐рд▓реНрдпрд╛рд╕рд╛рд░рдЦрд╛рдЪ рдмрдирддреЛ, Auto Scaling рддреБрдордЪреНрдпрд╛рд╢рд┐рд╡рд╛рдп рд░рд╛рддреНрд░реА 3 рд╡рд╛рдЬрддрд╛ рдбреЗрд╕реНрдХ рдмрдирд╡реВ рд╢рдХрддреЗ, рдЖрдгрд┐ "рдмрд┐рдШрдбрд▓реЗрд▓рд╛ рдбреЗрд╕реНрдХ рджреБрд░реБрд╕реНрдд рдХрд░рд╛" рдЪреЗ рд░реВрдкрд╛рдВрддрд░ "рддреЛ рдмрджрд▓рд╛" рдордзреНрдпреЗ рд╣реЛрддреЗ тАФ рдзрдбрд╛ 09 рдЖрдгрд┐ рдзрдбрд╛ 12 рдорд╛рдЧрдЪреА рд╣реАрдЪ рд╕рд╡рдп.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
ec2/demo.py рдордзрд▓реЗ launch()
ec2/templates/web.json рдЙрдШрдбрддреЗ тАФ рдЬреА AWS CLI рд▓рд╛ рджрд┐рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд▒реНрдпрд╛
--launch-template-data рд╕рд╛рд░рдЦреАрдЪ рд░рдЪрд▓реЗрд▓реА рдЖрд╣реЗ тАФ рдореБрдЦреНрдп fields рдЫрд╛рдкрддреЗ, рдордЧ
рдкрд╣рд┐рд▓реНрдпрд╛ boot рдЪреА script ec2/templates/user-data.sh рдЫрд╛рдкрддреЗ.
ImageId рд╣рд╛ placeholder рдЖрд╣реЗ (ami-0abc1234example) рдЖрдгрд┐ UserData рдордзреНрдпреЗ
(base64 of user-data.sh) рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ: рдЦрд▒реНрдпрд╛ account рд╡рд░ рддреБрдореНрд╣реА рджреЛрдиреНрд╣реА рдмрджрд▓рддрд╛.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 ec2/demo.py launch
python3 - <<'EOF'
import base64, json
t = json.load(open("ec2/templates/web.json"))
print("disk:", t["BlockDeviceMappings"][0]["Ebs"])
print("metadata:", t["MetadataOptions"])
print("tags:", t["TagSpecifications"][0]["Tags"])
# a launch template wants UserData base64-encoded тАФ this is what replaces the placeholder
ud = base64.b64encode(open("ec2/templates/user-data.sh", "rb").read()).decode()
print("UserData:", ud[:40] + "тАж", f"({len(ud)} characters)")
EOF
рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS credentials рд▓рд╛рдЧрддрд╛рдд; run-instances рдиреЗ billing рд╕реБрд░реВ рд╣реЛрддреЗ тАФ
рдирдВрддрд░ terminate рдХрд░рд╛). рдЖрдзреА web.json рдЪреНрдпрд╛ рдПрдХрд╛ copy рдордзреНрдпреЗ рдЦрд░рд╛ arm64 AMI ID, рдЦрд░рд╛ security group
ID рдЖрдгрд┐ base64 user data рдЯрд╛рдХрд╛, рдЖрдгрд┐ school-web instance profile рдмрдирд╡рд╛ (рдзрдбрд╛ 07) тАФ
рдХрд┐рдВрд╡рд╛ рд╕рдзреНрдпрд╛ рддреА рдУрд│ рдХрд╛рдвреВрди рдЯрд╛рдХрд╛:
aws ssm get-parameter \
--name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-arm64 \
--query Parameter.Value --output text
aws ec2 create-launch-template --launch-template-name school-web \
--launch-template-data file://my-web.json
aws ec2 run-instances --launch-template 'LaunchTemplateName=school-web,Version=$Latest' --count 1
aws ec2 terminate-instances --instance-ids i-0123456789abcdef0
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
launch рдЫрд╛рдкрддреЗ ImageId "ami-0abc1234example",
InstanceType "t4g.small", IamInstanceProfile {"Name": "school-web"},
SecurityGroupIds ["sg-0web"], рдордЧ
UserData (runs once, as root, on first boot): рдЦрд╛рд▓реА script рдЪреНрдпрд╛ рддреАрди рдУрд│реА тАФ dnf install -y nginx,
index.html рдордзреНрдпреЗ рдЬрд╛рдгрд╛рд░рд╛ echo, рдЖрдгрд┐ systemctl enable --now nginx. рддреБрдордЪрд╛ snippet
disk рдЫрд╛рдкрддреЛ ('VolumeSize': 16, 'VolumeType': 'gp3', 'Encrypted': True, 'DeleteOnTermination': True), metadata options
('HttpTokens': 'required', 'HttpPutResponseHopLimit': 1 тАФ рдзрдбрд╛ 07 рддреНрдпрд╛рдВрдЪреЗ
рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрддреЛ), tag 'Key': 'team', 'Value': 'maths', рдЖрдгрд┐
UserData: IyEvYmluL2Jhc2gKIyBSdW5zIE9OQ0UsIGFzIHJvтАж (328 characters).
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдПрдХ recipe card рдЖрдгрд┐ рдПрдХ рд╕рд╛рдЪрд╛ рдбреЗрд╕реНрдХрдЪреЗ рдкреВрд░реНрдг рд╡рд░реНрдгрди рдХрд░рддрд╛рдд тАФ рддреБрдореНрд╣реА рддреНрдпрд╛рдЪреА рдкреНрд░рддреНрдпреЗрдХ рдУрд│ рд╡рд╛рдЪрд▓реА, рдкрд╣рд┐рд▓реНрдпрд╛ boot рд▓рд╛ рдПрдХрджрд╛ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ script рд╕рд╣, рдЖрдгрд┐ рдЦрд▒реНрдпрд╛ launch template рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░рд╛ рдиреЗрдордХрд╛ base64 рддрдпрд╛рд░ рдХреЗрд▓рд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- scripts рдордзреНрдпреЗ AMI ID hard-code рдХрд░рдгреЗ тАФ рддреЛ рдкреНрд░рддреНрдпреЗрдХ Region рдордзреНрдпреЗ рд╡реЗрдЧрд│рд╛ рдЕрд╕рддреЛ рдЖрдгрд┐ рдХрд╛рд▓рдмрд╛рд╣реНрдп рд╣реЛрддреЛ; SSM parameter рд╡рд╛рдЪрд╛
arm64instance type (t4g,m7g) рд╕реЛрдмрддx86_64AMI, рдХрд┐рдВрд╡рд╛ рдЙрд▓рдЯ тАФ launch рдЕрдкрдпрд╢реА рдард░рддреЗ- user data рдордзреНрдпреЗ passwords рдХрд┐рдВрд╡рд╛ keys рдареЗрд╡рдгреЗ тАФ рддреА рд╡рд╛рдЪрддрд╛ рдпреЗрдгрд╛рд░реА metadata рдЖрд╣реЗ, рддрд┐рдЬреЛрд░реА рдирд╛рд╣реА
- user data рдкреНрд░рддреНрдпреЗрдХ reboot рд▓рд╛ рдЪрд╛рд▓реЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдгреЗ тАФ default рдиреБрд╕рд╛рд░ рддреА рдлрдХреНрдд рдкрд╣рд┐рд▓реНрдпрд╛ boot рд▓рд╛ рдЪрд╛рд▓рддреЗ
- launch рдирдВрддрд░ рдбреЗрд╕реНрдХ рд╣рд╛рддрд╛рдиреЗ рджреБрд░реБрд╕реНрдд рдХрд░рдгреЗ, рдЬреНрдпрд╛рдореБрд│реЗ recipe card рдЖрддрд╛ рдЦрд░реЗ рд╕рд╛рдВрдЧрдд рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: Auto Scaling, instance refresh рдЖрдгрд┐ disaster recovery рд╣реЗ рд╕рдЧрд│реЗ launch template рд╣реЗрдЪ рдбреЗрд╕реНрдХрдмрджреНрджрд▓рдЪреЗ рдкреВрд░реНрдг рд╕рддреНрдп рдЖрд╣реЗ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рддрд╛рдд. Teams рддреЗ code рдордзреНрдпреЗ рдареЗрд╡рддрд╛рдд (CloudFormation, Terraform, CDK), code рд╕рд╛рд░рдЦреЗрдЪ review рдХрд░рддрд╛рдд, рдЖрдгрд┐ "рдлрдХреНрдд рдПрдХ рдЧреЛрд╖реНрдЯ рджреБрд░реБрд╕реНрдд рдХрд░рд╛рдпрд▓рд╛" рдХрдзреАрдЪ login рдХрд░рдд рдирд╛рд╣реАрдд.
тПня╕П рдкреБрдвреЗ
рдбреЗрд╕реНрдХрд▓рд╛ рдПрдХ рдбреНрд░реЙрд╡рд░, рдПрдХ рдЦрд░рдбрд╡рд╣реА рдЖрдгрд┐ hall рдЪреНрдпрд╛ рдЯреЛрдХрд╛рд▓рд╛ рдПрдХ photocopier рдЖрд╣реЗ тАФ рдЖрдгрд┐ рддреЗ рдЕрдЧрджреА рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрдирдВрддрд░ рдЯрд┐рдХрддрд╛рдд. Storage: EBS рдЖрдгрд┐ snapshots.
git checkout lesson-04-storage