ЁЯз▒ рдзрдбрд╛ 03 тАФ Subnets рдЖрдгрд┐ AZs: campus рдЪреЗ wings, рдкреНрд░рддреНрдпреЗрдХ рдПрдХрд╛ рдЗрдорд╛рд░рддреАрдд
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-cidr-ips ┬╖ рдкреБрдвреЗ: lesson-04-route-tables
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ wings: plan_subnets() рд╣реЗ 10.20.0.0/16 рдЪреЗ рдирдК /20
subnets рдХрд╛рдкрддреЗ тАФ рддреАрди tiers (public, app, data) ├Ч рддреАрди AZs тАФ рдЖрдгрд┐ vpc/network.py рдордзреАрд▓
reserved_addresses() / usable() рджрд╛рдЦрд╡рддрд╛рдд рдХреА AWS рдкреНрд░рддреНрдпреЗрдХ subnet рдордзреНрдпреЗ 5 рдкрддреНрддреЗ
рд╕реНрд╡рддрдГрдХрдбреЗ рдареЗрд╡рддреЛ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Campus рдПрдХрдЪ рдЙрдШрдбрд╛ рд╣реЙрд▓ рдЕрд╕рдгреНрдпрд╛рдЗрддрдХрд╛ рд▓рд╣рд╛рди рдирд╛рд╣реА. рдореНрд╣рдгреВрди рддреБрдореНрд╣реА wings ЁЯз▒ рдмрд╛рдВрдзрддрд╛: рдореБрдЦреНрдп рджрд░рд╡рд╛рдЬрд╛рдЬрд╡рд│ рдПрдХ public wing, рдЬрд┐рдереЗ рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛рдд рддреЛ рдПрдХ app wing, рдЖрдгрд┐ рдЬрд┐рдереЗ рдкрд░реАрдХреНрд╖реЗрдЪреЗ рдкреЗрдкрд░ рдХреБрд▓реБрдкрд╛рдд рдареЗрд╡рд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд рддреЛ рдПрдХ data wing.
Campus рдЪреНрдпрд╛ рдЬрдорд┐рдиреАрд╡рд░ рдПрдХрдореЗрдХрд╛рдВрдкрд╛рд╕реВрди рджреВрд░ рдЕрд╢рд╛ рддреАрди рдЗрдорд╛рд░рддреА ЁЯПвЁЯПвЁЯПв рдЖрд╣реЗрдд. рд╡рд╛рджрд│рд╛рдореБрд│реЗ рдПрдХ рдЗрдорд╛рд░рдд рдмрдВрдж рдЭрд╛рд▓реА, рддрд░реА рдЙрд░рд▓реЗрд▓реНрдпрд╛ рджреЛрди рдХрд╛рдо рдХрд░рдд рд░рд╛рд╣рддрд╛рдд. рдореНрд╣рдгреВрди рддреБрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ wing рддреАрди рд╡реЗрд│рд╛ рдмрд╛рдВрдзрддрд╛, рдкреНрд░рддреНрдпреЗрдХ рдЗрдорд╛рд░рддреАрдд рдПрдХрджрд╛. рдПрдЦрд╛рджрд╛ wing рдХрдзреАрдЪ рджреЛрди рдЗрдорд╛рд░рддреАрдВрдордзреНрдпреЗ рдкрд╕рд░рдд рдирд╛рд╣реА.
рдкреНрд░рддреНрдпреЗрдХ wing рдордзреНрдпреЗ рд░рдЦрд╡рд╛рд▓рджрд╛рд░ 5 рдЦреЛрд▓реНрдпрд╛рдВрдЪреЗ рдирдВрдмрд░ рд╕реНрд╡рддрдГрд╕рд╛рдареА рдареЗрд╡рддреЛ: wing рдЪреА рд╕реНрд╡рддрдГрдЪреА рдирд╛рд╡рд╛рдЪреА рдкрд╛рдЯреА, corridor рдЪреА рдкрд╛рдЯреА, phone book, рдПрдХ рдЬрд╛рджрд╛, рдЖрдгрд┐ рд╢реЗрд╡рдЯрдЪрд╛ рдирдВрдмрд░. рддреЗ 5 рдирдВрдмрд░ рддреБрдореНрд╣реА рдХрдзреАрдЪ рдПрдЦрд╛рджреНрдпрд╛ desk рд▓рд╛ рджреЗрдК рд╢рдХрдд рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
vpc["ЁЯПл VPC 10.20.0.0/16"]
subgraph az1["ЁЯПв ap-south-1a"]
p1["public 10.20.0.0/20"]
a1["app 10.20.48.0/20"]
d1["data 10.20.96.0/20"]
end
subgraph az2["ЁЯПв ap-south-1b"]
p2["public 10.20.16.0/20"]
a2["app 10.20.64.0/20"]
d2["data 10.20.112.0/20"]
end
subgraph az3["ЁЯПв ap-south-1c"]
p3["public 10.20.32.0/20"]
a3["app 10.20.80.0/20"]
d3["data 10.20.128.0/20"]
end
vpc --> az1
vpc --> az2
vpc --> az3
r["ЁЯкк every subnet: 5 reserved<br/>.0 ┬╖ .1 router ┬╖ .2 DNS ┬╖ .3 future ┬╖ last"]
d1 -.-> r
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/vpc/lesson-diagrams.html#l03
тЭУ рдХрд╛рдп
- Subnet тАФ VPC рдЪреНрдпрд╛ range рдордзреВрди рдХрд╛рдкрд▓реЗрд▓рд╛ CIDR block, рдЬреЛ рдПрдХрд╛ Availability Zone рдордзреНрдпреЗ рдареЗрд╡рд▓реЗрд▓рд╛ рдЕрд╕рддреЛ. Subnet рдЪреЗ рдЖрдХрд╛рд░рд╣реА /16 рдЖрдгрд┐ /28 рдЪреНрдпрд╛ рджрд░рдореНрдпрд╛рди рдЕрд╕рддрд╛рдд. рдПрдХрд╛ VPC рдордзреАрд▓ subnets рдПрдХрдореЗрдХрд╛рдВрд╢реА overlap рд╣реЛрдК рд╢рдХрдд рдирд╛рд╣реАрдд.
- Availability Zone (AZ) тАФ Region рдордзреАрд▓ рдПрдХ рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХ data centres, рд╕реНрд╡рддрдВрддреНрд░ рд╡реАрдЬ рдЖрдгрд┐ network рдЕрд╕рд▓реЗрд▓реЗ, рдЗрддрд░рд╛рдВрдкрд╛рд╕реВрди рдХрд╛рд╣реА рдХрд┐рд▓реЛрдореАрдЯрд░ рджреВрд░. рдмрд╣реБрддреЗрдХ Regions рдордзреНрдпреЗ рддреАрди рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХ рдЕрд╕рддрд╛рдд.
- Tiers тАФ рдиреЗрд╣рдореАрдЪреА рд░рдЪрдирд╛: public (load balancers, NAT gateways), app (servers, public IPs рдирд╛рд╣реАрдд), data (databases, internet route рдЕрдЬрд┐рдмрд╛рдд рдирд╛рд╣реА). рдкреНрд░рддреНрдпреЗрдХ AZ рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ tier рд╕рд╛рдареА рдПрдХ subnet.
- 5 рд░рд╛рдЦреАрд╡ рдкрддреНрддреЗ тАФ рдкреНрд░рддреНрдпреЗрдХ subnet рдордзреНрдпреЗ AWS рд╣реЗ рдареЗрд╡рддреЛ:
network address (
.0), VPC router рд╕рд╛рдареА +1, DNS рд╕рд╛рдареА +2 (resolver рд╕реНрд╡рддрдГ VPC base + 2 рд╡рд░ рдЕрд╕рддреЛ тАФ рдзрдбрд╛ 08), рднрд╡рд┐рд╖реНрдпрд╛рддреАрд▓ рд╡рд╛рдкрд░рд╛рд╕рд╛рдареА +3, рдЖрдгрд┐ рд╢реЗрд╡рдЯрдЪрд╛ рдкрддреНрддрд╛ (broadcast тАФ AWS broadcast рд▓рд╛ support рдХрд░рдд рдирд╛рд╣реА, рддрд░реАрд╣реА рддреЛ рд░рд╛рдЦреВрди рдареЗрд╡рддреЛ). рдореНрд╣рдгреВрди/24рдордзреНрдпреЗ 251 рд╡рд╛рдкрд░рддрд╛ рдпреЗрдгрд╛рд░реЗ рдкрддреНрддреЗ рдорд┐рд│рддрд╛рдд, рдЖрдгрд┐/28рдордзреНрдпреЗ 11. - AZ names рд╡рд┐рд░реБрджреНрдз AZ IDs тАФ рддреБрдордЪреНрдпрд╛ account рдордзрд▓рд╛
ap-south-1aрд╣рд╛ рджреБрд╕рд▒реНрдпрд╛ account рдордзрд▓реНрдпрд╛ap-south-1aрдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│рд╛ рдкреНрд░рддреНрдпрдХреНрд╖ AZ рдЕрд╕реВ рд╢рдХрддреЛ. AZ ID (рдЬрд╕реЗaps1-az1) рд╕рдЧрд│реАрдХрдбреЗ рд╕рд╛рд░рдЦрд╛рдЪ рдЕрд╕рддреЛ; рджреЛрди accounts рдЬреБрд│рд╡рд╛рдпрдЪреЗ рдЕрд╕рддреАрд▓ рддреЗрд╡реНрд╣рд╛ рддреЛрдЪ рд╡рд╛рдкрд░рд╛.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдПрдХ AZ рдмрдВрдж рдкрдбреВ рд╢рдХрддреЛ, рдЖрдгрд┐ subnet рджреБрд╕рд▒реНрдпрд╛ AZ рдордзреНрдпреЗ рд╣рд▓рд╡рддрд╛ рдпреЗрдд рдирд╛рд╣реА. рддреАрди рдЗрдорд╛рд░рддреАрдВрдордзреНрдпреЗ wings рдЕрд╕рд▓реЗ рдХреА рдПрдХ рдЗрдорд╛рд░рдд рдЧреЗрд▓реНрдпрд╛рд╡рд░ рддреБрдордЪреА рдлрдХреНрдд рдПрдХ рддреГрддреАрдпрд╛рдВрд╢ рдХреНрд╖рдорддрд╛ рдЬрд╛рддреЗ, рд╕рдЧрд│реА рдирд╛рд╣реА. рдЖрдгрд┐ tiers рдореБрд│реЗ рдкреНрд░рддреНрдпреЗрдХ wing рд▓рд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдкрд╛рдЯреНрдпрд╛ (рдзрдбрд╛ 04) рдЖрдгрд┐ рд╡реЗрдЧрд│реА рджрд╛рд░реЗ (рдзрдбрд╛ 06) рдорд┐рд│реВ рд╢рдХрддрд╛рдд.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
vpc/network.py рдордзреАрд▓ plan_subnets(vpc_cidr, new_prefix, tiers, azs)
ip_network(vpc_cidr).subnets(new_prefix=...) рдордзреВрди рдЬрд╛рддреЛ рдЖрдгрд┐ рдХреНрд░рдорд╛рдиреЗ рдкреНрд░рддреНрдпреЗрдХ
(tier, AZ) рд▓рд╛ рдПрдХ block рджреЗрддреЛ. reserved_addresses() block рдордзреАрд▓ 0, 1, 2, 3 рдЖрдгрд┐ тИТ1 рдпрд╛ рдЬрд╛рдЧрд╛ рдкрд░рдд рдХрд░рддреЛ;
usable() рдореНрд╣рдгрдЬреЗ block рдЪрд╛ рдЖрдХрд╛рд░ рд╡рдЬрд╛ RESERVED = 5. vpc/demo.py рдордзреАрд▓
subnets() рдирдК wings рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рдЫрд╛рдкрддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 vpc/demo.py subnets
python3 - <<'EOF'
import sys; sys.path.insert(0, "vpc"); from network import plan_subnets, usable, reserved_addresses
for tier, az, c in plan_subnets("10.20.0.0/16", 22, ["public", "app"], ["ap-south-1a", "ap-south-1b"]):
print(tier, az, c, usable(c))
print(reserved_addresses("10.20.96.0/28"), usable("10.20.96.0/28"))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
subnets рдирдК рдУрд│реА рдЫрд╛рдкрддреЛ, public ap-south-1a 10.20.0.0/20 4,091 usable рдкрд╛рд╕реВрди
data ap-south-1c 10.20.128.0/20 4,091 usable рдкрд░реНрдпрдВрдд, рдЖрдгрд┐ рдордЧ:
тФАтФА in EVERY subnet AWS keeps 5 addresses тАФ 10.20.0.0/24: 10.20.0.0, 10.20.0.1, 10.20.0.2, 10.20.0.3, 10.20.0.255
so a /24 gives 251 usable addresses, not 256 ┬╖ a /28 (the smallest) gives 11
рддреБрдордЪрд╛ snippet рдЪрд╛рд░ /22 wings рдЫрд╛рдкрддреЛ тАФ 10.20.0.0/22, 10.20.4.0/22, 10.20.8.0/22,
10.20.12.0/22, рдкреНрд░рддреНрдпреЗрдХрд╛рдд 1019 рд╡рд╛рдкрд░рддрд╛ рдпреЗрдгрд╛рд░реЗ тАФ рдЖрдгрд┐ рдордЧ
['10.20.96.0', '10.20.96.1', '10.20.96.2', '10.20.96.3', '10.20.96.15'] 11.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА campus рдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдорд╛рд░рддреАрд╕рд╛рдареА wings рдХрд╛рдкреВ рд╢рдХрддрд╛, рдЖрдгрд┐ 4,096 рдкрддреНрддреНрдпрд╛рдВрдЪреЗ 4,091 тАФ рдЖрдгрд┐ 16 рдЪреЗ 11 тАФ рдХрд╛ рд╣реЛрддрд╛рдд рд╣реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣реАрдд рдЖрд╣реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╕рдЧрд│реЗ subnets рдПрдХрд╛рдЪ AZ рдордзреНрдпреЗ тАФ рдПрдХ рдЗрдорд╛рд░рдд рдмрдВрдж рдЭрд╛рд▓реА рдХреА рд╕рдЧрд│реЗ рдерд╛рдВрдмрддреЗ
- рд╡рд╛рдврдгрд╛рд▒реНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрд╕рд╛рдареА (Auto Scaling, EKS, VPC рдордзреАрд▓ Lambda)
/28subnets тАФ рдлрдХреНрдд 11 рдкрддреНрддреЗ - рдЖрдХрд╛рд░ рдард░рд╡рддрд╛рдирд╛ 5 рд░рд╛рдЦреАрд╡ рдкрддреНрддреЗ рд╡рд┐рд╕рд░рдгреЗ ("/24 рдордзреНрдпреЗ 256 servers рдмрд╕рддрд╛рдд")
- accounts рдордзреНрдпреЗ AZs AZ ID рдРрд╡рдЬреА рдирд╛рд╡рд╛рдиреЗ рдЬреБрд│рд╡рдгреЗ
- рдЖрдЬрдЪреНрдпрд╛ subnets рд╕рд╛рдареА рдкреВрд░реНрдг VPC range рд╡рд╛рдкрд░рдгреЗ тАФ рдЙрджреНрдпрд╛рдЪреНрдпрд╛ tier рд╕рд╛рдареА рдХрд╛рд╣реАрдЪ рдЙрд░рдд рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Teams subnets code рдордзреВрди рдХрд╛рдкрддрд╛рдд, рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ environment рдордзреНрдпреЗ рдЖрд░рд╛рдЦрдбрд╛ рд╕рд╛рд░рдЦрд╛рдЪ рд░рд╛рд╣рддреЛ.
рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд; IDs рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ рдЖрд╣реЗрдд):
aws ec2 describe-availability-zones --query 'AvailabilityZones[].[ZoneName,ZoneId]' --output table
aws ec2 create-subnet --vpc-id vpc-0123456789abcdef0 --cidr-block 10.20.48.0/20 --availability-zone ap-south-1a
aws ec2 describe-subnets --filters Name=vpc-id,Values=vpc-0123456789abcdef0 \
--query 'Subnets[].[CidrBlock,AvailabilityZone,AvailableIpAddressCount]' --output table
Terraform рдордзреНрдпреЗ cidrsubnet("10.20.0.0/16", 4, n) lab рд╕рд╛рд░рдЦреЗрдЪ /20 blocks рджреЗрддреЛ:
n = 0 тЖТ 10.20.0.0/20, n = 3 тЖТ 10.20.48.0/20, n = 8 тЖТ 10.20.128.0/20.
locals { azs = ["ap-south-1a", "ap-south-1b", "ap-south-1c"] }
resource "aws_subnet" "app" {
count = 3
vpc_id = aws_vpc.school.id
availability_zone = local.azs[count.index]
cidr_block = cidrsubnet(aws_vpc.school.cidr_block, 4, 3 + count.index)
tags = { Name = "app-${count.index}" }
}
тПня╕П рдкреБрдвреЗ
рдирдК wings, рдЖрдгрд┐ рдЕрдЬреВрди рдПрдХрд╣реА рдкрд╛рдЯреА рдирд╛рд╣реА. Packet рд▓рд╛ рдХреБрдареЗ рдЬрд╛рдпрдЪреЗ рддреЗ рдХрд╕реЗ рдХрд│рддреЗ? Route tables тАФ corridor рдЪреНрдпрд╛ рдкрд╛рдЯреНрдпрд╛.
git checkout lesson-04-route-tables