ЁЯЧДя╕П рдзрдбрд╛ 11 тАФ EBS, snapshots & AMIs: рдбреНрд░реЙрд╡рд░, photocopy, рдмрд╛рдХрд╛рдЪрд╛ template
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 11 ┬╖ рдорд╛рдЧреЗ: lesson-10-security-groups ┬╖ рдкреБрдвреЗ: lesson-12-ec2-in-real-life
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ10, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд: рдХрд╛рдп рдХрд╢рд╛рдирдВрддрд░рд╣реА рдЯрд┐рдХрддреЗ тАФ EC2 рдЪреА storage рдЪреА рдЧреЛрд╖реНрдЯ. рдЦрд░реА file:
- ec2/ec2.tf тАФ
root_block_device(8GB рдЪрд╛ рдбреНрд░реЙрд╡рд░) рдЖрдгрд┐ AMI lookup
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдлрд░реНрдирд┐рдЪрд░рдЪреЗ рддреАрди рддреБрдХрдбреЗ, рддреАрди рдЖрдпреБрд╖реНрдпреЗ:
рдбреНрд░реЙрд╡рд░ ЁЯЧДя╕П (EBS volume) тАФ рдмрд╛рдХрд╛рдЦрд╛рд▓реА рдкрдХреНрдХрд╛ рдмрд╕рд╡рд▓реЗрд▓рд╛, рддреБрдордЪреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ files рдареЗрд╡рддреЛ. рдмрд╛рдХ stop рдХрд░рд╛ (рдЬреЗрд╡рдгрд╛рдЪреА рд╕реБрдЯреНрдЯреА): рдбреНрд░реЙрд╡рд░ рд░рд╛рд╣рддреЛ. Reboot: рдбреНрд░реЙрд╡рд░ рд░рд╛рд╣рддреЛ. рд╣рд╛ рд╕реНрд╡рддрдГрдЪреЗ рдЖрдпреБрд╖реНрдп рдЕрд╕рд▓реЗрд▓рд╛ рдЦрд░рд╛ network-attached storage рдЖрд╣реЗ тАФ рддреЛ рдХрд╛рдвреВрди рджреБрд╕рд▒реНрдпрд╛ рдмрд╛рдХрд╛рдЦрд╛рд▓реАрд╣реА рдЬреЛрдбрддрд╛ рдпреЗрддреЛ. (рдУрд│рдЦрд▓реЗ? k8s course рдордзрд▓реЗ EKS рд╡рд░рдЪреЗ PersistentVolumes рдореНрд╣рдгрдЬреЗрдЪ рд╣реЗ рдбреНрд░реЙрд╡рд░ тАФ
PVC тЖТ EBS, рдЕрдХреНрд╖рд░рд╢рдГ.)Photocopy ЁЯУ╕ (snapshot) тАФ рдбреНрд░реЙрд╡рд░рдордзрд▓реНрдпрд╛ рд╕рд╛рдордЧреНрд░реАрдЪреА рдкреНрд░рдд, рд╕рдВрдЧреНрд░рд╣рд╛рдд (S3) рдареЗрд╡рд▓реЗрд▓реА. Incremental: рджреБрд╕рд░реА photocopy рдлрдХреНрдд рдмрджрд▓рд▓реЗрд▓реА рдкрд╛рдиреЗ copy рдХрд░рддреЗ. рдбреНрд░реЙрд╡рд░ рдореЗрд▓рд╛, region рд▓рд╛ рдЕрдбрдЪрдг рдЖрд▓реА, рдЪреБрдХреВрди
rm -rfрдЭрд╛рд▓реЗ? Photocopy рдордзреВрди рдирд╡рд╛ рдбреНрд░реЙрд╡рд░ restore рдХрд░рд╛. рд╣реАрдЪ backup рдЪреА рдЧреЛрд╖реНрдЯ.рдмрд╛рдХрд╛рдЪрд╛ template ЁЯЦ╝я╕П (AMI) тАФ рдЧреЛрдард╡рд▓реЗрд▓рд╛ рд╕рдВрдкреВрд░реНрдг рдмрд╛рдХ: рдбреНрд░реЙрд╡рд░рдордзрд▓реА рд╕рд╛рдордЧреНрд░реА
- settings. рдПрдХрд╛ template рдордзреВрди 1 рдХрд┐рдВрд╡рд╛ 100 рдПрдХрд╕рд╛рд░рдЦреЗ рдмрд╛рдХ рдЫрд╛рдкрд╛.
ec2.tfAmazon рдЪреНрдпрд╛al2023template рдордзреВрди boot рд╣реЛрддреЛ; рдХрдВрдкрдиреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреЗ рдмрдирд╡рддрд╛рдд ("рдЖрдордЪрд╛ рдореВрд│ рдмрд╛рдХ: patched, agents installed, logo рдЪрд╛ wallpaper").
- settings. рдПрдХрд╛ template рдордзреВрди 1 рдХрд┐рдВрд╡рд╛ 100 рдПрдХрд╕рд╛рд░рдЦреЗ рдмрд╛рдХ рдЫрд╛рдкрд╛.
рдУрд│рдЦреАрдЪреЗ рд╡рд╛рдЯрддреЗ? AMI : instance = image : container тАФ Docker course рдЪреА рдбрдмреНрдпрд╛рдЪреА рдЧреЛрд╖реНрдЯ, рдлрдХреНрдд рдЬрдб рдлрд░реНрдирд┐рдЪрд░. ЁЯН▒тЖТЁЯЦея╕П
рдПрдХ рд╕рд╛рдкрд│рд╛: рдХрд╛рд╣реА рдмрд╛рдХрд╛рдВрдирд╛ рдЕрдВрдЧрднреВрдд рдХрдЪреНрдЪреЗ рдлрд│ рдЕрд╕рддреЗ (instance store) рдЬреЗ рдмрд╛рдХ stop рдЭрд╛рд▓рд╛ рдХреА рдкреБрд╕рд▓реЗ рдЬрд╛рддреЗ. рд╡реЗрдЧрд╡рд╛рди, рддрд╛рддреНрдкреБрд░рддреНрдпрд╛ files рд╕рд╛рдареА рдареАрдХ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рд┐рдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХрд╢рд╛рд╕рд╛рдареАрд╣реА рдХрдзреАрдЪ рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
desk["ЁЯЦея╕П instance<br/>disposable"]
ebs["ЁЯЧДя╕П EBS volume<br/>survives stop/reboot<br/>detachable, re-attachable"]
snap["ЁЯУ╕ snapshot in S3<br/>incremental photocopies<br/>restore anywhere"]
ami["ЁЯЦ╝я╕П AMI - desk template<br/>drawer + settings, frozen"]
fleet["ЁЯЦея╕ПЁЯЦея╕ПЁЯЦея╕П 100 identical desks"]
desk ---|"1 bolted under"| ebs
ebs -->|"2 backup"| snap
snap -->|"3 becomes"| ami
ami -->|"4 stamps out"| fleet
тЭУ рдХрд╛рдп
- EBS: network-attached block storage, рдкреНрд░рддрд┐ GB-month bill (gp3 рд╕рд╛рдареА ~$0.08/GB тАФ рдЖрдкрд▓рд╛ 8GB рдЪрд╛ рдбреНрд░реЙрд╡рд░ тЙИ 64┬в/month stopped рдЕрд╕рддрд╛рдирд╛рд╣реА; terminate рдХреЗрд▓реНрдпрд╛рд╡рд░ рддреЛ рдореБрд│рд╛рдд delete рд╣реЛрддреЛ).
- Snapshot: incremental, рд╕реНрд╡рднрд╛рд╡рддрдГрдЪ cross-AZ, regions рдордзреНрдпреЗ copy рдХрд░рддрд╛ рдпреЗрдгрд╛рд░рд╛ тАФ DR рдЪрд╛ рдкрд╛рдпрд╛рднреВрдд рджрдЧрдб. Lifecycle policies (Data Lifecycle Manager) рдиреЗ automate рдХрд░рд╛ тАФ рдкреБрдиреНрд╣рд╛ рд╕рдлрд╛рдИ рдХрд░реНрдордЪрд╛рд░реА! ЁЯз╣
- AMI = snapshot(s) + launch metadata. Region рдкреБрд░рддрд╛ рдорд░реНрдпрд╛рджрд┐рдд; copy рдХрд░рддрд╛ рдпреЗрддреЛ. "Golden AMI" pipelines рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░ patched templates рдмрдирд╡рддрд╛рдд.
- Instance store = рдкреНрд░рддреНрдпрдХреНрд╖ рдЬреЛрдбрд▓реЗрд▓реА NVMe рдХрдЪреНрдЪреА рдЬрд╛рдЧрд╛: рд╕рд░реНрд╡рд╛рдд рд╡реЗрдЧрд╡рд╛рди, рдЖрдгрд┐ stop рд╣реЛрддрд╛рдЪ рдирд╛рд╣реАрд╢реА. Disk рд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рдгреНрдпрд╛рдЖрдзреА type рдЪреА рдорд╛рд╣рд┐рддреА рд╡рд╛рдЪрд╛.
ЁЯдФ рдХрд╛
рд╣реА storage рдордзреВрди рдХрд╛рдврд▓реЗрд▓реА cattle-рд╡рд┐рд░реБрджреНрдз-pets рдЪреА рд░реЗрд╖рд╛ рдЖрд╣реЗ: рдмрд╛рдХ рд╡рд╛рдкрд░реВрди рдЯрд╛рдХрдгреНрдпрд╛рдЬреЛрдЧреЗ, рдбреНрд░реЙрд╡рд░ рдЯрд┐рдХрд╛рдК, рдЖрдкрддреНрддреАрдВрд╕рд╛рдареА photocopies, рддрд╛рдлреНрдпрд╛рдВрд╕рд╛рдареА templates. рдкреНрд░рддреНрдпреЗрдХ "рдЖрдордЪрд╛ data рдЧреЗрд▓рд╛" рд╣реА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ рдХреЛрдгреАрддрд░реА рдПрдХрд╛ рдЖрдпреБрд╖реНрдпрд╛рд▓рд╛ рджреБрд╕рд░реЗ рд╕рдордЬрд▓реЗрд▓реЗ рдЕрд╕рддреЗ тАФ рдмрд╣реБрддреЗрдХрджрд╛ instance store рд▓рд╛ рдбреНрд░реЙрд╡рд░, рдХрд┐рдВрд╡рд╛ "AMI рдореНрд╣рдгрдЬреЗ рдЬрд╡рд│рдЬрд╡рд│ backup рдЪ" (рддрд╕реЗ рдирд╛рд╣реА; snapshots backup рдЖрд╣реЗрдд).
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (~10 рдорд┐рдирд┐рдЯреЗ, ~1┬в)
cd ec2 && terraform apply -var my_ip=$(curl -s ifconfig.me)/32
# meet the drawer:
VOL=$(aws ec2 describe-instances --filters Name=tag:Name,Values=school-desk \
--query 'Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId' --output text)
aws ec2 describe-volumes --volume-ids $VOL \
--query 'Volumes[0].{size:Size,type:VolumeType,az:AvailabilityZone}'
# photocopy it:
SNAP=$(aws ec2 create-snapshot --volume-id $VOL --description "lesson-11 photocopy" \
--query SnapshotId --output text)
aws ec2 describe-snapshots --snapshot-ids $SNAP --query 'Snapshots[0].{state:State,progress:Progress}'
# which template did we boot from?
aws ec2 describe-instances --filters Name=tag:Name,Values=school-desk \
--query 'Reservations[0].Instances[0].ImageId'
# ЁЯз╣ cleanup тАФ desk AND photocopy:
terraform destroy -var my_ip=$(curl -s ifconfig.me)/32
aws ec2 delete-snapshot --snapshot-id $SNAP
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
stop/start рдирдВрддрд░ EBS volume рдордзреНрдпреЗ рддреБрдореНрд╣реА рд▓рд┐рд╣рд┐рд▓реЗрд▓реА file рдЕрдЬреВрдирд╣реА рддрд┐рдереЗрдЪ рдЕрд╕рддреЗ; aws ec2 describe-snapshots --owner-ids self рддреБрдордЪреА photocopy рджрд╛рдЦрд╡рддреЛ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдХрд╛рд╣реАрд╣реА рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛
terraform destroy, рдордЧ snapshot delete рдХрд░рд╛ рдЖрдгрд┐ AMI deregister рдХрд░рд╛ тАФ рд╡рд╛рд▒реНрдпрд╛рд╡рд░ рд╕реЛрдбрд▓реЗрд▓реНрдпрд╛ photocopies рдЪреЗ bill GB-month рдиреЗ рдпреЗрддреЗ
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- instance store stop рдирдВрддрд░рд╣реА рдЯрд┐рдХрддреЛ рдЕрд╕реЗ рд╕рдордЬрдгреЗ тАФ рдЯрд┐рдХрдд рдирд╛рд╣реА
- lifecycle рд╢рд┐рд╡рд╛рдп рд╕рд╛рдЪрдд рдЬрд╛рдгрд╛рд░реЗ snapshots тАФ рджрд░ рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛
describe-snapshotsрддрдкрд╛рд╕рд╛ - рдЖрдд secrets рдареЗрд╡реВрди рдмрдирд╡рд▓реЗрд▓рд╛ AMI (рдзрдбрд╛ 06 images рд▓рд╛рд╣реА рд▓рд╛рдЧреВ рд╣реЛрддреЛ)
тПня╕П рдкреБрдвреЗ
рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛: рд╕реНрд╡рддрдГрдЪ рд╕реНрд╡рддрдГрд▓рд╛ setup рдХрд░рдгрд╛рд░реЗ, рд╕реНрд╡рддрдГрд▓рд╛ badge рд▓рд╛рд╡рдгрд╛рд░реЗ, рдЖрдгрд┐ рддрд╛рдлреНрдпрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдврдгрд╛рд░реЗ рдмрд╛рдХ тАФ рдЖрдгрд┐ EKS nodes рдЦрд░реЗ рдХрд╛рдп рдЖрд╣реЗрдд рд╣реЗ рдУрд│рдЦрдгреНрдпрд╛рдЪрд╛ рдХреНрд╖рдг.
git checkout lesson-12-ec2-in-real-life