Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Microservices on Fastly v1.1

Ryo yasuda
February 20, 2019

Microservices on Fastly v1.1

Ryo yasuda

February 20, 2019
Tweet

More Decks by Ryo yasuda

Other Decks in Programming

Transcript

  1.  o E (r , eak i N T n

    j ea )r p chmti i :5 25 1 s R S S .- l g 6 3 0:3 :
  2. . () / ) (     

       AD
  3. . Service A Service C Service B Service D Routing

    Caching Dev Debug Logging Auth ESI
  4. . Service A Service C Service B Service D Routing

    Caching Dev Debug Logging ESI ৽ωλ Dynamic Critical CSS Auth
  5.  Service A Service C Service B Service D Service

    Registry ֤αʔϏεͷ৘ใ؅ཧ΍ ϔϧενΣοΫ ϦΫΤετઌαʔϏεͷ৘ใऔಘ ϦΫΤετͷૹ৴
  6.  Routing Caching Dev Debug Logging Auth ESI Service A

    Service C Service B Service D • F • •
  7.     هࣄαʔϏε هࣄߋ৽௨஌ max-age: 604800 purge •

    '+25*-1/&%"! #3 • *-(. /&%"! #,) •     40$
  8.  Routing Caching Dev Debug Logging ESI Service A Service

    C Service B Service D • - • - • origin͕ࢮΜͰ΋ࢦఆͨ͠ظؒ͸ΩϟογϡΛར༻ͯ͘͠ΕΔઃఆ Service B͕ࢮΜͰ΋ ΩϟογϡΛ࢖ͬͯՔಇ Auth
  9. - - Routing Caching Dev Debug Logging ESI Service A

    Service C Service B Service D • F M R • • H Service D Nikkei-Routing-Override: serviceD->serviceD-tunnel Local Machine t u n n e l Auth
  10. • F D I D • ) ( ( (

    • F D H R Routing Caching Dev Debug Logging ESI Service A Service C Service B Service D Nikkei-Routing-Journey: serviceA Nikkei-Routing-Journey: serviceA,serviceB Nikkei-Routing-Journey: serviceA,service,serviceD Auth
  11.  Routing Caching Dev Debug Logging ESI Service A Service

    C Service B Service D • • • F Real Time Log Streaming request url status code response size taken time cache HIT/MISS ... Auth
  12.  Routing Caching Dev Debug Logging ESI Service A Service

    C Service B Service D •   •   ! • " Auth
  13.     هࣄϖʔδ /article/123 Cookie: Auth=a124b5… Cache-control: no-cache,

    no-store Cookie: Auth=a124b5... Cache-control: no-cache, no-store OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ
  14.     هࣄϖʔδ /article/123 ϦΫΤετϔομ User-ID: 98765 User-Rank:

    paid Ϩεϙϯεϔομ Vary: User-Rank Cookie: Auth=a124b5... Cache-control: private ೝূΫοΩʔͷ decodeɾvalidate OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ
  15.     هࣄϖʔδ /article/123 ϦΫΤετϔομ User-ID: 98765 User-Rank:

    paid Ϩεϙϯεϔομ Vary: User-Rank Cookie: Auth=a124b5... Cache-control: private ೝূΫοΩʔͷ decodeɾvalidate OAuth2ೝূͰಘΒΕͨ JWTτʔΫϯ User-Rank͝ͱʹΩϟογϡ෼͚ ΔΑ͏CDNʹ໋ྩ
  16. ( ) Routing Caching Dev Debug Logging Auth ESI Service

    A Service C Service B Service D •
  17. • • • C C EI <html> <style> <esi:include src=”/critical.css?service=article”>

    <style> … </html> Critical CSS Server Critical CSSͷ Ϗϧυ&഑৴ Cache Control: private Application Server Cache Control max-age=600
  18. • • • C C EI <html> <style> <esi:include src=”/critical.css?service=article”>

    <style> … </html> Critical CSS Server Critical CSSͷ Ϗϧυ&഑৴ Application Server Cache Control max-age=600 Cache Control max-age=86400
  19. App Server ./critical.css S3 Critical CSS Server critical CSS͕͋Δ͔֬ೝ …

    <style> <esi:include src=”critical.css”> <style> …
  20. App Server ./critical.css S3 Critical CSS Server critical css͕ଘࡏ͠ͳ͍ ͷͰ௨ৗͷCSSΛฦ٫

    Fastly΁Ωϟογϡ CSS Cache … <style> <esi:include src=”critical.css”> <style> …
  21. App Server ./critical.css S3 Critical CSS Server Critical CSS Builder

    ඇಉظͰϏϧυཁٻ CSS Cache … <style> <esi:include src=”critical.css”> <style> …
  22. App Server ./critical.css S3 Critical CSS Server Critical CSS Builder

    Ϗϧυ͕׬ྃͨ͠ΒS3΁อଘ ඇಉظͰϏϧυཁٻ CSS Cache … <style> <esi:include src=”critical.css”> <style> …
  23. App Server ./critical.css S3 Critical CSS Server Critical CSS Builder

    Ωϟογϡ͞Εͨ ௨ৗͷCSSΛPurge ඇಉظͰϏϧυཁٻ … <style> <esi:include src=”critical.css”> <style> … CSS Cache
  24. App Server ./critical.css S3 Critical CSS Server Critical CSS Builder

    ඇಉظͰϏϧυཁٻ Critical CSS Cache ࣍ճΞΫηε࣌ɺ Critical CSSΛฦ٫ Fastly΁Ωϟογϡ … <style> <esi:include src=”critical.css”> <style> …
  25.        S d d

    F C e h S I E c a
  26. Routing Caching Logging Auth Vanity URL ESI hub service •

    $ #%" •  & ' $!  ”/” ”/hub/front” ද޲͖URL ಺෦URL
  27. table vanities { ”/”: ”/hub/front” … } Routing Caching Logging

    Auth Vanity URL ESI • F D • E • R F D U L ”/” ද޲͖URL hub service ”/hub/front” ಺෦URL
  28. backends.vcl routing.vcl     backend article { .host:

    "article.xx.jp"; .port: 443 .ssl: true } ... if (req.url ~ "/article/.+") { req.backend = article; } ... vclͰαʔϏεΛఆٛ ϧʔςΟϯά༻ͷvcl
  29. [ { "name": "article", "path": "/article/.+", "host": "article.xx.jp", "ssl": true

    } … ] services.json backends.vcl routing.vcl શαʔϏεͷఆٛϑΝΠϧ ͲΜͳαʔϏεɺϧʔτ͕͋Δ ͔ͻͱ໨ͰΘ͔Δ      backend article { .host: "article.xx.jp"; .port: 443 .ssl: true } ... if (req.url ~ "/article/.+") { req.backend = article; } ... vclͰαʔϏεΛఆٛ ϧʔςΟϯά༻ͷvcl
  30.  if (beresp.http.Cache-Control !~ "(stale-if-error|immutable|private)") { set beresp.stale_if_error = 86400s;

    }      Next NikkeiͰ͸ɺstale-if-errorΛࣗಈͰ෇༩ αʔϏε͕ࢮΜͰ΋ɺΩϟογϡ͕͋Ε͹͠͹Β͘͸ίϯςϯπΛฦͤΔ stale-if-error
  31.       ೝূΫοΩʔ(JWTܗࣜ): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4 gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ A

    :J :C AA :, - : :; :C AA : 414 $" 14 $ 14 $ " .6 B :D ;: 6 :+)5 : A : - = I ;: 6 5 6(*+5 6 :+) " 4 6 :; 6 6 ?A6 4 . 2 ,2 2 $" . 2 "
  32.     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");
  33.       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ܗࣜͰͷϩάग़ྗྫ