ЁЯФО рдзрдбрд╛ 08 тАФ рдлрд╛рдЯрдХрд╛рдЪреЗ troubleshooting
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 08 ┬╖ рдорд╛рдЧреЗ: lesson-07-alternatives
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ07, рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рджрд┐рд╕рдгрд╛рд░реЗ рджреЛрди рдмрд┐рдШрд╛рдб: port exhaustion
(рдПрдХрд╛ destination рд╕рд╛рдареА рдиреЛрдВрджрд╡рд╣реА рднрд░рд▓реА тЖТ ErrorPortAllocation) рдЖрдгрд┐ 350-second idle
timeout (рд╢рд╛рдВрдд рдУрд│ рд╡рд┐рд╕рд░рд▓реА рдЬрд╛рддреЗ тЖТ connection reset рд╣реЛрддреЗ). рдЖрдгрд┐ рджреЛрдиреНрд╣реА рджрд╛рдЦрд╡рдгрд╛рд░реЗ CloudWatch metrics.
nat/demo.py рдордзреАрд▓ troubleshoot() рдореБрджреНрджрд╛рдо рдлрд╛рдЯрдХ рдмрд┐рдШрдбрд╡рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдлрд╛рдЯрдХрд╛рд╡рд░ рджреЛрди рдЧреЛрд╖реНрдЯреА рдЪреБрдХреВ рд╢рдХрддрд╛рдд:
- ЁЯУТ рдиреЛрдВрджрд╡рд╣реАрдЪреЗ рдкрд╛рди рднрд░рд▓реЗ. рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рди рдПрдХрд╛ рджреБрдХрд╛рдирд╛рд╕рд╛рдареА рдЕрд╕рддреЗ, рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рдард░рд╛рд╡рд┐рдХ рд╕рдВрдЦреНрдпреЗрдЪреЗрдЪ рддрд┐рдХреАрдЯ рдХреНрд░рдорд╛рдВрдХ рдЕрд╕рддрд╛рдд. рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЦреВрдк рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рдПрдХрд╛рдЪ рджреБрдХрд╛рдирд╛рдд рдЧреЗрд▓реНрдпрд╛, рддрд░ рд░рдЦрд╡рд╛рд▓рджрд╛рд░рд╛рдХрдбреЗ рддрд┐рдХреАрдЯрдЪ рдЙрд░рдд рдирд╛рд╣реА рдЖрдгрд┐ рддреЛ рдореНрд╣рдгрддреЛ "рдерд╛рдВрдмрд╛". рджреБрд╕рд▒реНрдпрд╛ рджреБрдХрд╛рдирд╛рдд рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдВрдирд╛ рддрд░реАрд╣реА рддрд┐рдХрд┐рдЯреЗ рдорд┐рд│рддрд╛рдд. рдЙрдкрд╛рдп: рдлрд╛рдЯрдХрд╛рдЪрд╛ рджреБрд╕рд░рд╛ рдкрддреНрддрд╛ (рддрд┐рдХрд┐рдЯрд╛рдВрдЪреЗ рдирд╡реЗ рдкрд╛рди), рдХрд┐рдВрд╡рд╛ рдПрдХрд╛рдЪ рд╡реЗрд│реА рддреНрдпрд╛ рджреБрдХрд╛рдирд╛рдд рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рдХрдореА рдХрд░рдгреЗ.
- ЁЯХ░я╕П рд░рдЦрд╡рд╛рд▓рджрд╛рд░ рд╢рд╛рдВрдд рдУрд│реА рд╡рд┐рд╕рд░рддреЛ. рдПрдЦрд╛рджреНрдпрд╛ рдлреЗрд░реАрд╡рд░реВрди рд╕реБрдорд╛рд░реЗ рд╕рд╣рд╛ рдорд┐рдирд┐рдЯреЗ (350 seconds) рдХреЛрдгреА рдПрдХрд╣реА рд╢рдмреНрдж рдкрд╛рдард╡рд▓рд╛ рдирд╛рд╣реА, рддрд░ рд░рдЦрд╡рд╛рд▓рджрд╛рд░ рддреА рдУрд│ рдЦреЛрдбреВрди рдЯрд╛рдХрддреЛ. рджреБрдХрд╛рди рд╢реЗрд╡рдЯреА рдЙрддреНрддрд░ рджреЗрддреЗ рддреЗрд╡реНрд╣рд╛ рдУрд│рдЪ рдирд╕рддреЗ тАФ рдЙрддреНрддрд░ рдлреЗрдХреВрди рджрд┐рд▓реЗ рдЬрд╛рддреЗ, рдЖрдгрд┐ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрд▓рд╛ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЬрд╛рддреЗ рдХреА рдлреЗрд░реА рд╕рдВрдкрд▓реА. рдЙрдкрд╛рдп: рджрд░ рдХрд╛рд╣реА рдорд┐рдирд┐рдЯрд╛рдВрдиреА рдЫреЛрдЯреА "рдореА рдЕрдЬреВрди рдЖрд╣реЗ" рдЪрд┐рдареНрдареА (keepalive) рдкрд╛рдард╡рдгреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph full["ЁЯУТ port exhaustion"]
c["connections 1тАУ5 тЖТ pypi"] --> ok["тЬЕ ports 1024тАУ1028"]
c6["connection 6 тЖТ pypi"] --> err["тЭМ ErrorPortAllocation"]
gh["connection тЖТ github"] --> ok2["тЬЕ different destination"]
end
subgraph idle["ЁЯХ░я╕П idle timeout"]
t0["t=0 row written"] --> t400["t=400 s quiet > 350 s тЖТ row wiped"]
t400 --> late["late answer тЖТ dropped, app sees a reset"]
end
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/nat/lesson-diagrams.html#l08
тЭУ рдХрд╛рдп
- Port exhaustion тАФ NAT gateway рдкреНрд░рддреНрдпреЗрдХ assigned IP рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ unique destination рдХрдбреЗ
(destination IP, destination port рдЖрдгрд┐ protocol) 55,000 рдкрд░реНрдпрдВрдд рдПрдХрд╛рдЪ рд╡реЗрд│рдЪреЗ connections рдЪрд╛рд▓рд╡рддреЛ.
рддреНрдпрд╛рдЪ destination рдХрдбрдЪреЗ 55,001 рд╡реЗ fail рд╣реЛрддреЗ. CloudWatch рддреЗ
ErrorPortAllocationрдореНрд╣рдгреВрди рдореЛрдЬрддреЗ. рдЗрддрд░ destinations рд╡рд░ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдд рдирд╛рд╣реА. - Port exhaustion рд╡рд░рдЪреЗ рдЙрдкрд╛рдп тАФ рдЬрд╛рд╕реНрдд IPs рдЬреЛрдбрд╛ (рдкреНрд░рддреНрдпреЗрдХ NAT gateway рд▓рд╛ 8 рдкрд░реНрдпрдВрдд; рдзрдбрд╛ 05), traffic рдЬрд╛рд╕реНрдд destinations рд╡рд░ рдкрд╕рд░рд╡рд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЬрд╛рд╕реНрдд backend IPs), connections рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд╛ (HTTP keep-alive, connection pools), рдЖрдгрд┐ AWS-service traffic endpoints рдХрдбреЗ рд╣рд▓рд╡рд╛ (рдзрдбрд╛ 07).
- Idle timeout тАФ traffic рд╢рд┐рд╡рд╛рдп 350 seconds рдЧреЗрд▓реНрдпрд╛рд╡рд░ NAT gateway connection рд╡рд┐рд╕рд░рддреЛ.
рддреНрдпрд╛рдирдВрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рдмрд╛рдЬреВрдиреЗ рддреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛, рддрд░ NAT gateway рддреНрдпрд╛рдЪреНрдпрд╛рдорд╛рдЧрдЪреНрдпрд╛ resource рд▓рд╛
RST рдкрд░рдд рдкрд╛рдард╡рддреЛ; application рд▓рд╛ "connection reset" рджрд┐рд╕рддреЗ. CloudWatch рд╣реЗ
IdleTimeoutCountрдордзреНрдпреЗ рдореЛрдЬрддреЗ. - Idle timeout рд╡рд░рдЪрд╛ рдЙрдкрд╛рдп тАФ instances рд╡рд░ (рдХрд┐рдВрд╡рд╛ client library рдордзреНрдпреЗ) 350 seconds рдкреЗрдХреНрд╖рд╛ рдХрдореА interval рдиреЗ TCP keepalive рдЪрд╛рд▓реВ рдХрд░рд╛, рдХрд┐рдВрд╡рд╛ рдЦреВрдк рд╡реЗрд│ рд╢рд╛рдВрдд рдЕрд╕рд▓реЗрд▓реА connections рдмрдВрдж рдХрд░реВрди рдкреБрдиреНрд╣рд╛ рдЙрдШрдбрд╛.
- рдЗрддрд░ рдЙрдкрдпреЛрдЧреА metrics (namespace
AWS/NATGateway) тАФPacketsDropCount(NAT рдиреЗ drop рдХреЗрд▓реЗрд▓реЗ packets тАФ рд╡рд╛рдврддрд╛ рдЖрдХрдбрд╛ NAT рдордзреАрд▓ рдЕрдбрдЪрдгреАрдХрдбреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд░реВ рд╢рдХрддреЛ),ActiveConnectionCount(рдиреЛрдВрджрд╡рд╣реАрдЪрд╛ рдЖрдХрд╛рд░),BytesOutToDestination(рдмрд╛рд╣реЗрд░ рдЬрд╛рдгрд╛рд░рд╛ traffic, GB bill рдЪрд╛ рдкрд╛рдпрд╛), рдЖрдгрд┐ConnectionAttemptCount/ConnectionEstablishedCount. - Private subnet рдордзреВрди "internet рдЪрд╛рд▓рдд рдирд╛рд╣реА" рддреЗрд╡реНрд╣рд╛рдЪреА рддрдкрд╛рд╕рдгреА рдпрд╛рджреА тАФ route table рдордзреНрдпреЗ
0.0.0.0/0 тЖТ nat-тАжрдЖрд╣реЗ; NATavailableрдЖрд╣реЗ; NAT рдЪреЗ subnet0.0.0.0/0 тЖТ igw-тАжroute рдХрд░рддреЗ; NACLs traffic рдЖрдгрд┐ рдкрд░рддреАрдЪреЗ ephemeral ports рджреЛрдиреНрд╣реАрдВрдирд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрддрд╛рдд; instance рдЪрд╛ security group outbound traffic рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ; DNS resolve рд╣реЛрддреЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рджреЛрдиреНрд╣реА рдмрд┐рдШрд╛рдб рдЕрдзреВрдирдордзреВрди рдпреЗрдгрд╛рд▒реНрдпрд╛ application errors рд╕рд╛рд░рдЦреЗ рджрд┐рд╕рддрд╛рдд: "load рдЦрд╛рд▓реА timeouts" рдЖрдгрд┐ "рд╢рд╛рдВрдд рдХрд╛рд▓рд╛рд╡рдзреАрдирдВрддрд░ connection reset". рдиреЛрдВрджрд╡рд╣реА рдорд╛рд╣реАрдд рдирд╕реЗрд▓ рддрд░ teams servers restart рдХрд░рддрд╛рдд рдХрд┐рдВрд╡рд╛ рдореЛрдареА instances рдЬреЛрдбрддрд╛рдд, рдЖрдгрд┐ рдХрд╛рд╣реАрдЪ рдмрджрд▓рдд рдирд╛рд╣реА. Metrics рдЕрд╕рддреАрд▓ рддрд░ рдХрд╛рд░рдг рдХрд╛рд╣реА рдорд┐рдирд┐рдЯрд╛рдВрдд рджрд┐рд╕рддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
nat/gateway.py рдордзреНрдпреЗ, рдкреНрд░рддреНрдпреЗрдХ IP рдиреЗ рддреНрдпрд╛ destination рдХрдбреЗ ports_per_dest
ports рд╡рд╛рдкрд░рд▓реЗ рдХреА send() рд╣реЗ self.errors += 1 рдореЛрдЬрддреЗ (model рдЪреЗ ErrorPortAllocation).
tick(now) рдЬреНрдпрд╛ рдУрд│реАрдВрдЪреА last рд╡реЗрд│ idle_timeout seconds рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЬреБрдиреА рдЖрд╣реЗ рддреНрдпрд╛ рдкреБрд╕рддреЗ, рдЖрдгрд┐
рдУрд│реАрд╡рд░рдЪреЗ рдкреНрд░рддреНрдпреЗрдХ send() рдХрд┐рдВрд╡рд╛ reply() рд╣реЗ last рддрд╛рдЬреЗ рдХрд░рддреЗ тАФ keepalive рдиреЗрдордХреЗ рд╣реЗрдЪ рдХрд░рддреЛ.
nat/demo.py рдордзреАрд▓ troubleshoot() рдиреЛрдВрджрд╡рд╣реА 5 ports рдкрд░реНрдпрдВрдд рд▓рд╣рд╛рди рдХрд░рддреЗ, рдореНрд╣рдгрдЬреЗ рддреА
screen рд╡рд░рдЪ рднрд░рддреЗ. (Model рдордзреНрдпреЗ рдЦрд░реЗ 55,000 рднрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ рдирдХрд╛ тАФ рддреЗ рдкреНрд░рддреНрдпреЗрдХ send рд▓рд╛ рд╕рдВрдкреВрд░реНрдг table
scan рдХрд░рддреЗ, рддреНрдпрд╛рдореБрд│реЗ рддреНрдпрд╛рд▓рд╛ рдЦреВрдк рд╡реЗрд│ рд▓рд╛рдЧрддреЛ. рддреНрдпрд╛рдРрд╡рдЬреА ports_per_dest рд▓рд╣рд╛рди рдХрд░рд╛.)
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 nat/demo.py troubleshoot
python3 - <<'EOF'
import sys; sys.path.insert(0, "nat"); from gateway import NatGateway
PYPI = ("151.101.0.223", 443, "tcp")
for now in (350, 351):
g = NatGateway("nat-a", ["13.232.10.20"]); ip, port = g.send(("10.20.48.25", 50001), PYPI, t=0)
print(f"quiet until t={now}: wiped {g.tick(now)} ┬╖ reply тЖТ {g.reply(ip, port, PYPI, now)}")
g = NatGateway("nat-a", ["13.232.10.20"]); ip, port = g.send(("10.20.48.25", 50001), PYPI, t=0)
for t in (300, 600, 900): # a keepalive every 300 s
g.send(("10.20.48.25", 50001), PYPI, t=t); g.tick(t)
print("with keepalive every 300 s, at t=1000:", g.tick(1000), "wiped ┬╖ reply тЖТ", g.reply(ip, port, PYPI, 1000))
EOF
python3 nat/test_nat.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
troubleshoot рд╣реЗ connection 1 тЖТ 13.232.10.20:1024 рдкрд╛рд╕реВрди connection 5 тЖТ 13.232.10.20:1028 рдкрд░реНрдпрдВрдд рдЫрд╛рдкрддреЗ,
рдордЧ connection 6 тЖТ тЭМ ErrorPortAllocation рдЖрдгрд┐ connection 7 тЖТ тЭМ ErrorPortAllocation, рдордЧ
a DIFFERENT destination still works тЖТ rows: 6 ┬╖ ErrorPortAllocation = 2, рдЖрдгрд┐
t=400 s the server answers late тЖТ wiped 1 row тЖТ reply dropped (the app sees a reset).
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
quiet until t=350: wiped 0 ┬╖ reply тЖТ ('10.20.48.25', 50001)
quiet until t=351: wiped 1 ┬╖ reply тЖТ None
with keepalive every 300 s, at t=1000: 0 wiped ┬╖ reply тЖТ ('10.20.48.25', 50001)
рдмрд░реЛрдмрд░ 350 seconds рд▓рд╛ рдУрд│ рдЯрд┐рдХрддреЗ; рдПрдХ second рдЬрд╛рд╕реНрдд рдЭрд╛рд▓рд╛ рдХреА рддреА рдЬрд╛рддреЗ. рджрд░ 300 seconds рд▓рд╛ keepalive рдЕрд╕реЗрд▓
рддрд░ 1,000 seconds рдирдВрддрд░рд╣реА рдУрд│ рддрд┐рдереЗрдЪ рдЕрд╕рддреЗ. Tests 8/8 passed рдиреЗ рд╕рдВрдкрддрд╛рдд.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
"Load рдЦрд╛рд▓реА connect рд╣реЛрдд рдирд╛рд╣реА" рдореНрд╣рдгрдЬреЗ рдПрдХрд╛ destination рд╕рд╛рдареА рднрд░рд▓реЗрд▓реА рдиреЛрдВрджрд╡рд╣реА рдЕрд╕реВ рд╢рдХрддреЗ, рдЖрдгрд┐ "рд╢рд╛рдВрдд рдХрд╛рд▓рд╛рд╡рдзреАрдирдВрддрд░ reset" рдореНрд╣рдгрдЬреЗ рд╡рд┐рд╕рд░рд▓реЗрд▓реА рдУрд│ рдЕрд╕реВ рд╢рдХрддреЗ тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рдЪрд╛ metric рдЖрдгрд┐ рдЙрдкрд╛рдп рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣реАрдд рдЖрд╣реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
ErrorPortAllocationрд╕рд╛рдареА app servers restart рдХрд░рдгреЗ тАФ рдорд░реНрдпрд╛рджрд╛ NAT рдЪреНрдпрд╛ рдмрд╛рдЬреВрд▓рд╛ рдЖрд╣реЗ; IPs рдЬреЛрдбрд╛ рдХрд┐рдВрд╡рд╛ destinations рдкрд╕рд░рд╡рд╛- pool рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рдРрд╡рдЬреА рдПрдХрд╛рдЪ рд╡реНрдпрд╕реНрдд API рдХрдбреЗ рдкреНрд░рддреНрдпреЗрдХ request рд▓рд╛ рдирд╡реЗ connection рдЙрдШрдбрдгреЗ
- NAT рдордзреВрди рдЬрд╛рдгрд╛рд░реА database рдХрд┐рдВрд╡рд╛ SSH connections 10 рдорд┐рдирд┐рдЯреЗ рд╢рд╛рдВрдд рдмрд╕рддрд╛рдд, keepalive рдирд╕рддрд╛рдирд╛
- outbound traffic рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдгрд╛рд░реЗ рдкрдг ephemeral ports (1024тАУ65535) рд╡рд░рдЪрд╛ рдкрд░рддреАрдЪрд╛ traffic рдЕрдбрд╡рдгрд╛рд░реЗ NACLs
- alarm рдЪ рдирд╛рд╣реА тАФ
ErrorPortAllocationрдРрд╡рдЬреА users рдХрдбреВрди рдХрд│рдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ port allocation errors рд╡рд░ alarm рд▓рд╛рд╡рд╛, idle-timeout count рд╡рд╛рдЪрд╛, рдЖрдгрд┐ Linux instance рд╡рд░ 350 seconds рдкреЗрдХреНрд╖рд╛ рдХрдореА keepalive рдареЗрд╡рд╛:
aws cloudwatch put-metric-alarm --alarm-name nat-a-port-allocation --namespace AWS/NATGateway --metric-name ErrorPortAllocation --dimensions Name=NatGatewayId,Value=nat-0abc --statistic Sum --period 300 --evaluation-periods 1 --threshold 0 --comparison-operator GreaterThanThreshold --alarm-actions arn:aws:sns:us-east-1:111122223333:ops
aws cloudwatch get-metric-statistics --namespace AWS/NATGateway --metric-name IdleTimeoutCount --dimensions Name=NatGatewayId,Value=nat-0abc --start-time 2026-09-26T00:00:00Z --end-time 2026-09-27T00:00:00Z --period 3600 --statistics Sum
aws cloudwatch get-metric-statistics --namespace AWS/NATGateway --metric-name PacketsDropCount --dimensions Name=NatGatewayId,Value=nat-0abc --start-time 2026-09-26T00:00:00Z --end-time 2026-09-27T00:00:00Z --period 3600 --statistics Sum
sudo sysctl -w net.ipv4.tcp_keepalive_time=300 # on the instance; the app must enable SO_KEEPALIVE
resource "aws_cloudwatch_metric_alarm" "nat_ports" {
for_each = aws_nat_gateway.this
alarm_name = "nat-${each.key}-port-allocation"
namespace = "AWS/NATGateway"
metric_name = "ErrorPortAllocation"
dimensions = { NatGatewayId = each.value.id }
statistic = "Sum"
period = 300
evaluation_periods = 1
threshold = 0
comparison_operator = "GreaterThanThreshold"
}
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рддреНрдпреЗрдХ NAT gateway рд╡рд░
ErrorPortAllocationрдЪрд╛ alarm рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡рд╛ рдЖрдгрд┐ActiveConnectionCount,IdleTimeoutCount,PacketsDropCountрд╡BytesOutToDestinationрдЕрд╕рд▓реЗрд▓рд╛ dashboard рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡рд╛. рд╣реЗ рдЪрд╛рд░ graphs рдХреЛрдгреА ticket рдЙрдШрдбрдгреНрдпрд╛рдЖрдзреАрдЪ рдмрд╣реБрддреЗрдХ egress рдкреНрд░рд╢реНрдирд╛рдВрдЪреА рдЙрддреНрддрд░реЗ рджреЗрддрд╛рдд.
ЁЯОУ рдлрд╛рдЯрдХ рдЖрддрд╛ рддреБрдордЪреЗ рдЖрд╣реЗ
рд╢рд╛рд│реЗрдЪреЗ рдлрд╛рдЯрдХ тЖТ рдиреЛрдВрджрд╡рд╣реА тЖТ managed рдлрд╛рдЯрдХ рдХреА рд╕реНрд╡рддрдГрдЪреЗ тЖТ рдкреНрд░рддреНрдпреЗрдХ рдЗрдорд╛рд░рддреАрд▓рд╛ рдПрдХ рдлрд╛рдЯрдХ тЖТ рд╕реНрдерд┐рд░ рдкрд░рддреАрдЪрд╛ рдкрддреНрддрд╛ тЖТ рджреЛрди рдореАрдЯрд░ тЖТ рдлрд╛рдЯрдХ рдЯрд╛рд│рдгрд╛рд▒реНрдпрд╛ рдлреЗрд▒реНрдпрд╛ тЖТ рднрд░рд▓реЗрд▓реНрдпрд╛ рдиреЛрдВрджрд╡рд╣реНрдпрд╛ рдЖрдгрд┐ рд╡рд┐рд╕рд░рд▓реЗрд▓реНрдпрд╛ рдУрд│реА. рддреБрдореНрд╣реА рдлрдХреНрдд NAT рд╢рд┐рдХрд▓рд╛ рдирд╛рд╣реАрдд тАФ рддреБрдореНрд╣реА рд╢рд╛рд│реЗрдЪреЗ рдлрд╛рдЯрдХ рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛. ЁЯЪкЁЯОУ
рд╢рд╛рд│реЗрддрд▓реА рдкреБрдврдЪреА рджрд╛рд░реЗ: VPC рд╢рд╛рд│рд╛ рд╣реЗ рдлрд╛рдЯрдХ рдЬреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг campus рдЪрд╛ рднрд╛рдЧ рдЖрд╣реЗ рддреЛ рдмрд╛рдВрдзрддреЗ; Networking рд╢рд╛рд│рд╛ IP, ports рдЖрдгрд┐ TCP рдордзреНрдпреЗ рдЕрдзрд┐рдХ рдЦреЛрд▓рд╡рд░ рдЬрд╛рддреЗ; School portal рдордзреНрдпреЗ рдмрд╛рдХреА рд╕рдЧрд│реЗ рдЖрд╣реЗ.
git checkout main
python3 nat/demo.py # one last run, for fun