ЁЯПл The SchoolтА║ЁЯкк AWSтА║ЁЯУо рдзрдбрд╛ 22 тАФ NAT gateway: рдПрдХрдорд╛рд░реНрдЧреА рдЯрдкрд╛рд▓рдкреЗрдЯреА, рдЦреЛрд▓рд╛рдд
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯУо рдзрдбрд╛ 22 тАФ NAT gateway: рдПрдХрдорд╛рд░реНрдЧреА рдЯрдкрд╛рд▓рдкреЗрдЯреА, рдЦреЛрд▓рд╛рдд

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 25 рдкреИрдХреА рдзрдбрд╛ 22 ┬╖ рдорд╛рдЧреАрд▓: lesson-21-subnet-networking ┬╖ рдкреБрдвреАрд▓: lesson-23-route53-routing


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ22. Campus рдирдХрд╛рд╢рд╛рд╡рд░рдЪреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рдд рдЬрд╛рд╕реНрдд bill рд╣реЛрдгрд╛рд▒реНрдпрд╛ рдбрдмреНрдпрд╛рд▓рд╛ рд╕реНрд╡рддрдГрдЪрд╛ рдзрдбрд╛ рдорд┐рд│рддреЛ. рдЦрд░реА file:

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

Private рд╡рд┐рднрд╛рдЧрд╛рддрд▓реНрдпрд╛ рдмрд╛рдХрд╛рдВрдирд╛ рд░рд╕реНрддреНрдпрд╛рдХрдбреЗ рдЦрд┐рдбрдХреНрдпрд╛ рдирд╛рд╣реАрдд (рдзрдбрд╛ 13) тАФ рдкрдг рддреНрдпрд╛рдВрдирд╛ рддрд░реАрд╣реА рдкрддреНрд░реЗ рдкрд╛рдард╡рд╛рд╡реА рд▓рд╛рдЧрддрд╛рдд: updates рдЖрдгрдгреЗ, API рд▓рд╛ call рдХрд░рдгреЗ, image pull рдХрд░рдгреЗ. NAT gateway ЁЯУо рдореНрд╣рдгрдЬреЗ public рд╡рд┐рднрд╛рдЧрд╛рдЪреНрдпрд╛ рднрд┐рдВрддреАрд▓рд╛ рдмрд╕рд╡рд▓реЗрд▓реА рдЯрдкрд╛рд▓рдкреЗрдЯреА:

рдЖрддрд╛ bill ЁЯз╛ (рдзрдбрд╛ 20 рдЪрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ): рдЯрдкрд╛рд▓рдкреЗрдЯреАрдЪрд╛ рдЦрд░реНрдЪ рдлрдХреНрдд рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рдгреНрдпрд╛рд╕рд╛рдареА ~$32/month рдЕрдзрд┐рдХ рддреНрдпрд╛рддреВрди рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ GB рд▓рд╛ ~4┬в тАФ рджреЛрдиреНрд╣реА рджрд┐рд╢рд╛рдВрдиреА. рджреЛрди рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛: (1) A рдЪреНрдпрд╛ рдЯрдкрд╛рд▓рдкреЗрдЯреАрддреВрди рдкрддреНрд░ рдкрд╛рдард╡рдгрд╛рд░реЗ B рдордзрд▓реЗ рдмрд╛рдХ рд╡рд░реВрди cross-AZ data рд╢реБрд▓реНрдХ рднрд░рддрд╛рдд; (2) рдЦрд╛рдЬрдЧреА corridor (рдзрдбрд╛ 21 рдЪрд╛ endpoint) рдореЛрдлрдд рдиреЗрдИрд▓ рдЕрд╕рд╛ gigabytes S3/ECR traffic рдЯрдкрд╛рд▓рдкреЗрдЯреАрддреВрди рдкрд╛рдард╡рдгреЗ.

рдирд╛рддреЗрд╡рд╛рдИрдХ: рдЬреБрдирд╛ NAT instance (рдЯрдкрд╛рд▓рдкреЗрдЯреА рдореНрд╣рдгреВрди рддреБрдореНрд╣реА рд╕реНрд╡рддрдГ рдЪрд╛рд▓рд╡рд▓реЗрд▓рд╛ рдмрд╛рдХ тАФ рд╕реНрд╡рд╕реНрдд, рдкрдг patch рддреБрдореНрд╣реА рдХрд░рддрд╛ рдЖрдгрд┐ рддреЛ scale рд╣реЛрдд рдирд╛рд╣реА), рдЖрдгрд┐ IPv6 рд╕рд╛рдареА egress-only internet gateway (рддреЗрдЪ "рдмрд╛рд╣реЗрд░ рд╣реЛрдп, рдЖрдд рдирд╛рд╣реА", NAT рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА рдХрд╛рд░рдг IPv6 рдкрддреНрддреЗ рдЖрдзреАрдЪ public рдЕрд╕рддрд╛рдд).

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    d["ЁЯЦея╕П private desk (AZ-a)<br/>10.0.101.7"]
    nat["ЁЯУо NAT gateway (public wing, AZ-a)<br/>Elastic IP 3.7.x.x"]
    igw["ЁЯЪз IGW"]
    net["ЁЯМН internet"]
    d -->|"1 letter, from 10.0.101.7"| nat
    nat -->|"2 return address rewritten"| igw --> net
    net -.->|"3 reply тЖТ postbox тЖТ desk"| nat
    net -. "тЬЧ no way to reach 10.0.101.7 directly" .-> d

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рд▓рд╣рд╛рди account рдордзрд▓реЗ рдЬрд╡рд│рдЬрд╡рд│ рдкреНрд░рддреНрдпреЗрдХ "рдзрдХреНрдХрд╛рджрд╛рдпрдХ" AWS bill рдореНрд╣рдгрдЬреЗ рдХреЛрдгреАрддрд░реА рд╡рд┐рд╕рд░рд▓реЗрд▓рд╛ NAT gateway, рдХрд┐рдВрд╡рд╛ endpoint рд╡реНрд╣рд╛рдпрд▓рд╛ рд╣рд╡рд╛ рд╣реЛрддрд╛ рдЕрд╕рд╛ NAT traffic. рдЯрдкрд╛рд▓рдкреЗрдЯреА рдиреЗрдордХреЗ рдХрд╛рдп рдХрд░рддреЗ тАФ рдЖрдгрд┐ рдХрд╛рдп рдХрд░рдд рдирд╛рд╣реА тАФ рд╣реЗ рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗ рдХреА campus рдЕрд╕рд╛ design рдХрд░рддрд╛ рдпреЗрддреЛ рдХреА рдЯрдкрд╛рд▓рдкреЗрдЯреА рд▓рд╣рд╛рди, рдкреНрд░рддреНрдпреЗрдХ рдЗрдорд╛рд░рддреАрдд рдПрдХ, рдЖрдгрд┐ рдлрдХреНрдд рдмрд╛рд╣реЗрд░ рдЬрд╛рдпрд▓рд╛рдЪ рд╣рд╡реЗ рддреЗрдЪ рдиреЗрдгрд╛рд░реА рдЕрд╕реЗрд▓.

ЁЯФз рдХрд╕реЗ

aws ec2 describe-nat-gateways --filter Name=state,Values=available \
  --query 'NatGateways[].{id:NatGatewayId,az:SubnetId,eip:NatGatewayAddresses[0].PublicIp}'
# what's flowing through it (last hour, GB out):
aws cloudwatch get-metric-statistics --namespace AWS/NATGateway --metric-name BytesOutToDestination \
  --dimensions Name=NatGatewayId,Value=$NAT --start-time $(date -u -v-1H +%FT%TZ) \
  --end-time $(date -u +%FT%TZ) --period 3600 --statistics Sum

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (~15 рдорд┐рдирд┐рдЯреЗ, ~10┬в тАФ рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ bill рд╣реЛрдгрд╛рд░рд╛ рдкрд╣рд┐рд▓рд╛ lab, рдореНрд╣рдгреВрди DESTROY рдХрд░рд╛)

cd vpc && terraform apply -var enable_nat=true      # adds a postbox in AZ-a + the private route
# from a private desk (SSM, lesson 09): curl -s ifconfig.me  тЖТ prints the postbox's Elastic IP
terraform destroy                                    # тП░ before you do anything else

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

Private рдмрд╛рдХрд╛рд╡рд░реВрди curl ifconfig.me NAT рдЪрд╛ Elastic IP рдЫрд╛рдкрддреЛ; рдмрд╛рд╣реЗрд░реВрди, рдмрд╛рдХрд╛рдЪрд╛ private IP рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЬреЛрдЧрд╛ рдирд╕рддреЛ.

ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛

рд▓рдЧреЗрдЪ terraform destroy тАФ NAT gateway рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд╕рд╛рд▓рд╛ ~$0.045 bill рдХрд░рддреЛ; рдордЧ describe-nat-gateways рд░рд┐рдХрд╛рдореЗ рдЖрд╣реЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛ рдЖрдгрд┐ Elastic IP release рдХрд░рд╛

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

тПня╕П рдкреБрдвреЗ

Campus рдмрд╛рд╣реЗрд░ рдкрддреНрд░реЗ рдкрд╛рдард╡реВ рд╢рдХрддреЛ. рдЖрддрд╛ phonebook рд▓рд╛ "рдПрдХ рдирд╛рд╡ тЖТ рдПрдХ рдЖрдХрдбрд╛" рдкреЗрдХреНрд╖рд╛ рд╣реБрд╢рд╛рд░ рдмрдирд╡реВрдпрд╛. рдзрдбрд╛ 23: Route 53 routing policies рдЖрдгрд┐ private zones.

ЁЯУо Lesson 22 тАФ The NAT gateway: the one-way postbox, in depth

ЁЯУН You are here: Lesson 22 of 25 ┬╖ Previous: lesson-21-subnet-networking ┬╖ Next: lesson-23-route53-routing


ЁЯУж What's in this branch

Lessons 01тАУ22. The most-billed box on the campus map gets its own lesson. Real file:

ЁЯзТ Explain like I'm 5

Private-wing desks have no street windows (lesson 13) тАФ but they still need to send letters: fetch updates, call an API, pull an image. The NAT gateway ЁЯУо is the postbox bolted to the public wing's wall:

Now the bill ЁЯз╛ (lesson 20's classic): a postbox costs ~$32/month for existing plus ~4┬в per GB that passes through тАФ both ways. Two common mistakes: (1) desks in B mailing through A's postbox pay cross-AZ data charges on top; (2) sending gigabytes of S3/ECR traffic through the postbox when a private corridor (lesson 21's endpoint) would carry it for free.

Relatives: the old NAT instance (a desk you ran yourself as a postbox тАФ cheaper, but you patch it and it doesn't scale), and the egress-only internet gateway for IPv6 (same "out yes, in no", no NAT needed since IPv6 addresses are already public).

ЁЯЧ║я╕П Diagram

flowchart LR
    d["ЁЯЦея╕П private desk (AZ-a)<br/>10.0.101.7"]
    nat["ЁЯУо NAT gateway (public wing, AZ-a)<br/>Elastic IP 3.7.x.x"]
    igw["ЁЯЪз IGW"]
    net["ЁЯМН internet"]
    d -->|"1 letter, from 10.0.101.7"| nat
    nat -->|"2 return address rewritten"| igw --> net
    net -.->|"3 reply тЖТ postbox тЖТ desk"| nat
    net -. "тЬЧ no way to reach 10.0.101.7 directly" .-> d

тЭУ What

ЁЯдФ Why

Nearly every "surprise" AWS bill in a small account is a NAT gateway someone forgot, or NAT traffic that should have been an endpoint. Knowing exactly what the postbox does тАФ and doesn't тАФ lets you design the campus so the postbox is small, per-building, and carries only what must leave.

ЁЯФз How

aws ec2 describe-nat-gateways --filter Name=state,Values=available \
  --query 'NatGateways[].{id:NatGatewayId,az:SubnetId,eip:NatGatewayAddresses[0].PublicIp}'
# what's flowing through it (last hour, GB out):
aws cloudwatch get-metric-statistics --namespace AWS/NATGateway --metric-name BytesOutToDestination \
  --dimensions Name=NatGatewayId,Value=$NAT --start-time $(date -u -v-1H +%FT%TZ) \
  --end-time $(date -u +%FT%TZ) --period 3600 --statistics Sum

ЁЯзк Try it (~15 min, ~10┬в тАФ the first lab that bills by the hour, so DESTROY)

cd vpc && terraform apply -var enable_nat=true      # adds a postbox in AZ-a + the private route
# from a private desk (SSM, lesson 09): curl -s ifconfig.me  тЖТ prints the postbox's Elastic IP
terraform destroy                                    # тП░ before you do anything else

тЬЕ Verify тАФ what you should see

from a private desk curl ifconfig.me prints the NAT's Elastic IP; from outside, the desk's private IP is unreachable.

ЁЯз╣ Clean up тАФ do not leave running

terraform destroy immediately тАФ the NAT gateway bills ~$0.045 every hour it exists; then confirm describe-nat-gateways is empty and release the Elastic IP

тЪая╕П Common mistakes

тПня╕П Next

The campus can mail out. Now let's make the phonebook smarter than "one name тЖТ one number." Lesson 23: Route 53 routing policies and private zones.

тЖР Previoussubnet networkingNext тЖТroute53 routing

This page is the lesson's README from the lesson-22-nat-gateway branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.