Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Microservices on Fastly
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ryo yasuda
October 17, 2017
22k
42
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Microservices on Fastly
Ryo yasuda
October 17, 2017
More Decks by Ryo yasuda
See All by Ryo yasuda
GKE+Istio+GitOpsで作る日経電子版の次世代マイクロサービス基盤
ryysd
3
2.3k
Microservices on Fastly v1.1
ryysd
2
1.3k
日経電子版へのPWA導入事例
ryysd
1
400
Featured
See All Featured
How to Ace a Technical Interview
jacobian
280
24k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
570
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Building an army of robots
kneath
307
47k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Un-Boring Meetings
codingconduct
0
460
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
Transcript
Microservices on Fastly ຊܦࡁ৽ฉࣾ ҆ా ཽ 'BTUMZ :BNBHPZB .FFUVQ
ࣗݾհ ҆ా ཽ (ͩ͢ Γΐ͏) 2015: NTTݚڀॴ ೖࣾ - ίϯςφܕԾԽٕज़ؔ࿈ͷݚڀΛ͢Δ༧ఆͩͬͨ
2016: ຊܦࡁ৽ฉࣾ ೖࣾ - ܦిࢠ൛ϦχϡʔΞϧ൛ ։ൃϝϯόʔ - ϑϩϯτΤϯυɾόοΫΤϯυɾAWSɾFastlyͷઃఆॾʑ୲
ܦిࢠ൛ ຖ900ຊͷهࣄΛ৴ ༗ྉձһ54ສਓҎ্ɾແྉձһ300ສਓҎ্ ݄ؒ3ԯΞΫηε
ܦిࢠ൛ ϦχϡʔΞϧ ϓϩδΣΫτ (Next Nikkei) UI/UXվળ (PWAԽɾϨεϙϯγϒԽ) Խ FastlyɾMicroservicesΞʔΩςΫνϟͷར༻
Microservicesͱ Auth Service DB Service Ranking Service Search Service web
iOS App γεςϜΛෳͷখ͞ͳαʔϏεͷू߹Ͱߏ͢ΔΞʔΩςΫνϟ API
Microservicesͱ ServiceA ServiceB ServiceC ServiceD Service Registry ֤αʔϏεͷใཧϔϧενΣοΫ ϦΫΤετઌαʔϏεͷใऔಘ ϦΫΤετͷૹ৴
αʔϏεؒΛܨ͙ͨΊʹɺService RegistryͳͲΛ༻͍Δ
FastlyΛͬͨMicroservices ServiceB ServiceC ɾFastlyͰService RegistryΛ༻ ɾશϦΫΤετ͕Fastlyܦ༝ ɾFastly͕ϦΫΤετΛϧʔςΟϯά ServiceA ServiceC
Ωϟογϡͷू ServiceB ServiceC ServiceD ɾΩϟογϡ͕'BTUMZʹूͰ͖Δ Ωϟογϡ ServiceA
Ωϟογϡͷू ServiceB ServiceC ServiceD ɾΩϟογϡ͕'BTUMZʹूͰ͖Δ ෳͷαʔϏεɾϨΠϠʹࢄ͠ͳ͍ Ωϟογϡ ServiceA
Ωϟογϡͷू ServiceB ServiceC ServiceD ɾΩϟογϡ͕'BTUMZʹूͰ͖Δ ෳͷαʔϏεɾϨΠϠʹࢄ͠ͳ͍ QVSHF͢Δ͚ͩͰ*OWBMJEBUJPOՄೳ Ωϟογϡ ServiceA
Ωϟογϡͷू ServiceB ServiceC Ωϟογϡ ServiceD ServiceA ɾΩϟογϡ͕'BTUMZʹूͰ͖Δ ෳͷαʔϏεɾϨΠϠʹࢄ͠ͳ͍ QVSHF͢Δ͚ͩͰ*OWBMJEBUJPOՄೳ োൃੜ࣌ʹٴΛ͛Δ
ServiceB͕ࢮΜͰΩϟογϡΛͬͯՔಇ
Ωϟογϡͷू ServiceB ServiceC Ωϟογϡ ServiceD ServiceA ɾΩϟογϡ͕'BTUMZʹूͰ͖Δ ෳͷαʔϏεɾϨΠϠʹࢄ͠ͳ͍ QVSHF͢Δ͚ͩͰ*OWBMJEBUJPOՄೳ োൃੜ࣌ʹٴΛ͛Δ
Next NikkeiͰ·ͩαʔϏε͝ͱʹΩϟογϡΛͬͯ ͠·͍ͬͯΔ࣮͕ଟʑ͋Δ͕…
ϩΪϯάɾϞχλϦϯά ServiceB ServiceC ServiceD ɾϩΪϯά શϦΫΤετͷϞχλϦϯάͰ͖Δ Ωϟογϡ ServiceA ϩΪϯά
ϩΪϯάɾϞχλϦϯά Real Time Log Streaming request url status code response
size taken time cache HIT/MISS ... αʔϏε
ϩΪϯάɾϞχλϦϯά – kibanaͰՄࢹԽ ֤αʔϏεͷΞΫηεྔ Τϥʔ ֤ϦΫΤετͷstatus code ֤αʔϏεͷฏۉϨεϙϯελΠϜ
ϩΪϯάɾϞχλϦϯά - ΩϟογϡώοτՄࢹԽ ֤αʔϏεɾ֤ύεʹର͢ΔΩϟογϡώοτ Ϣʔβछผ͝ͱͷΩϟογϡώοτ (هࣄϖʔδ) ༗ྉձһ ແྉձһ ඇձһ
ϩΪϯάɾϞχλϦϯά – ಠࣗdashboards ֤αʔϏεͷΩϟογϡώοτͳͲΛνΣοΫ
ೝՄ ServiceB ServiceC ServiceD ɾ'BTUMZ্ͰೝՄΛ࣮ ֤αʔϏεʹ࣮͠ͳͯ͘ྑ͍ Ωϟογϡώοτ্͕Δ Ωϟογϡ ೝՄ ServiceA
ϩΪϯά
ೝՄͷඞཁͳίϯςϯπͷΩϟογϡ هࣄϖʔδ /article/123 Cookie: Auth=a124b5... OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ ϢʔβͷݖݶʹΑͬͯ ίϯςϯπมΘΔ
ೝՄͷඞཁͳίϯςϯπͷΩϟογϡ هࣄϖʔδ /article/123 Cookie: Auth=a124b5… Cache-control: no-cache, no-store Cookie: Auth=a124b5...
OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ
ೝՄͷඞཁͳίϯςϯπͷΩϟογϡ هࣄϖʔδ /article/123 ϦΫΤετϔομ User-ID: 98765 User-Rank: paid Ϩεϙϯεϔομ Vary:
User-Rank Cookie: Auth=a124b5... ೝূΫοΩʔͷ decodeɾvalidate OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ
ೝՄͷඞཁͳίϯςϯπͷΩϟογϡ هࣄϖʔδ /article/123 ϦΫΤετϔομ User-ID: 98765 User-Rank: paid Ϩεϙϯεϔομ Vary:
User-Rank Cookie: Auth=a124b5... ೝূΫοΩʔͷ decodeɾvalidate OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ User-Rank͝ͱʹΩϟογϡ͚ ΔΑ͏CDNʹ໋ྩ
ೝՄͷඞཁͳίϯςϯπͷΩϟογϡώοτ Ϣʔβछผ͝ͱͷهࣄϖʔδΩϟογϡώοτ ϩάΠϯϢʔβʹରͯ͠ΩϟογϡͰ͖ͯΔ ඇձһ ༗ྉձһ ແྉձһ
VCL ࣮ྫ
ϧʔςΟϯά Top Article API Assets /article/123 Path Based Routing
backends.vcl routing.vcl ϧʔςΟϯά - VCL backend article { .host: "article.xx.jp";
.port: 443 .ssl: true } ... if (req.url ~ "/article/.+") { req.backend = article; } ... vclͰαʔϏεΛఆٛ ϧʔςΟϯά༻ͷvcl
[ { "name": "article", "path": "/article/.+", "host": "article.xx.jp", "ssl": true
} … ] services.json backends.vcl routing.vcl શαʔϏεͷఆٛϑΝΠϧ ͲΜͳαʔϏεɺϧʔτ͕͋Δ ͔ͻͱͰΘ͔Δ ϧʔςΟϯά - VCLࣗಈੜ backend article { .host: "article.xx.jp"; .port: 443 .ssl: true } ... if (req.url ~ "/article/.+") { req.backend = article; } ... vclͰαʔϏεΛఆٛ ϧʔςΟϯά༻ͷvcl
μΠφϛοΫϧʔςΟϯά Top Article API Routing-Override: API-> API-dev ϦΫΤετϔομ API-dev ϦΫΤετϔομͰϧʔςΟϯάΛ
ಈతʹมߋ Ұ෦ͷαʔϏεΛ։ൃதͷͷʹ ࠩ͠ସ͑ΒΕΔ
োͷٴΛ͙ if (beresp.http.Cache-Control !~ "(stale-if-error|immutable|private)") { set beresp.stale_if_error = 86400s;
} ϦΫΤετʹࣦഊͯ͠ɺࢦఆ͞ΕͨظؒΩϟογϡΛར༻͢Δ Next NikkeiͰɺstale-if-errorΛࣗಈͰ༩ αʔϏε͕ࢮΜͰɺΩϟογϡ͕͋Ε͠Β͘ίϯςϯπΛฦͤΔ stale-if-error
Fastly্ͰͷೝՄ - VCL ೝূΫοΩʔ(JWTܗࣜ): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4 gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ ɾΫοΩʔऔಘ: req.http.Cookie:Auth ɾJWTτʔΫϯղ: regsub(req.http.Cookie.Auth,
" (^[^.]+).[^.]+.[^.]+$ ", "$1") ɾBase64σίʔυ: digest.base64_decode ɾJWTγάωνϟݕূ: digest.hmac_sha256_base64() ɾreq.http.Nikkei-Auth-UserID = regsub(var.payload, {"^.*?"uid"¥s*:¥s*"(¥w+)".*?$"}, "¥1");
Fastly্ͰͷೝՄ – VCL if (req.http.Cookie:Auth !~ "(^[^¥.]+)¥.([^¥.]+)¥.([^¥.]+)$") { set req.http.Auth-Valid
= "false"; } set var.base64Header = re.group.1; set var.base64Payload = re.group.2; set var.signature = digest.base64url_decode(re.group.3); set var.validSignature = digest.base64_decode(digest.hmac_sha256_base64(var.jwtSecret, var.base64Header "." var.base64Payload)); set var.payload = digest.base64_decode(var.base64Payload); set var.expires = regsub(var.payload, {"^.*?"exp"¥s*:¥s*(¥d+).*?$"}, "¥1"); # γάωνϟͷਖ਼ੑͱ༗ޮظݶͷ֬ೝ if (var.signature != var.validSignature || time.is_after(now, std.integer2time(std.atoi(var.expires)))) { set req.http.Auth-Valid = "false"; } # payload͔ΒݖݶใͳͲΛநग़ req.http. UserID = regsub(var.payload, {"^.*?"uid"¥s*:¥s*"(¥w+)".*?$"}, "¥1");
ϩΪϯάɾϞχλϦϯά - VCL sub vcl_log { log {"syslog "} req.service_id
{" fastly-log :: "} {" timestamp_us:"} time.start.usec {" host:"} regsuball(req.http.X-Forwarded-Host, {" "}, "") {" upstream_host:"} regsuball(req.http.Host, {" "}, "") {" remote_addr:"} client.ip {" method:"} req.request {" fastly_x_cache:"} req.http.X-Cache {" fastly_x_cache_hits:"} req.http.X-Cache-Hits {" user_id:"} req.http.User-ID {" user_rank:"} req.http.User-Rank; … } LTSVܗࣜͰͷϩάग़ྗྫ
FastlyΛͬͨMicroservices ·ͱΊ ✔ Service Registry͕ෆཁ ✔ Cache͕Fastlyʹू͞ΕInvalidation؆୯ ✔ োൃੜ࣌ʹٴΛ͛Δ ✔
؆୯ͳϞχλϦϯάೝՄ࣮ݱͰ͖Δ ✔ μΠφϛοΫϧʔςΟϯάͰ։ൃָ͕ʹͳΔ
͋Γ͕ͱ͏͍͟͝·ͨ͠