ЁЯМН рдзрдбрд╛ 03 тАФ UI рд╕рд╛рдареА CloudFront + S3: рдкреНрд░рддреНрдпреЗрдХ рджрд╛рд░рд╛рд╡рд░ рдЭреЗрд░реЙрдХреНрд╕ рдкреНрд░рддреА
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-measuring-load ┬╖ рдкреБрдвреЗ: lesson-04-dynamic-at-the-edge
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп рдкрд╣рд┐рд▓рд╛ tier: UI. Pages, scripts, styles рдЖрдгрд┐
рдЪрд┐рддреНрд░реЗ Amazon S3 рдордзреНрдпреЗ рд░рд╛рд╣рддрд╛рдд рдЖрдгрд┐ Amazon CloudFront рддреА рджреЗрддреЛ тАФ рдкреНрд░рддреНрдпреЗрдХ рднреЗрдЯ рджреЗрдгрд╛рд▒реНрдпрд╛рдЬрд╡рд│рдЪреНрдпрд╛
edge locations рд╡рд░ рдареЗрд╡рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреА. рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ TTLs рд╕рд╛рдареА рддреБрдореНрд╣реА hit ratio рдореЛрдЬрддрд╛,
рдЖрдгрд┐ invalidation рд╡ versioned file names рдкрд╛рд╣рддрд╛. scale/demo.py рдордзрд▓реЗ
cdn() рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рджрд╛рдЦрд╡рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЬрддреНрд░реЗрдЪреЗ рдПрдХрдЪ office рдЖрд╣реЗ, рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдордзреЛрдордз. рдЬрддреНрд░реЗрдЪрд╛ рдирдХрд╛рд╢рд╛ рд╣рд╡рд╛ рдЕрд╕рд▓реЗрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд▓рдХ office рдкрд░реНрдпрдВрдд рдЪрд╛рд▓рдд рдЬрд╛рддреЛ, рдерд╛рдВрдмрддреЛ, рдЖрдгрд┐ рдПрдХ рдкреНрд░рдд рдШреЗрддреЛ. рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА office рднрд░реВрди рдЬрд╛рддреЗ.
рдореНрд╣рдгреВрди рджреАрдкрд┐рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╛рдЯрдХрд╛рд╡рд░ рдПрдХ рдЭреЗрд░реЙрдХреНрд╕ рдЯреЗрдмрд▓ ЁЯУДЁЯЪк рдареЗрд╡рддреЗ. рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдмрд▓рд╛рд╡рд░ рдирдХрд╛рд╢рд╛рдЪреНрдпрд╛ рдкреНрд░рддреА рдЕрд╕рддрд╛рдд. рдкрд╛рд▓рдХ рдЬрд╡рд│рдЪреНрдпрд╛ рдлрд╛рдЯрдХрд╛рд╡рд░ рд╡рд┐рдЪрд╛рд░рддреЛ рдЖрдгрд┐ рд▓рдЧреЗрдЪ рдкреНрд░рдд рдорд┐рд│рд╡рддреЛ тАФ рд╣рд╛ hit. рдлрдХреНрдд рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджреНрдпрд╛ рдЯреЗрдмрд▓рд╛рд╡рд░ рдкреНрд░рддрдЪ рдирд╕рддреЗ, рдХрд┐рдВрд╡рд╛ рддреА рдкреНрд░рдд рдЦреВрдк рдЬреБрдиреА рдЕрд╕рддреЗ, рддреЗрд╡реНрд╣рд╛рдЪ рдПрдХ рдорджрддрдиреАрд╕ рдирд╡реА рдкреНрд░рдд рдЖрдгрд╛рдпрд▓рд╛ office рдХрдбреЗ рдзрд╛рд╡рддреЛ тАФ рд╣рд╛ miss.
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреАрд╡рд░ "рдЗрддрдХреНрдпрд╛ рд╡реЗрд│рдкрд░реНрдпрдВрдд рдЪрд╛рд▓реЗрд▓" рдЕрд╢реА рд╡реЗрд│ рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдЕрд╕рддреЗ тАФ рд╣рд╛ TTL. 1 рд╕реЗрдХрдВрдж рдЪрд╛рд▓рдгрд╛рд░реА рдкреНрд░рдд рдореНрд╣рдгрдЬреЗ рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛ office рдХрдбреЗ рдПрдХ рдлреЗрд░реА. 10 рд╕реЗрдХрдВрдж рдЪрд╛рд▓рдгрд╛рд░реА рдкреНрд░рдд рдореНрд╣рдгрдЬреЗ рджрд╣рд╛рдкрдЯ рдХрдореА рдлреЗрд▒реНрдпрд╛.
рдирдХрд╛рд╢рд╛ рдмрджрд▓рд▓рд╛ рдХреА рджреАрдкрд┐рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╛рдЯрдХрд╛рд▓рд╛ рдУрд░рдбреВрди рд╕рд╛рдВрдЧреВ рд╢рдХрддреЗ "рдЬреБрдиреЗ рдирдХрд╛рд╢реЗ рдлреЗрдХреВрди рджреНрдпрд╛!" (invalidation). рдХрд┐рдВрд╡рд╛ тАФ рддреНрдпрд╛рд╣реВрди рдЪрд╛рдВрдЧрд▓реЗ тАФ рддреА рдирд╡рд╛ рдирдХрд╛рд╢рд╛ рдирд╡реНрдпрд╛ рдирд╛рд╡рд╛рдиреЗ рдЫрд╛рдкрддреЗ: "рдирдХрд╛рд╢рд╛, version 2". рдХреЛрдгрддреНрдпрд╛рдЪ рдЯреЗрдмрд▓рд╛рд╡рд░ рдЕрдЬреВрди version 2 рдЪреА рдкреНрд░рдд рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдмрд▓ рддреА рдПрдХрджрд╛рдЪ рдЖрдгрддреЗ, рдЖрдгрд┐ рдХреБрдгреАрд╣реА рдЪреБрдХреВрди рдЬреБрдирд╛ рдирдХрд╛рд╢рд╛ рджреЗрдд рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
u1["ЁЯСк parent in Pune"] --> e1["ЁЯУД edge location<br/>Mumbai"]
u2["ЁЯСк parent in Delhi"] --> e2["ЁЯУД edge location<br/>Delhi"]
e1 -->|"miss"| rec["ЁЯЧДя╕П regional edge cache"]
e2 -->|"miss"| rec
rec -->|"miss"| s3["ЁЯкг S3 bucket (origin)<br/>private ┬╖ OAC"]
e1 -.->|"hit: answer at once"| u1
ttl["тП▓я╕П TTL 0 s тЖТ 3,000 to S3<br/>TTL 1 s тЖТ 359<br/>TTL 10 s тЖТ 36<br/>TTL 60 s тЖТ 6"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/scaling/lesson-diagrams.html#l03
тЭУ рдХрд╛рдп
- CDN (content delivery network) тАФ рддреБрдордЪреНрдпрд╛ files рдЪреНрдпрд╛ рдЕрдиреЗрдХ рдкреНрд░рддреА, users рдЬрд╡рд│ рдареЗрд╡рд▓реЗрд▓реНрдпрд╛. Amazon CloudFront рд╣рд╛ AWS рдЪрд╛ CDN рдЖрд╣реЗ.
- Edge location тАФ users рдЬрд╡рд│рдЪреЗ CloudFront рдЪреЗ рдард┐рдХрд╛рдг, рдЬрдЧрднрд░рд╛рдд рд╢реЗрдХрдбреЛ рдЬрд╛рдЧреА. рддреЗ рдкреНрд░рддреА рдареЗрд╡рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдВрддреВрдирдЪ рдЙрддреНрддрд░ рджреЗрддреЗ.
- Regional edge cache тАФ edge locations рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ origin рдордзрд▓рд╛ рдПрдХ рдореЛрдард╛ cache. Edge рд╡рд░ miss рдЭрд╛рд▓рд╛ рдХреА рдЖрдзреА рддреНрдпрд╛рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд▓реЗ рдЬрд╛рддреЗ, рддреНрдпрд╛рдореБрд│реЗ origin рдкрд░реНрдпрдВрдд рдХрдореА requests рдкреЛрд╣реЛрдЪрддрд╛рдд.
- Origin тАФ рдЦрд▒реНрдпрд╛ files рдЬрд┐рдереЗ рд░рд╛рд╣рддрд╛рдд рддреА рдЬрд╛рдЧрд╛: UI рд╕рд╛рдареА S3 bucket, рдХрд┐рдВрд╡рд╛ рддреБрдордЪрд╛ API (рдзрдбрд╛ 04).
- Cache hit / miss тАФ hit рд▓рд╛ рдкреНрд░рддреАрддреВрди рдЙрддреНрддрд░ рдорд┐рд│рддреЗ; miss рдЖрдгрдЦреА рдорд╛рдЧреЗ рдЬрд╛рддреЛ. Hit ratio = hits ├╖ рд╕рдЧрд│реНрдпрд╛ requests. 99% hit ratio рд▓рд╛ origin рд▓рд╛ load рдЪрд╛ рдлрдХреНрдд 1% рджрд┐рд╕рддреЛ.
- TTL (time to live) тАФ рдПрдХ рдкреНрд░рдд рдХрд┐рддреА рд╡реЗрд│ рдЪрд╛рд▓рддреЗ. CloudFront рддреЛ origin рдЪреНрдпрд╛
Cache-Controlheader рдордзреВрди рдШреЗрддреЛ (max-age, рдХрд┐рдВрд╡рд╛ CloudFront рд╕рд╛рд░рдЦреНрдпрд╛ shared caches рд╕рд╛рдареАs-maxage), cache policy рдЪреНрдпрд╛ minimum / maximum TTL рдЪреНрдпрд╛ рдЖрдд рдареЗрд╡реВрди. - Cache key тАФ рджреЛрди requests рдирд╛ "рдПрдХрдЪ file" рдард░рд╡рдгрд╛рд░реА рдЧреЛрд╖реНрдЯ: default рдореНрд╣рдгрдЬреЗ path. рдПрдЦрд╛рджреА cache policy query strings, headers рдХрд┐рдВрд╡рд╛ cookies рдЬреЛрдбреВ рд╢рдХрддреЗ. рдкреНрд░рддреНрдпреЗрдХ рдЬрд╛рджрд╛ рднрд╛рдЧ cache рд▓рд╛ рдЬрд╛рд╕реНрдд рдкреНрд░рддреАрдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрддреЛ рдЖрдгрд┐ hit ratio рдХрдореА рдХрд░рддреЛ.
- Invalidation тАФ TTL рд╕рдВрдкрдгреНрдпрд╛рдЖрдзреАрдЪ рдкреНрд░рддреА рдЯрд╛рдХреВрди рджреНрдпрд╛рдпрд▓рд╛ CloudFront рд▓рд╛ рд╕рд╛рдВрдЧрдгреЗ. рджрд░ рдорд╣рд┐рдиреНрдпрд╛рдЪреЗ рдкрд╣рд┐рд▓реЗ
1,000 paths рдореЛрдлрдд, рддреНрдпрд╛рдирдВрддрд░ рдкреНрд░рддреНрдпреЗрдХ path рдЪреЗ рдкреИрд╕реЗ рд▓рд╛рдЧрддрд╛рдд (wildcard
/*рдПрдХ path рдореНрд╣рдгреВрди рдореЛрдЬрд▓рд╛ рдЬрд╛рддреЛ). - Versioned file names тАФ
app.jsрдРрд╡рдЬреАapp.3f9c.js. рдирд╡реА release рдореНрд╣рдгрдЬреЗ рдирд╡реА cache key, рдореНрд╣рдгреВрди invalidate рдХрд░рд╛рдпрд▓рд╛ рдХрд╛рд╣реАрдЪ рдЙрд░рдд рдирд╛рд╣реА. Build tools (Vite, webpack) рд╣реЗ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдХрд░рддрд╛рдд. - OAC (origin access control) тАФ рдлрдХреНрдд рддреБрдордЪреНрдпрд╛ CloudFront distribution рд▓рд╛рдЪ S3 bucket рд╡рд╛рдЪреВ рджреЗрддреЗ. Bucket private рд░рд╛рд╣рддреЗ; рдХреБрдгреАрд╣реА CDN рд▓рд╛ рд╡рд│рд╕рд╛ рдШрд╛рд▓реВ рд╢рдХрдд рдирд╛рд╣реА.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рдмрд╣реБрддреЗрдХ requests рддреНрдпрд╛рдЪ рдореЛрдЬрдХреНрдпрд╛ files рд╕рд╛рдареА рдЕрд╕рддрд╛рдд: home page, script, style sheet, рд╢рд╛рд│реЗрдЪрд╛ logo. рддреНрдпрд╛ рдПрдХрд╛рдЪ origin рд╡рд░реВрди рджреЗрдгреЗ рдореНрд╣рдгрдЬреЗ рддреЛ рд╡рд╛рдпрд╛ рдШрд╛рд▓рд╡рдгреЗ; рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд▓рдХрд╛рдЬрд╡рд│рдЪреНрдпрд╛ edges рд╡рд░реВрди рджреЗрдгреЗ рддреНрдпрд╛рдВрдирд╛ рдЬрд▓рдж рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ servers рд╡рд░рдЪрд╛ рднрд╛рд░ рдХрдореА рдХрд░рддреЗ. UI tier scale рдХрд░рд╛рдпрд▓рд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдЖрд╣реЗ: рддреНрдпрд╛рдЪрд╛ рдмрд╣реБрддреЗрдХ рднрд╛рдЧ рд╕рдЧрд│реАрдХрдбреЗ copy рдХрд░рддрд╛ рдпреЗрддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
scale/sim.py рдордзрд▓реЗ EdgeCache(ttl) рдореНрд╣рдгрдЬреЗ рдПрдХ edge location. get(path, t)
рдХрдбреЗ ttl рд╕реЗрдХрдВрджрд╛рдВрдкреЗрдХреНрд╖рд╛ рдирд╡реА рдкреНрд░рдд рдЕрд╕реЗрд▓ рддрд░ рддреЗ HIT рдкрд░рдд рдХрд░рддреЗ; рдирд╛рд╣реАрддрд░ рддреЗ рдирд╡реА рдкреНрд░рдд рдШреЗрддреЗ
(MISS, origin рд▓рд╛ рдПрдХ request). fair_traffic(60, 50, PAGES) рдПрдХрд╛ рдорд┐рдирд┐рдЯрд╛рдЪреЗ traffic рдмрдирд╡рддреЗ тАФ
6 pages рд╡рд░ 50 req/s, рдЬрд┐рдереЗ рд▓реЛрдХрдкреНрд░рд┐рдп pages рдЦреВрдк рдЬрд╛рд╕реНрдд рд╡реЗрд│рд╛ рдорд╛рдЧрд┐рддрд▓реА рдЬрд╛рддрд╛рдд (Zipf рд╕рд╛рд░рдЦреЗ
рд╡рд╛рдЯрдк). cdn() рддреЗ TTL 0, 1, 10 рдЖрдгрд┐ 60 рд▓рд╛ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рддреЗ, рдордЧ /app.js рдЪреА рдПрдХ рджрд┐рд╡рд╕рд╛рдЪреА рдкреНрд░рдд,
рдПрдХ invalidation, рдЖрдгрд┐ versioned-name рдЪреА рдХрд▓реНрдкрдирд╛ рджрд╛рдЦрд╡рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 scale/demo.py cdn
python3 - <<'EOF'
import sys; sys.path.insert(0, "scale"); from sim import EdgeCache, fair_traffic; from demo import PAGES
from collections import Counter
traffic = fair_traffic(60, 50, PAGES)
for p, n in Counter(p for _, p in traffic).most_common(): print(f"{p:<24} {n:>4} requests")
for ttl in (2, 5, 30, 300):
e = EdgeCache(ttl)
for t, p in traffic: e.get(p, t)
print(f"TTL {ttl:>3} s тЖТ hit ratio {e.hit_ratio():6.1%} ┬╖ origin sees {e.misses:>4}")
e = EdgeCache(31536000)
print("app.3f9c.js:", e.get("/app.3f9c.js", 0), e.get("/app.3f9c.js", 60), "┬╖ new release app.7b21.js:", e.get("/app.7b21.js", 61))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
cdn рд╣реЗ print рдХрд░рддреЗ:
тФАтФА 3,000 requests in one minute for 6 pages, popular pages asked far more
TTL 0 s тЖТ hit ratio 0.0% ┬╖ origin (S3) sees 3,000 requests
TTL 1 s тЖТ hit ratio 88.0% ┬╖ origin (S3) sees 359 requests
TTL 10 s тЖТ hit ratio 98.8% ┬╖ origin (S3) sees 36 requests
TTL 60 s тЖТ hit ratio 99.8% ┬╖ origin (S3) sees 6 requests
тФАтФА /app.js cached for a day: MISS then HIT; new release тЖТ invalidate тЖТ MISS
рддреБрдордЪрд╛ snippet рдЖрдзреА рд╡рд╛рдЯрдк print рдХрд░рддреЛ тАФ / 1190 requests, /results 645,
/results/3A 416, /app.js 287, /style.css 252, /photos/sports-day.jpg 210 тАФ
рдордЧ:
TTL 2 s тЖТ hit ratio 94.0% ┬╖ origin sees 180
TTL 5 s тЖТ hit ratio 97.6% ┬╖ origin sees 72
TTL 30 s тЖТ hit ratio 99.6% ┬╖ origin sees 12
TTL 300 s тЖТ hit ratio 99.8% ┬╖ origin sees 6
app.3f9c.js: MISS HIT ┬╖ new release app.7b21.js: MISS
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Cache рдирд╕рддрд╛рдирд╛ (TTL 0) origin рд▓рд╛ рд╕рдЧрд│реНрдпрд╛ 3,000 requests рджрд┐рд╕рддрд╛рдд. 1 рд╕реЗрдХрдВрджрд╛рдЪреА рдкреНрд░рддрдЪ рддреНрдпрд╛рдВрдкреИрдХреА 88% рдХрд╛рдвреВрди рдЯрд╛рдХрддреЗ; 10 рд╕реЗрдХрдВрдж 98.8% рдХрд╛рдврддрд╛рдд. рд╕реБрдорд╛рд░реЗ 60 s рдирдВрддрд░ рд╡рдХреНрд░ рд╕рдкрд╛рдЯ рд╣реЛрддреЛ тАФ 6 misses рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ page рд╕рд╛рдареА рдПрдХ, рддреЗ рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛ рдорд╛рдЧрд┐рддрд▓реЗ рдЬрд╛рддреЗ рддреЗрд╡реНрд╣рд╛. рдЖрдгрд┐ рдирд╡реЗ file name рдЖрдкреЛрдЖрдкрдЪ miss рдЕрд╕рддреЗ: invalidation рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- CloudFront + OAC рдорд╛рдЧрдЪреНрдпрд╛ private bucket рдРрд╡рдЬреА public S3 bucket (website endpoint)
index.htmlрдПрдХ рд╡рд░реНрд╖рд╛рд╕рд╛рдареА cache рдХреЗрд▓реЗрд▓реЗ тАФ рддреНрдпрд╛рдд versioned files рдЪреА рдирд╛рд╡реЗ рдЕрд╕рддрд╛рдд, рдореНрд╣рдгреВрди рддреЗ рдХрдореА рд╡реЗрд│рдЪ рд░рд╛рд╣рд┐рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ (no-cacheрдХрд┐рдВрд╡рд╛ рд▓рд╣рд╛рдиmax-age); рдлрдХреНрдд versioned files рдирд╛max-age=31536000, immutableрдорд┐рд│рддреЗ- versioned names рд╡рд╛рдкрд░рдгреНрдпрд╛рдРрд╡рдЬреА рдкреНрд░рддреНрдпреЗрдХ deploy рд▓рд╛
/*invalidate рдХрд░рдгреЗ - рдкреНрд░рддреНрдпреЗрдХ header рдЖрдгрд┐ cookie cache key рдордзреНрдпреЗ рдЯрд╛рдХрдгреЗ тАФ рдкреНрд░рддреНрдпреЗрдХ рдЬрдг cache рд╡рд┐рднрд╛рдЧрддреЛ рдЖрдгрд┐ hit ratio рдШрд╕рд░рддреЛ
- рдПрдХ edge location рдореНрд╣рдгрдЬреЗ рдПрдХ cache рд╣реЗ рд╡рд┐рд╕рд░рдгреЗ: lab рдордзреНрдпреЗ рдПрдХ рдЖрд╣реЗ; рдЦрд▒реНрдпрд╛ distribution рдордзреНрдпреЗ рд╢реЗрдХрдбреЛ рдЕрд╕рддрд╛рдд, рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ misses (рдзрдбрд╛ 04 рдЖрдгрдЦреА edges рдЬреЛрдбрддреЛ)
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
On a real account тАФ build рдпреЛрдЧреНрдп headers рд╕рд╣ upload рдХрд░рд╛: versioned files рдПрдХ рд╡рд░реНрд╖рд╛рд╕рд╛рдареА,
index.html рддрдкрд╛рд╕рд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдХрдзреАрдЪ cache рдирд╛рд╣реА:
aws s3 sync dist/ s3://school-ui-prod/ --exclude index.html \
--cache-control "public, max-age=31536000, immutable"
aws s3 cp dist/index.html s3://school-ui-prod/index.html --cache-control "no-cache"
aws cloudfront create-invalidation --distribution-id E1A2B3C4D5E6F7 --paths "/index.html"
Terraform тАФ рдПрдХ private bucket, OAC, рдЖрдгрд┐ AWS managed CachingOptimized cache policy рд╡рд╛рдкрд░рдгрд╛рд░реЗ distribution:
resource "aws_cloudfront_origin_access_control" "ui" {
name = "school-ui-oac"
origin_access_control_origin_type = "s3"
signing_behavior = "always"
signing_protocol = "sigv4"
}
resource "aws_cloudfront_distribution" "ui" {
enabled = true
default_root_object = "index.html"
origin {
domain_name = aws_s3_bucket.ui.bucket_regional_domain_name
origin_id = "s3-ui"
origin_access_control_id = aws_cloudfront_origin_access_control.ui.id
}
default_cache_behavior {
target_origin_id = "s3-ui"
viewer_protocol_policy = "redirect-to-https"
allowed_methods = ["GET", "HEAD"]
cached_methods = ["GET", "HEAD"]
compress = true
cache_policy_id = "658327ea-f89d-4fab-a63d-7e88639e58f6" # Managed-CachingOptimized
}
restrictions { geo_restriction { restriction_type = "none" } }
viewer_certificate { cloudfront_default_certificate = true }
}
Bucket policy рдлрдХреНрдд рдпрд╛рдЪ distribution рд▓рд╛ рд╡рд╛рдЪреВ рджреЗрддреЗ (AWS:SourceArn рдореНрд╣рдгрдЬреЗ distribution рдЪрд╛ ARN):
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "Service": "cloudfront.amazonaws.com" },
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::school-ui-prod/*",
"Condition": { "StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/E1A2B3C4D5E6F7" } }
}]
}
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: CloudFront console рдордзреНрдпреЗ distribution рдЪрд╛ cache hit rate рдкрд╛рд╣рд╛. Static UI 90% рдЪреНрдпрд╛ рдмрд▒реНрдпрд╛рдЪ рд╡рд░ рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡рд╛. рдирд╕реЗрд▓, рддрд░ cache key (query strings, cookies, headers) рдЖрдгрд┐ рддреБрдордЪрд╛ build рдкрд╛рдард╡рддреЛ рддреЛ
Cache-Controlрддрдкрд╛рд╕рд╛.
тПня╕П рдкреБрдвреЗ
рдХрдзреАрдЪ рди рдмрджрд▓рдгрд╛рд▒реНрдпрд╛ files рд╕реЛрдкреНрдпрд╛ рдЖрд╣реЗрдд. рдкрдг рд╢рд┐рдХреНрд╖рд┐рдХреЗрдиреЗ grade save рдХреЗрд▓реА рдХреА /results/3A рдмрджрд▓рддреЗ.
Live page рдЪреА рд╕реБрджреНрдзрд╛ рдлрд╛рдЯрдХрд╛рд╡рд░ рдкреНрд░рдд рдареЗрд╡рддрд╛ рдпреЗрдИрд▓ рдХрд╛? рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдВрд╕рд╛рдареА тАФ рд╣реЛ.
git checkout lesson-04-dynamic-at-the-edge