ЁЯдЭ рдзрдбрд╛ 09 тАФ VPC peering: рджреЛрди campuses рдордзрд▓рд╛ рдЦрд╛рдЬрдЧреА corridor
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-08-dns ┬╖ рдкреБрдврдЪрд╛: lesson-10-transit-gateway
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08, рдЖрдгрд┐ campuses рдордзрд▓рд╛ рдкрд╣рд┐рд▓рд╛ рдЬреЛрдб: vpc/demo.py рдордзрд▓реЗ peering()
overlap рд╣реЛрдгрд╛рд▒реНрдпрд╛ ranges рдирд╛рдХрд╛рд░рддреЗ рдЖрдгрд┐ peering transitive рдирд╛рд╣реА рд╣реЗ рджрд╛рдЦрд╡рддреЗ, рддреНрдпрд╛рд╕рд╛рдареА
vpc/network.py рдордзрд▓реЗ overlaps() рдЖрдгрд┐ peering_path() рд╡рд╛рдкрд░рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│рд╛ рдЖрдгрд┐ рднрд╛рдЧреАрджрд╛рд░ рд╢рд╛рд│рд╛ рдЖрдкрд▓реНрдпрд╛ campuses рдордзреНрдпреЗ рдПрдХ рдЫрдкреНрдкрд░ рдЕрд╕рд▓реЗрд▓рд╛ corridor ЁЯдЭ рдмрд╛рдВрдзрддрд╛рдд. рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдереЗрдЯ рдкрд▓реАрдХрдбреЗ рдЪрд╛рд▓рдд рдЬрд╛рддрд╛рдд, рд╢рд╣рд░рд╛рдЪреНрдпрд╛ рд░рд╕реНрддреНрдпрд╛рд╡рд░ рдХрдзреАрдЪ рдЙрддрд░рдд рдирд╛рд╣реАрдд.
рддреАрди рдирд┐рдпрдо:
- рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рдШрд░ рдирдВрдмрд░. рджреЛрдиреНрд╣реА campuses
10.20.x.xрд╡рд╛рдкрд░рдд рдЕрд╕рддреАрд▓, рддрд░10.20.5.5рд╕рд╛рдареАрдЪреНрдпрд╛ рдкрддреНрд░рд╛рд▓рд╛ рддреЗ рдХреЛрдгрддреНрдпрд╛ рдмрд╛рдЬреВрд╕рд╛рдареА рдЖрд╣реЗ рд╣реЗ рдХрд│реВрдЪ рд╢рдХрдд рдирд╛рд╣реА. рддреЗрдЪ рдирдВрдмрд░ тЖТ corridor рдирд╛рд╣реА. - рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдирд╛ рдкрд╛рдЯреНрдпрд╛. рд╢рд╛рд│реЗрдЪреА рдкрд╛рдЯреА рдореНрд╣рдгрддреЗ "
10.30.x.xтЖТ corridor". рднрд╛рдЧреАрджрд╛рд░рд╛рдЪреНрдпрд╛ рдкрд╛рдЯреАрд╡рд░рд╣реА "10.20.x.xтЖТ corridor" рдЕрд╕рд╛рдпрд▓рд╛рдЪ рд╣рд╡реЗ, рдирд╛рд╣реАрддрд░ рдЙрддреНрддрд░реЗ рдХрдзреАрдЪ рдкрд░рдд рдпреЗрдд рдирд╛рд╣реАрдд. - рдордзреВрди рдЪрд╛рд▓рдд рдЬрд╛рдгреЗ рдирд╛рд╣реА. рднрд╛рдЧреАрджрд╛рд░рд╛рдЪрд╛рд╣реА рдПрдХрд╛ vendor рдХрдбреЗ corridor рдЖрд╣реЗ. рд╢рд╛рд│реЗрддреАрд▓ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рднрд╛рдЧреАрджрд╛рд░рд╛рдордзреВрди vendor рдХрдбреЗ рдЪрд╛рд▓рдд рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА. рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбреАрд▓рд╛ рд╕реНрд╡рддрдГрдЪрд╛ corridor рд▓рд╛рдЧрддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
school["ЁЯПл school 10.20.0.0/16"]
partner["ЁЯПл partner 10.30.0.0/16"]
vendor["ЁЯПн vendor"]
school <-->|"pcx-1 ┬╖ routes on both sides"| partner
partner <-->|"pcx-2"| vendor
school -.->|"ЁЯЪл not transitive"| vendor
clash["10.20.0.0/16 тЖФ 10.20.128.0/17<br/>refused тАФ overlap"]
ЁЯЧ║я╕П рд░реЗрдЦрд╛рдЯрд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/vpc/lesson-diagrams.html#l09
тЭУ рдХрд╛рдп
- VPC peering connection (
pcx-тАж) тАФ рджреЛрди VPCs рдордзрд▓рд╛ рдЦрд╛рдЬрдЧреА рдЬреЛрдб. Traffic AWS network рд╡рд░рдЪ рд░рд╛рд╣рддреЗ. Size рдард░рд╡рд╛рдпрд▓рд╛ рдХреЛрдгрддрд╛рд╣реА gateway рдирд╛рд╣реА рдЖрдгрд┐ connection рд╕рд╛рдареА рд╕реНрд╡рддрдГ рдкреНрд░рддрд┐ рддрд╛рд╕ рдЦрд░реНрдЪ рдирд╛рд╣реА (data transfer рдЪрд╛ рдЦрд░реНрдЪ рд▓рд╛рдЧреВ рд╢рдХрддреЛ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде AZs рдХрд┐рдВрд╡рд╛ Regions рджрд░рдореНрдпрд╛рди). - Requester рдЖрдгрд┐ accepter тАФ рдПрдХ рдмрд╛рдЬреВ рд╡рд┐рдЪрд╛рд░рддреЗ, рджреБрд╕рд░реА рд╕реНрд╡реАрдХрд╛рд░рддреЗ. рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ accounts рдордзреНрдпреЗ рдЖрдгрд┐ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ Regions рдордзреНрдпреЗ рдЪрд╛рд▓рддреЗ.
- CIDRs overlap рдирдХреЛрдд тАФ рдЬреНрдпрд╛рдВрдЪреНрдпрд╛ ranges overlap рд╣реЛрддрд╛рдд рдЕрд╢рд╛ VPCs рдордзреНрдпреЗ peering рддрдпрд╛рд░ рдХрд░рд╛рдпрд▓рд╛ AWS рдирдХрд╛рд░ рджреЗрддреЗ.
- рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдирд╛ routes тАФ рдкреНрд░рддреНрдпреЗрдХ VPC рдЪреНрдпрд╛ route tables рдордзреНрдпреЗ рджреБрд╕рд▒реНрдпрд╛рдЪреНрдпрд╛ CIDR рдХрдбреЗ рдЬрд╛рдгрд╛рд░рд╛,
pcx-тАжtarget рдЕрд╕рд▓реЗрд▓рд╛ route рд╣рд╡рд╛. рдЖрдгрд┐ рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдЪреЗ security groups рддреНрдпрд╛ traffic рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдгрд╛рд░реЗ рд╣рд╡реЗрдд (рдПрдХрд╛рдЪ Region рдордзреНрдпреЗ, SG rule peered VPC рдордзрд▓реНрдпрд╛ SG рдЪрд╛ рд╕рдВрджрд░реНрдн рджреЗрдК рд╢рдХрддреЛ). - Transitive рдирд╛рд╣реА тАФ AтЖФB рдЖрдгрд┐ BтЖФC рдЕрд╕рд▓реЗ рддрд░реА AтЖФC рдорд┐рд│рдд рдирд╛рд╣реА. "edge-to-edge" routing рд╣реА рдирд╛рд╣реА: A рд╣рд╛ B рдЪрд╛ internet gateway, NAT gateway, VPN рдХрд┐рдВрд╡рд╛ gateway endpoint рд╡рд╛рдкрд░реВ рд╢рдХрдд рдирд╛рд╣реА.
- рдкреНрд░рдорд╛рдг тАФ рдЬреНрдпрд╛рдВрдиреА рд╕рдЧрд│реНрдпрд╛рдВрдиреА рдПрдХрдореЗрдХрд╛рдВрд╢реА рдмреЛрд▓рд╛рдпрд▓рд╛ рд╣рд╡реЗ рдЕрд╢рд╛ n VPCs рдирд╛ n┬╖(nтИТ1)/2 peerings рд▓рд╛рдЧрддрд╛рдд. рдореНрд╣рдгреВрдирдЪ рдзрдбрд╛ 10 рдЖрд╣реЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг data share рдХрд░рд╛рдпрд▓рд╛рдЪ рд╣рд╡рд╛ рдЕрд╕реЗ рджреЛрди-рддреАрди VPCs тАФ рдПрдХ app рдЖрдгрд┐ рдПрдХ shared-services VPC, рджреЛрди teams, рдПрдХ рднрд╛рдЧреАрджрд╛рд░ тАФ рдпрд╛рдВрдирд╛ рд╕реЛрдкрд╛ рдЖрдгрд┐ рдордзреНрдпреЗ рдХреЛрдгрддрд╛рд╣реА hub рдирд╕рд▓реЗрд▓рд╛ рдЦрд╛рдЬрдЧреА рдорд╛рд░реНрдЧ рд╣рд╡рд╛ рдЕрд╕рддреЛ. Peering рд╣рд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдЖрд╣реЗ. рддреНрдпрд╛рдЪреНрдпрд╛ рдорд░реНрдпрд╛рджрд╛ (overlap рдирдХреЛ, transitive рдирд╛рд╣реА) рд╣реАрдЪ рддреНрдпрд╛рдЪреА рд╕реБрд░рдХреНрд╖рд┐рддрддрд╛ рдЖрд╣реЗ: рддреБрдореНрд╣реА рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдЬреЛрдбреНрдпрд╛рдВрдкрд▓реАрдХрдбреЗ рдХрд╛рд╣реАрдЪ рдкреЛрд╣реЛрдЪрдд рдирд╛рд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
vpc/demo.py рдордзрд▓реЗ peering() рджреЛрди рд╕рдВрднрд╛рд╡реНрдп рдЬреЛрдбреНрдпрд╛ overlaps() рдиреЗ рддрдкрд╛рд╕рддреЗ,
рдордЧ peering_path(peerings, a, c) рд╡рд┐рдЪрд╛рд░рддреЗ, рдЬреЗ рдлрдХреНрдд (a, c) рдХрд┐рдВрд╡рд╛ (c, a) рд╣реА рдЬреЛрдбреА рд╕реНрд╡рддрдГрдЪ set
рдордзреНрдпреЗ рдЕрд╕реЗрд▓ рддрд░рдЪ true рдЕрд╕рддреЗ тАФ рдордзреВрди рдХреЛрдгрддрд╛рд╣реА рд╢реЛрдз рдШреЗрддрд▓рд╛ рдЬрд╛рдд рдирд╛рд╣реА. рдЦрд╛рд▓рдЪрд╛ snippet "рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдирд╛
routes" рд╣рд╛ рдирд┐рдпрдо рджрд╛рдЦрд╡рдгреНрдпрд╛рд╕рд╛рдареА RouteTable рд╡рд╛рдкрд░рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 vpc/demo.py peering
python3 - <<'EOF'
import sys; sys.path.insert(0, "vpc"); from network import RouteTable, peering_path, overlaps
school = RouteTable("rt-school", "10.20.0.0/16", [("10.30.0.0/16", "pcx-1")])
partner = RouteTable("rt-partner", "10.30.0.0/16") # forgot the return route
print("school тЖТ 10.30.4.7: ", school.lookup("10.30.4.7"))
print("partner тЖТ 10.20.48.25:", partner.lookup("10.20.48.25"))
partner.routes.append(("10.20.0.0/16", "pcx-1"))
print("partner тЖТ 10.20.48.25:", partner.lookup("10.20.48.25"))
pe = {("school", "partner"), ("partner", "vendor")}
pe.add(("school", "vendor")) # the only fix: a third corridor
print("school тЖТ vendor now:", peering_path(pe, "school", "vendor"))
print("default VPCs can peer?", not overlaps("172.31.0.0/16", "172.31.0.0/16"))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
peering рд╣реЗ рдЫрд╛рдкрддреЗ:
10.20.0.0/16 тЖФ 10.30.0.0/16: possible
10.20.0.0/16 тЖФ 10.20.128.0/17: refused тАФ the ranges overlap
school тЖТ partner: тЬЕ peered
partner тЖТ vendor: тЬЕ peered
school тЖТ vendor: ЁЯЪл no тАФ schoolтЖФpartner and partnerтЖФvendor does not give schoolтЖФvendor
рддреБрдордЪрд╛ snippet рдЖрдзреА school тЖТ 10.30.4.7: ('10.30.0.0/16', 'pcx-1') рдЫрд╛рдкрддреЛ, рдордЧ
partner тЖТ 10.20.48.25: (None, None) тАФ рдЙрддреНрддрд░рд╛рд▓рд╛ рдШрд░реА рдкрд░рддрдгреНрдпрд╛рдЪрд╛ рдорд╛рд░реНрдЧрдЪ рдирд╛рд╣реА тАФ рдЖрдгрд┐ return route
рдирдВрддрд░ ('10.20.0.0/16', 'pcx-1'). рддреНрдпрд╛рдирдВрддрд░ school тЖТ vendor now: True (рддрд┐рд╕рд░реЗ
peering) рдЖрдгрд┐ default VPCs can peer? False.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Peering рдлрдХреНрдд рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ ranges рдЖрдгрд┐ рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдирд╛ routes рдЕрд╕рддреАрд▓ рддрд░рдЪ рдЪрд╛рд▓рддреЗ, рдЖрдгрд┐ рддреЗ рдиреЗрдордХреЗ рджреЛрдирдЪ campuses рдЬреЛрдбрддреЗ тАФ рдХрдзреАрдЪ рд╕рд╛рдЦрд│реА рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- route рдлрдХреНрдд рдПрдХрд╛рдЪ рдмрд╛рдЬреВрд▓рд╛ тАФ requests рдЬрд╛рддрд╛рдд, рдЙрддреНрддрд░реЗ рдЯрд╛рдХреВрди рджрд┐рд▓реА рдЬрд╛рддрд╛рдд
- overlap рд╣реЛрдгрд╛рд░реЗ VPCs peer рдХрд░рдгреНрдпрд╛рдЪреА рдпреЛрдЬрдирд╛ (рдкреНрд░рддреНрдпреЗрдХ default VPC, рдкреНрд░рддреНрдпреЗрдХ
10.0.0.0/16) - A тЖТ B тЖТ C рдЪрд╛рд▓реЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛, рдХрд┐рдВрд╡рд╛ A рд╣рд╛ B рдЪрд╛ NAT рдХрд┐рдВрд╡рд╛ internet gateway рд╡рд╛рдкрд░реЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛
- рдкрд▓реАрдХрдбрдЪреНрдпрд╛ рдмрд╛рдЬреВрдЪреНрдпрд╛ security groups рдордзреНрдпреЗрд╣реА rule рд╣рд╡рд╛ рд╣реЗ рд╡рд┐рд╕рд░рдгреЗ
- рдбрдЭрдирднрд░ peerings рдЪреЗ рдЕрд╕реЗ рдЬрд╛рд│реЗ рдЬреЗ рдЖрддрд╛ рдХреБрдгрд╛рд▓рд╛рдЪ рдХрд╛рдврддрд╛ рдпреЗрдд рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдПрдХрдореЗрдХрд╛рдВрдд рдЬрд╛рд╕реНрдд traffic рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХрд╛рд╣реА VPCs рд╕рд╛рдареА peering рд╕рд╛рдорд╛рдиреНрдп рдЖрд╣реЗ. рдореВрдарднрд░рд╛рдВрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЭрд╛рд▓реЗ рдХреА teams Transit Gateway рдХрдбреЗ рд╡рд│рддрд╛рдд.
рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд; IDs рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ рдЖрд╣реЗрдд):
aws ec2 create-vpc-peering-connection --vpc-id vpc-0school00000000a \
--peer-vpc-id vpc-0partner0000000a --peer-owner-id 444455556666 --peer-region ap-south-1
aws ec2 accept-vpc-peering-connection --vpc-peering-connection-id pcx-0123456789abcdef0 # in the partner account
aws ec2 create-route --route-table-id rtb-0school0000000a --destination-cidr-block 10.30.0.0/16 \
--vpc-peering-connection-id pcx-0123456789abcdef0
aws ec2 create-route --route-table-id rtb-0partner000000a --destination-cidr-block 10.20.0.0/16 \
--vpc-peering-connection-id pcx-0123456789abcdef0
тПня╕П рдкреБрдвреЗ
рдЪрд╛рд░ campuses рдирд╛ 6 corridors рд▓рд╛рдЧрддрд╛рдд; рд╡реАрд╕ campuses рдирд╛ 190. рдЖрддрд╛ рдПрдХрд╛ hub рдЪреА рд╡реЗрд│ тАФ Transit Gateway, рдЬрд┐рд▓реНрд╣реНрдпрд╛рдЪреЗ bus station.
git checkout lesson-10-transit-gateway