ЁЯЪЗ рдзрдбрд╛ 07 тАФ VPC endpoints: AWS services рдкрд░реНрдпрдВрддрдЪрд╛ рдЦрд╛рдЬрдЧреА рдмреЛрдЧрджрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 07 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-06-sg-vs-nacl ┬╖ рдкреБрдврдЪрд╛: lesson-08-dns
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рднрд╛рдЧ 1 рдордзрд▓рд╛ рд╕рдВрдкреВрд░реНрдг campus, рдЖрдгрд┐ рджрд░рд╡рд╛рдЬрд╛ рдирд╕рд▓реЗрд▓рд╛ рдкрд╣рд┐рд▓рд╛ рдмрд╛рд╣реЗрд░рдЪрд╛ рдорд╛рд░реНрдЧ: S3 рд╕рд╛рдареА рдПрдХ gateway
endpoint. campus() (vpc/demo.py) рдордзреНрдпреЗ рджреЛрдиреНрд╣реА private route
tables рдордзреНрдпреЗ pl-s3 тЖТ vpce-s3 рдЖрд╣реЗ; endpoints() рджрд╛рдЦрд╡рддреЗ рдХреА S3 traffic app wing рдордзреВрди
(рдЬреНрдпрд╛рд▓рд╛ NAT рд╕реБрджреНрдзрд╛ рдЖрд╣реЗ) рдЖрдгрд┐ data wing рдордзреВрди (рдЬреНрдпрд╛рд▓рд╛ рджреБрд╕рд░реЗ рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА) рдХреБрдареЗ рдЬрд╛рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│рд╛ рдЖрдкрд▓реНрдпрд╛ рдЬреБрдиреНрдпрд╛ рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рдкреНрд░рд╢реНрдирдкрддреНрд░рд┐рдХрд╛ рдПрдХрд╛ рдореЛрдареНрдпрд╛ рд╢рд╣рд░рд╛рддреАрд▓ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рдд ЁЯЧДя╕П рдареЗрд╡рддреЗ тАФ рддреЗрдЪ S3. рд╣реЗ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп campus рдЪреНрдпрд╛ рдХреБрдВрдкрдгрд╛рдмрд╛рд╣реЗрд░ рдЖрд╣реЗ.
App wing рдПрдЦрд╛рджреНрдпрд╛ рдирд┐рд░реЛрдкреНрдпрд╛рд▓рд╛ рдмрд╛рдЬреВрдЪреНрдпрд╛ рджрд╛рд░рд╛рддреВрди (NAT) рдмрд╛рд╣реЗрд░, рд╢рд╣рд░рд╛рдЪреНрдпрд╛ рд░рд╕реНрддреНрдпрд╛рд╡рд░реВрди, рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рдкрд░реНрдпрдВрдд рдкрд╛рдард╡реВ рд╢рдХрддреЛ. рд╣реЗ рдЪрд╛рд▓рддреЗ тАФ рдкрдг рдкреНрд░рддреНрдпреЗрдХ рдлреЗрд░реАрд▓рд╛ рдЯреЛрд▓ рд▓рд╛рдЧрддреЛ, рдЖрдгрд┐ рдирд┐рд░реЛрдкреНрдпрд╛ рд░рд╕реНрддреНрдпрд╛рд╡рд░ рдЙрдШрдбреНрдпрд╛рд╡рд░ рдЕрд╕рддреЛ.
рдореНрд╣рдгреВрди рд╢рд╛рд│рд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ campus рдордзреВрди рдереЗрдЯ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рдд рдПрдХ рдЦрд╛рдЬрдЧреА рдмреЛрдЧрджрд╛ ЁЯЪЗ рдЦрдгрддреЗ. Corridor рд╡рд░рдЪреНрдпрд╛ рдкрд╛рдЯреАрд╡рд░ рдПрдХ рдирд╡реА рдУрд│ рдпреЗрддреЗ: "рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп тЖТ рдмреЛрдЧрджрд╛". рдЖрддрд╛ рдирд┐рд░реЛрдкреНрдпрд╛ рдХрдзреАрдЪ AWS рдмрд╛рд╣реЗрд░ рдЬрд╛рдд рдирд╛рд╣реА, рдЖрдгрд┐ рд╣рд╛ рдмреЛрдЧрджрд╛ рдореЛрдлрдд рдЖрд╣реЗ. рдЬреНрдпрд╛ data wing рд▓рд╛ рдХреЛрдгрддреЗрдЪ рджрд╛рд░ рдирд╛рд╣реА, рддреЛрд╕реБрджреНрдзрд╛ рдпрд╛ рдмреЛрдЧрджреНрдпрд╛рддреВрди рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪреВ рд╢рдХрддреЛ.
рд╢рд╣рд░рд╛рддрд▓реНрдпрд╛ рдЗрддрд░ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдВрд╕рд╛рдареА (рд░рд╛рдВрдЧрд╛, рдЧреБрдкрд┐рддреЗ, container images) рд╢рд╛рд│рд╛ рдЖрдкрд▓реНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ wing рдордзреНрдпреЗрдЪ рдПрдХ рдЫреЛрдЯреА рдЦрд╛рдЬрдЧреА рдЦрд┐рдбрдХреА ЁЯкЯ рдмрд╕рд╡реВ рд╢рдХрддреЗ тАФ campus рдЪрд╛ рдирдВрдмрд░ рдЕрд╕рд▓реЗрд▓реЗ рдПрдХ desk, рдЬреЗ рдереЗрдЯ рддреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рд╢реА рдмреЛрд▓рддреЗ. рддреНрдпрд╛ рдЦрд┐рдбрдХреАрдЪреЗ рднрд╛рдбреЗ рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рд▓рд╛рдЧрддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
app["ЁЯЦея╕П app wing<br/>rt-private-a"]
data["ЁЯЧДя╕П data wing<br/>rt-data"]
nat["ЁЯЪк nat-a<br/>paid per GB"]
vpce["ЁЯЪЗ vpce-s3<br/>gateway endpoint ┬╖ free"]
s3["ЁЯкг S3 52.219.40.10"]
app -->|"pl-s3 beats 0.0.0.0/0"| vpce
data -->|"pl-s3 тАФ the only way out"| vpce
vpce --> s3
app -.->|"without the endpoint"| nat -.-> s3
ЁЯЧ║я╕П рд░реЗрдЦрд╛рдЯрд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/vpc/lesson-diagrams.html#l07
тЭУ рдХрд╛рдп
- Gateway endpoint тАФ рдлрдХреНрдд S3 рдЖрдгрд┐ DynamoDB рд╕рд╛рдареА. рд╣реЗ рддреБрдордЪреНрдпрд╛ route tables рдордзрд▓реЗ
рдПрдХ target рдЖрд╣реЗ: AWS рдПрдХ route рдЬреЛрдбрддреЗ рдЬреНрдпрд╛рдЪреЗ destination рддреНрдпрд╛ service рдЪреА prefix list
(
pl-тАж) рдЕрд╕рддреЗ рдЖрдгрд┐ target endpoint (vpce-тАж) рдЕрд╕рддреЛ. Endpoint рд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рддреВрди рдЬрд╛рдгрд╛рд▒реНрдпрд╛ data рд╕рд╛рдареА рдХреЛрдгрддрд╛рд╣реА рдЦрд░реНрдЪ рдирд╛рд╣реА. рд╣реЗ рдлрдХреНрдд VPC рдЪреНрдпрд╛ рдЖрдд рд╕реБрд░реВ рд╣реЛрдгрд╛рд▒реНрдпрд╛ traffic рд╕рд╛рдареА рдЪрд╛рд▓рддреЗ тАФ VPN рд╡рд░реВрди on-premises рдордзреВрди рдирд╛рд╣реА, peered VPC рдордзреВрдирд╣реА рдирд╛рд╣реА. - Interface endpoint (AWS PrivateLink) тАФ рддреБрдореНрд╣реА рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ subnet рдордзреНрдпреЗ private IP
рдЕрд╕рд▓реЗрд▓реЗ рдПрдХ elastic network interface, рдЕрдиреЗрдХ services рд╕рд╛рдареА: SQS, ECR, STS, Secrets Manager,
CloudWatch, рдЖрдгрд┐ рдЖрдгрдЦреА (S3 рд╕рд╛рдареАрд╣реА рдПрдХ рдЖрд╣реЗ). рддреНрдпрд╛рд▓рд╛ security group рдЕрд╕рддреЛ. Private DNS
рдЪрд╛рд▓реВ рдЕрд╕реЗрд▓ рддрд░ service рдЪреЗ рдиреЗрд╣рдореАрдЪреЗ рдирд╛рд╡ (рдЬрд╕реЗ
sqs.ap-south-1.amazonaws.com) рддреБрдордЪреНрдпрд╛ VPC рдЪреНрдпрд╛ рдЖрдд private IP рдордзреНрдпреЗ resolve рд╣реЛрддреЗ. рдЦрд░реНрдЪ рдкреНрд░рддрд┐ AZ рдкреНрд░рддрд┐ рддрд╛рд╕ рдЖрдгрд┐ рдкреНрд░рддрд┐ GB (рдЕрдиреЗрдХ Regions рдордзреНрдпреЗ рд╕рд╛рдзрд╛рд░рдг $0.01 рдкреНрд░рддрд┐ AZ-hour рдЖрдгрд┐ $0.01 рдкреНрд░рддрд┐ GB тАФ PrivateLink pricing page рддрдкрд╛рд╕рд╛). - Endpoint policy тАФ endpoint рд╡рд░рдЪреА resource-style policy: "рдпрд╛ рдмреЛрдЧрджреНрдпрд╛рддреВрди рдлрдХреНрдд рд╣реЗ buckets". рд╣реА рднрд╛рд╖рд╛ IAM рд╢рд╛рд│рд╛ рд╢рд┐рдХрд╡рддреЗ.
- NAT gateway тАФ рд╣рд╛рд╕реБрджреНрдзрд╛ private wings рдирд╛ S3 рдкрд░реНрдпрдВрдд рдиреЗрддреЛ, рдкрдг рдкреНрд░рддрд┐ рддрд╛рд╕ рдЖрдгрд┐ рдкреНрд░рддрд┐ GB рдЦрд░реНрдЪ рдШреЗрддреЛ (рдЕрдиреЗрдХ Regions рдордзреНрдпреЗ рд╕рд╛рдзрд╛рд░рдг $0.045 рдкреНрд░рддрд┐ GB), рдЖрдгрд┐ traffic public IP рдордзреВрди рдмрд╛рд╣реЗрд░ рдЬрд╛рддреЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг private wing рдордзрд▓реЗ рд╕рд░реНрд╡рд╛рдд рдореЛрдареЗ traffic рд╕рд╣рд╕рд╛ S3 рдЪреЗ рдЕрд╕рддреЗ тАФ backups, logs, data files тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ GB рд╡рд░ NAT рдЪрд╛ рдЯреЛрд▓ рднрд░рдгреЗ рд╢рд╛рдВрддрдкрдгреЗ рд╡рд╛рдврдд рдЬрд╛рддреЗ. рдЖрдгрд┐ рдХрд╛рд░рдг internet route рдЕрдЬрд┐рдмрд╛рдд рдирд╕рд▓реЗрд▓реНрдпрд╛ data wing рд▓рд╛ рд╕реБрджреНрдзрд╛ S3 рдЖрдгрд┐ рдХрд╛рд╣реА AWS APIs рд▓рд╛рдЧрддрд╛рдд: endpoints рддреНрдпрд╛рд▓рд╛ рдиреЗрдордХреЗ рддреЗрд╡рдвреЗрдЪ рджреЗрддрд╛рдд, рдЖрдгрд┐ рджреБрд╕рд░реЗ рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
vpc/demo.py рдордзрд▓реЗ PL = {"pl-s3": ["52.219.0.0/16", "3.5.0.0/16"]} рд╣реЗ
S3 prefix list рдЪреЗ рдПрдХ model рдЖрд╣реЗ (рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ ranges). RouteTable.lookup() pl-s3 рд▓рд╛
рддреНрдпрд╛рдЪреНрдпрд╛ ranges рдордзреНрдпреЗ рдЙрд▓рдЧрдбрддреЗ, рдореНрд╣рдгреВрди 52.219.40.10 рд╣рд╛ 52.219.0.0/16 рд╢реА рдЬреБрд│рддреЛ тАФ рдПрдХ /16, рдЬреЛ
0.0.0.0/0 рдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ specific рдЖрд╣реЗ тАФ рдЖрдгрд┐ endpoint NAT рд╡рд░ рдЬрд┐рдВрдХрддреЛ. рд╣реЗ рдзрдбрд╛ 04 рдордзрд▓реЗ
longest-prefix match рдЪ рдЖрд╣реЗ, рдирд╡реАрди рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 vpc/demo.py endpoints
python3 - <<'EOF'
import sys; sys.path.insert(0, "vpc")
from demo import campus, PL
c = campus()
for rt in ("rt-private-a", "rt-data"):
c.rts[rt].routes = [r for r in c.rts[rt].routes if r[0] != "pl-s3"] # delete the endpoint route
print(rt.ljust(13), "S3 via", c.rts[rt].lookup("52.219.40.10", PL))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
endpoints рд╣реЗ рдЫрд╛рдкрддреЗ:
rt-private-a тЖТ S3 52.219.40.10 via pl-s3 тЖТ vpce-s3
rt-data тЖТ S3 52.219.40.10 via pl-s3 тЖТ vpce-s3
рддреБрдордЪрд╛ snippet рдмреЛрдЧрджрд╛ рдХрд╛рдвреВрди рдЯрд╛рдХрддреЛ рдЖрдгрд┐ rt-private-a S3 via ('0.0.0.0/0', 'nat-a') рдЫрд╛рдкрддреЛ
тАФ app wing рдЕрдЬреВрдирд╣реА S3 рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддреЛ, рдкрдг рдЖрддрд╛ рдкреИрд╕реЗ рдШреЗрдгрд╛рд▒реНрдпрд╛ рдмрд╛рдЬреВрдЪреНрдпрд╛ рджрд╛рд░рд╛рддреВрди тАФ рдЖрдгрд┐
rt-data S3 via (None, None) тАФ data wing S3 рдкрд░реНрдпрдВрдд рдЕрдЬрд┐рдмрд╛рдд рдкреЛрд╣реЛрдЪреВ рд╢рдХрдд рдирд╛рд╣реА.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Endpoint рдореНрд╣рдгрдЬреЗ corridor рдЪреНрдпрд╛ рдкрд╛рдЯреАрд╡рд░рдЪреА рдлрдХреНрдд рдПрдХ рдЕрдзрд┐рдХ specific рдУрд│. рддреА рдЕрд╕реЗрд▓ рддрд░ S3 traffic NAT рдЯрд╛рд│рддреЗ; рддреА рдирд╕реЗрд▓ рддрд░ app wing рдЯреЛрд▓ рднрд░рддреЛ рдЖрдгрд┐ data wing рддреБрдЯрддреЛ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- S3 gateway endpoint рдирд╛рд╣реА тАФ рдкреНрд░рддреНрдпреЗрдХ backup рдЖрдгрд┐ log file рд╡рд░ NAT рдЪрд╛ рдЦрд░реНрдЪ рд▓рд╛рдЧрддреЛ
- gateway endpoint рддрдпрд╛рд░ рдХрд░рдгреЗ рдкрдг рддреЛ рдкреНрд░рддреНрдпреЗрдХ private route table рд╢реА associate рди рдХрд░рдгреЗ
- рдЬреНрдпрд╛рдЪрд╛ security group wings рдордзреВрди 443 рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд рдирд╛рд╣реА рдЕрд╕рд╛ interface endpoint
- private DNS рдмрдВрдж, рддреНрдпрд╛рдореБрд│реЗ SDK рдЕрдЬреВрдирд╣реА public рдирд╛рд╡ resolve рдХрд░рддреЛ рдЖрдгрд┐ NAT рдордзреВрди рдЬрд╛рддреЛ
- gateway endpoint on-premises рдордзреВрди рдХрд┐рдВрд╡рд╛ peered VPC рдордзреВрди рдЪрд╛рд▓реЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ тАФ рддреЛ рдЪрд╛рд▓рдд рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЬрд╡рд│рдЬрд╡рд│ рдкреНрд░рддреНрдпреЗрдХ VPC рд▓рд╛ рдкрд╣рд┐рд▓реНрдпрд╛рдЪ рджрд┐рд╡рд╢реА S3 рдЖрдгрд┐ DynamoDB gateway endpoints рдорд┐рд│рддрд╛рдд тАФ рдореЛрдлрдд, рдЖрдгрд┐ рддреЗ NAT рдЪреЗ рдмрд┐рд▓ рдХрдореА рдХрд░рддрд╛рдд. рдлрдХреНрдд private рдЕрд╕рд▓реЗрд▓реЗ VPCs ECR, STS, CloudWatch Logs рдЖрдгрд┐ Secrets Manager рд╕рд╛рдареА interface endpoints рдЬреЛрдбрддрд╛рдд, рдХрдзреА рдХрдзреА рддрд╛рд╕рд╛рдЪрд╛ рдЦрд░реНрдЪ рд╡рд╛рдЪрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХрд╛ рдордзреНрдпрд╡рд░реНрддреА VPC рдордзреВрди share рдХрд░реВрди.
рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд; IDs рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ рдЖрд╣реЗрдд):
aws ec2 create-vpc-endpoint --vpc-id vpc-0123456789abcdef0 --vpc-endpoint-type Gateway \
--service-name com.amazonaws.ap-south-1.s3 \
--route-table-ids rtb-0app000000000000a rtb-0data00000000000a
aws ec2 create-vpc-endpoint --vpc-id vpc-0123456789abcdef0 --vpc-endpoint-type Interface \
--service-name com.amazonaws.ap-south-1.ecr.api \
--subnet-ids subnet-0a subnet-0b subnet-0c --security-group-ids sg-0endpoints00000a \
--private-dns-enabled
aws ec2 describe-prefix-lists --query 'PrefixLists[].[PrefixListId,PrefixListName]' --output table
тПня╕П рдкреБрдвреЗ
Interface endpoint рдЪрд╛рд▓рд▓рд╛ рдХрд╛рд░рдг рдПрдХрд╛ рдирд╛рд╡рд╛рдЪреЗ private рдкрддреНрддреНрдпрд╛рдд рд░реВрдкрд╛рдВрддрд░ рдЭрд╛рд▓реЗ. рддреА рдирд╛рд╡реЗ рдХреЛрдг рд╕рд╛рдВрдЧрддреЗ? VPC рдордзрд▓реЗ DNS тАФ campus рдЪреА phone book.
git checkout lesson-08-dns