ЁЯПЧя╕П рдзрдбрд╛ 12 тАФ Production VPC design: рдЯрд┐рдХрдгреНрдпрд╛рд╕рд╛рдареА рдмрд╛рдВрдзрд▓реЗрд▓рд╛ campus
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 12 тАФ рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛! ┬╖ рдорд╛рдЧрдЪрд╛: lesson-11-troubleshooting
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕, рдЖрдгрд┐ рдЖрд░рд╛рдЦрдбрд╛: vpc/demo.py рдордзрд▓реЗ design()
3 AZs ├Ч public / app / data рдорд╛рдВрдбрддреЗ, рдкреНрд░рддреНрдпреЗрдХ AZ рд▓рд╛ рдПрдХ NAT, S3 рдЖрдгрд┐ DynamoDB gateway
endpoints рдЖрдгрд┐ flow logs тАФ рдЖрдгрд┐ рд╡рд╛рдвреАрд╕рд╛рдареА рдХрд┐рддреА рдЬрд╛рдЧрд╛ рдЙрд░рд▓реА рддреЗ рдореЛрдЬрддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЖрддрд╛ рд╢рд╛рд│рд╛ рдЕрд╕рд╛ campus рдмрд╛рдВрдзрддреЗ рдЬреНрдпрд╛рдд рддреА рд╡рд░реНрд╖рд╛рдиреБрд╡рд░реНрд╖реЗ рд░рд╛рд╣рдгрд╛рд░ рдЖрд╣реЗ. ЁЯПЧя╕П
- рддреАрди рдЗрдорд╛рд░рддреА, рдкреНрд░рддреНрдпреЗрдХреАрдд рддреЗрдЪ рддреАрди wings. рдПрдХ рдЗрдорд╛рд░рдд рдмрдВрдж рдкрдбреВ рд╢рдХрддреЗ; рд╢рд╛рд│рд╛ рдЪрд╛рд▓реВрдЪ рд░рд╛рд╣рддреЗ.
- Public wing рдордзреНрдпреЗ рдлрдХреНрдд рд╕реНрд╡рд╛рдЧрдд рдХрдХреНрд╖ (load balancer) рдЖрдгрд┐ рдмрд╛рдЬреВрдЪреЗ рджрд╛рд░ (NAT) рдЕрд╕рддреЗ. рддрд┐рдереЗ рдХреЛрдгрддреАрд╣реА рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рдмрд╕рдд рдирд╛рд╣реА.
- App wing рдордзреНрдпреЗ рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рдЕрд╕рддрд╛рдд. Public рдкрддреНрддреЗ рдирд╛рд╣реАрдд. рддреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛рдЪ рдЗрдорд╛рд░рддреАрддрд▓реНрдпрд╛ рдмрд╛рдЬреВрдЪреНрдпрд╛ рджрд╛рд░рд╛рддреВрди рдмрд╛рд╣реЗрд░ рдЬрд╛рддрд╛рдд тАФ рдЕрдВрдЧрдг рдУрд▓рд╛рдВрдбреВрди рджреБрд╕рд▒реНрдпрд╛ рдЗрдорд╛рд░рддреАрдЪреНрдпрд╛ рджрд╛рд░рд╛рдХрдбреЗ рдХрдзреАрдЪ рдирд╛рд╣реА.
- Data wing рдордзреНрдпреЗ рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рдкреНрд░рд╢реНрдирдкрддреНрд░рд┐рдХрд╛ рдЕрд╕рддрд╛рдд. рддреНрдпрд╛рд▓рд╛ рд╢рд╣рд░рд╛рдХрдбреЗ рдЬрд╛рдгрд╛рд░рд╛ рд░рд╕реНрддрд╛рдЪ рдирд╛рд╣реА тАФ рдлрдХреНрдд рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рдХрдбреЗ рдЬрд╛рдгрд╛рд░рд╛ рдЦрд╛рдЬрдЧреА рдмреЛрдЧрджрд╛.
- рдкрд╣рд┐рд▓реНрдпрд╛ рджрд┐рд╡рд╕рд╛рдкрд╛рд╕реВрди рдкреНрд░рддреНрдпреЗрдХ desk рд╡рд░ рдПрдХ рдиреЛрдВрджрд╡рд╣реА.
- рдЖрдгрд┐ рдЕрдЬреВрди рдХреБрдгреАрдЪ рд╡рд┐рдЪрд╛рд░ рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдирд╡реНрдпрд╛ wing рд╕рд╛рдареА рдЙрд░рд▓реЗрд▓реА рдореЛрдХрд│реА рдЬрдореАрди.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
igw["ЁЯЪк internet gateway"]
subgraph a["ЁЯПв AZ a"]
pa["public: ALB ┬╖ nat-a"] --> aa["app: no public IPs"] --> da["data: no internet route"]
end
subgraph b["ЁЯПв AZ b"]
pb["public: ALB ┬╖ nat-b"] --> ab["app"] --> db["data"]
end
subgraph c["ЁЯПв AZ c"]
pc["public: ALB ┬╖ nat-c"] --> ac["app"] --> dc["data"]
end
igw --> pa
igw --> pb
igw --> pc
ep["ЁЯЪЗ S3 + DynamoDB gateway endpoints"]
fl["ЁЯУУ flow logs on"]
da -.-> ep
ЁЯЧ║я╕П рд░реЗрдЦрд╛рдЯрд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/vpc/lesson-diagrams.html#l12
тЭУ рдХрд╛рдп
- рддреАрди AZs ├Ч рддреАрди tiers тАФ рдирдК subnets, рдкреНрд░рддреНрдпреЗрдХ tier рдЪреА рд╕реНрд╡рддрдГрдЪреА route table:
- public тАФ
0.0.0.0/0 тЖТ igw; рдлрдХреНрдд load balancers рдЖрдгрд┐ NAT gateways. - app тАФ
0.0.0.0/0 тЖТ the NAT gateway in the same AZ, рдЖрдгрд┐ endpoint routes. - data тАФ
0.0.0.0/0route рдирд╛рд╣реА; рдлрдХреНрдд endpoint routes.
- public тАФ
- рдкреНрд░рддреНрдпреЗрдХ AZ рд▓рд╛ рдПрдХ NAT gateway тАФ рдПрдХ AZ рдмрдВрдж рдкрдбрд▓рд╛ рддрд░реА рдмрд╛рдХреАрдЪреЗ AZs рдмрд╛рд╣реЗрд░ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдЖрдгрд┐ traffic AZs рдУрд▓рд╛рдВрдбрдд рдирд╛рд╣реА (cross-AZ data рд▓рд╛ рдЦрд░реНрдЪ рд▓рд╛рдЧрддреЛ). NAT gateway рдЪрд╛ рдЦрд░реНрдЪ рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рдЖрдгрд┐ рдкреНрд░рддрд┐ GB (рдЕрдиреЗрдХ Regions рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХреА рд╕рд╛рдзрд╛рд░рдг $0.045), рдореНрд╣рдгреВрди data рдЪреНрдпрд╛ рдЖрдзреАрдЪ рддреАрди NAT рд╕рд╛рдзрд╛рд░рдг $100 рджрд░рдорд╣рд╛ тАФ AZ outage рдордзреНрдпреЗ рдЯрд┐рдХрдгреНрдпрд╛рдЪреА рдХрд┐рдВрдордд. NAT рд╢рд╛рд│рд╛ рдкрд╛рд╣рд╛.
- рдкреНрд░рддреНрдпреЗрдХ private route table рд╡рд░ S3 рдЖрдгрд┐ DynamoDB рд╕рд╛рдареА Gateway endpoints тАФ рдореЛрдлрдд.
- рд╕рдВрджрд░реНрднрд╛рдиреЗ security groups тАФ ALB SG тЖТ app SG тЖТ db SG (рдзрдбрд╛ 06).
- рд╕рдВрдкреВрд░реНрдг VPC рд╕рд╛рдареА Flow logs рдЪрд╛рд▓реВ (рдзрдбрд╛ 11).
- рд╡рд╛рдвреАрд╕рд╛рдареА рдЬрд╛рдЧрд╛ тАФ рдкрд╣рд┐рд▓реНрдпрд╛рдЪ рджрд┐рд╡рд╢реА рд╕рдВрдкреВрд░реНрдг range рд╡рд╛рдЯреВрди рдЯрд╛рдХреВ рдирдХрд╛. рддреБрдореНрд╣реА рдирдВрддрд░ secondary CIDR
blocks рдЬреЛрдбреВ рд╢рдХрддрд╛ (default quota рдкреНрд░рдорд╛рдгреЗ рдкреНрд░рддреНрдпреЗрдХ VPC рд▓рд╛ рдереЛрдбреЗрдЪ, рд╡рд╛рдврд╡рддрд╛ рдпреЗрддреЗ);
рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдЕрдиреЗрдХ EKS clusters pods рдирд╛
100.64.0.0/16рд╕рд╛рд░рдЦреНрдпрд╛ secondary range рдордзреНрдпреЗ рдареЗрд╡рддрд╛рдд. рдирд╡реНрдпрд╛ ranges рдХрдВрдкрдиреАрдЪреНрдпрд╛ рдЖрд░рд╛рдЦрдбреНрдпрд╛рддреВрди рдШреНрдпрд╛ (IPAM, рдзрдбрд╛ 02). - рдкреНрд░рддреНрдпреЗрдХ environment рд▓рд╛ рдПрдХ VPC (рдмрд╣реБрддреЗрдХрджрд╛ рдкреНрд░рддреНрдпреЗрдХ account рд▓рд╛): prod рдЖрдгрд┐ dev рдХрдзреАрдЪ рдПрдХ campus share рдХрд░рдд рдирд╛рд╣реАрдд. рдЧрд░рдЬ рдЕрд╕реЗрд▓ рддрд┐рдереЗ рддреНрдпрд╛рдВрдирд╛ Transit Gateway рдиреЗ рдЬреЛрдбрд╛ (рдзрдбрд╛ 10).
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг servers рдиреА рднрд░рд▓реНрдпрд╛рд╡рд░ VPC рдмрджрд▓рдгреЗ рдХрдареАрдг рдЕрд╕рддреЗ. рдЖрд░рд╛рдЦрдбрд╛ рдард░рд╡рддреЛ рддреБрдордЪрд╛ blast radius (рдПрдХ AZ, рдПрдХ tier), рддреБрдордЪреЗ рдмрд┐рд▓ (NAT рдЖрдгрд┐ cross-AZ data), рддреБрдордЪреА audit рдЙрддреНрддрд░реЗ ("database рд▓рд╛ internet рдХрдбреЗ route рдирд╛рд╣реА") рдЖрдгрд┐ рдкреБрдврдЪреНрдпрд╛ рд╡рд░реНрд╖реА рддреБрдореНрд╣реА рдХрд╢рд╛рд╢реАрд╣реА рдЬреЛрдбреВ рд╢рдХрд╛рд▓ рдХреА рдирд╛рд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
vpc/demo.py рдордзрд▓реЗ design() plan_subnets(VPC, 20, [...], AZS) рдмреЛрд▓рд╛рд╡рддреЗ,
рдирдК /20 subnets рдХрд┐рддреА рдкрддреНрддреЗ рдШреЗрддрд╛рдд рддреНрдпрд╛рдВрдЪреА рдмреЗрд░реАрдЬ рдХрд░рддреЗ, рдЖрдгрд┐ рдХрд┐рддреА рдЙрд░рд▓реЗ рддреЗ рдЫрд╛рдкрддреЗ. рдзрдбрд╛ 05 рдордзрд▓рд╛ lab campus
рдЖрдзреАрдЪ tier рдЪреЗ рдирд┐рдпрдо рдкрд╛рд│рддреЛ: rt-data рдордзреНрдпреЗ рдлрдХреНрдд local рдЖрдгрд┐ pl-s3 рдЖрд╣реЗрдд.
Snippet рд╣реЗ рд╕рд┐рджреНрдз рдХрд░рддреЛ, рдЖрдгрд┐ рдЖрд░рд╛рдЦрдбреНрдпрд╛рдд overlaps рдЖрд╣реЗрдд рдХрд╛ рддреЗ рддрдкрд╛рд╕рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 vpc/demo.py design
python3 - <<'EOF'
import sys, ipaddress; sys.path.insert(0, "vpc"); from network import plan_subnets, overlaps
from demo import campus, VPC, AZS, PL
c = campus()
print("data wing тЖТ internet:", c.rts["rt-data"].lookup("93.184.216.34", PL))
print("data wing тЖТ S3: ", c.rts["rt-data"].lookup("52.219.40.10", PL))
plan = plan_subnets(VPC, 20, ["public", "app", "data"], AZS)
print("any overlap in the plan:", any(overlaps(a[2], b[2]) for i, a in enumerate(plan) for b in plan[i+1:]))
print("last planned wing:", plan[-1])
nxt = ipaddress.ip_network("10.20.144.0/20")
print("next free /20:", nxt, "overlaps the plan?", any(overlaps(str(nxt), p[2]) for p in plan))
print("secondary CIDR 100.64.0.0/16 overlaps the campus?", overlaps(VPC, "100.64.0.0/16"))
EOF
python3 vpc/test_vpc.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
design рд╣реЗ рдЫрд╛рдкрддреЗ:
тФАтФА a production campus: 3 AZs ├Ч (public ┬╖ app ┬╖ data), one NAT per AZ, S3 + DynamoDB gateway endpoints, flow logs on
9 subnets use 36,864 of 65,536 addresses тАФ 28,672 left for growth (EKS pods eat addresses fast)
public: load balancers + NAT only ┬╖ app: desks, no public IPs ┬╖ data: databases, no route to the internet at all
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ: data wing тЖТ internet: (None, None),
data wing тЖТ S3: ('pl-s3', 'vpce-s3'), any overlap in the plan: False,
last planned wing: ('data', 'ap-south-1c', '10.20.128.0/20'),
next free /20: 10.20.144.0/20 overlaps the plan? False рдЖрдгрд┐
secondary CIDR 100.64.0.0/16 overlaps the campus? False. Tests рд╢реЗрд╡рдЯреА
12/12 passed рдЫрд╛рдкрддрд╛рдд.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА рдЕрд╕рд╛ campus рдорд╛рдВрдбреВ рд╢рдХрддрд╛ рдЬреЛ рдПрдЦрд╛рджреА рдЗрдорд╛рд░рдд рдЧреЗрд▓реА рддрд░реА рдЯрд┐рдХрддреЛ, рдЖрдкрд▓рд╛ data wing internet рдкрд╛рд╕реВрди рджреВрд░ рдареЗрд╡рддреЛ, S3 рд╕рд╛рдареА NAT рдЯреЛрд▓ рднрд░рдд рдирд╛рд╣реА тАФ рдЖрдгрд┐ рддрд░реАрд╣реА рдкреБрдврдЪреНрдпрд╛ wing рд╕рд╛рдареА рддреНрдпрд╛рдд рдЬрд╛рдЧрд╛ рдЖрд╣реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рддреАрди AZs рд╕рд╛рдареА рдПрдХрдЪ NAT gateway тАФ рдПрдХрд╛ AZ рдЪреНрдпрд╛ outage рдиреЗ рд╕рдЧрд│реНрдпрд╛рдВрдЪрд╛ рдмрд╛рд╣реЗрд░рдЪрд╛ рдорд╛рд░реНрдЧ рддреБрдЯрддреЛ, рдЖрдгрд┐ cross-AZ data рдЪреЗ рдмрд┐рд▓ рд▓рд╛рдЧрддреЗ
- "рдХрджрд╛рдЪрд┐рдд рд▓рд╛рдЧреЗрд▓ рдореНрд╣рдгреВрди"
0.0.0.0/0 тЖТ natрдЕрд╕рд▓реЗрд▓рд╛ data subnet - S3 gateway endpoint рдирд╛рд╣реА, рддреНрдпрд╛рдореБрд│реЗ backups рд╡рд░ NAT рдЪрд╛ рдкреНрд░рддрд┐-GB рдЦрд░реНрдЪ
- рдкрд╣рд┐рд▓реНрдпрд╛рдЪ рджрд┐рд╡рд╢реА рд╕рдВрдкреВрд░реНрдг
/16рдХрд╛рдкреВрди рдЯрд╛рдХрдгреЗ тАФ EKS рдХрд┐рдВрд╡рд╛ рдирд╡реНрдпрд╛ tier рд╕рд╛рдареА рдХрд╛рд╣реАрдЪ рдЙрд░рдд рдирд╛рд╣реА - "рдкреИрд╕реЗ рд╡рд╛рдЪрд╡рдгреНрдпрд╛рд╕рд╛рдареА" dev рдЖрдгрд┐ prod рдПрдХрд╛рдЪ VPC рдордзреНрдпреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдмрд╣реБрддреЗрдХ teams рд╣реЗ рд╣рд╛рддрд╛рдиреЗ рди рдмрд╛рдВрдзрддрд╛ test рдХреЗрд▓реЗрд▓реНрдпрд╛ module рдордзреВрди рдмрд╛рдВрдзрддрд╛рдд.
рдЦрд▒реНрдпрд╛ account рд╡рд░ (Terraform рдЖрдгрд┐ AWS credentials рд▓рд╛рдЧрддрд╛рдд; values рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ рдЖрд╣реЗрдд):
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0" # pin the version you have tested
name = "school-prod"
cidr = "10.20.0.0/16"
azs = ["ap-south-1a", "ap-south-1b", "ap-south-1c"]
public_subnets = ["10.20.0.0/20", "10.20.16.0/20", "10.20.32.0/20"]
private_subnets = ["10.20.48.0/20", "10.20.64.0/20", "10.20.80.0/20"]
database_subnets = ["10.20.96.0/20", "10.20.112.0/20", "10.20.128.0/20"]
create_database_subnet_route_table = true # data wing: its own table, no NAT route
enable_nat_gateway = true
one_nat_gateway_per_az = true
enable_flow_log = true
create_flow_log_cloudwatch_log_group = true
create_flow_log_cloudwatch_iam_role = true
}
resource "aws_vpc_endpoint" "s3" {
vpc_id = module.vpc.vpc_id
service_name = "com.amazonaws.ap-south-1.s3"
vpc_endpoint_type = "Gateway"
route_table_ids = concat(module.vpc.private_route_table_ids, module.vpc.database_route_table_ids)
}
рдордЧ рдзрдбрд╛ 11 рдордзрд▓реНрдпрд╛ tools рдиреЗ рд╣реЗ рд╕рд┐рджреНрдз рдХрд░рд╛: database рдкрд╛рд╕реВрди internet gateway рдкрд░реНрдпрдВрддрдЪрд╛ Reachability Analyzer path not reachable рдЕрд╕рд╛рдЪ рдкрд░рдд рдпрд╛рдпрд▓рд╛ рд╣рд╡рд╛.
ЁЯОУ Campus рдЖрддрд╛ рддреБрдордЪрд╛ рдЖрд╣реЗ
рдХреБрдВрдкрдг рдШрд╛рддрд▓реЗрд▓рд╛ campus тЖТ рдШрд░ рдирдВрдмрд░ тЖТ рддреАрди рдЗрдорд╛рд░рддреАрдВрдордзрд▓реЗ wings тЖТ corridor рдЪреНрдпрд╛ рдкрд╛рдЯреНрдпрд╛ тЖТ рдореБрдЦреНрдп рджрд░рд╡рд╛рдЬрд╛ тЖТ рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреНрдпрд╛ рдпрд╛рджреНрдпрд╛ рдЖрдгрд┐ wing рдЪреА рджрд╛рд░реЗ тЖТ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рдХрдбреЗ рдмреЛрдЧрджрд╛ тЖТ phone book тЖТ рднрд╛рдЧреАрджрд╛рд░рд╛рдХрдбреЗ corridor тЖТ bus station тЖТ рдиреЛрдВрджрд╡рд╣реА рдЖрдгрд┐ рдорд╛рд░реНрдЧрд╛рд╡рд░реВрди рдЪрд╛рд▓рдгреЗ тЖТ рдЯрд┐рдХрдгреНрдпрд╛рд╕рд╛рдареА рдмрд╛рдВрдзрд▓реЗрд▓рд╛ campus. рддреБрдореНрд╣реА рдлрдХреНрдд VPC рд╢рд┐рдХрд▓рд╛ рдирд╛рд╣реАрдд тАФ рддреБрдореНрд╣реА campus рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рдХрд░реВ рд╢рдХрддрд╛, рддреЛ рдЬреЛрдбреВ рд╢рдХрддрд╛ рдЖрдгрд┐ debug рдХрд░реВ рд╢рдХрддрд╛. ЁЯПлЁЯОУ
рд╢рд╛рд│реЗрддреАрд▓ рдкреБрдврдЪреА рджрд╛рд░реЗ: NAT рд╢рд╛рд│рд╛ private wings рдЬреНрдпрд╛рддреВрди рдмрд╛рд╣реЗрд░ рдЬрд╛рддрд╛рдд рддреЗ рдмрд╛рдЬреВрдЪреЗ рджрд╛рд░ рдмрд╛рдВрдзрддреЗ; EC2 рд╢рд╛рд│рд╛ рд╣реЗ wings desks рдиреА рднрд░рддреЗ; Networking рд╢рд╛рд│рд╛ IP, TCP рдЖрдгрд┐ DNS рдордзреНрдпреЗ рдЕрдзрд┐рдХ рдЦреЛрд▓рд╡рд░ рдЬрд╛рддреЗ.
git checkout main
python3 vpc/demo.py # one last run, for fun