2018/11/17(土) We wanna Tech@青森でお話ししてきました
We wanna Tech@੨Ҫ (@fukuiretu)TroubleshootNuxt on Lambda
View Slide
Ҫ (@fukuiretu)• piece of cake, inc.• since 2015.3~• Web Engineer◦ Rails occasionally AWS◦ Recently Frontend◦ Nuxt.js◦ Serverless Framework• Live in Aomori◦ RemoteWorker
WIPnoteͷϑϩϯτΤϯυΛNuxt.js৽͠·͢https://note.mu/konpyu/n/n9b7bf4343514
VueFesJapan2018 (2018.11.3)noteΛNuxt.jsͰ࠶ߏஙͨ͠ͱ͍͏λΠτϧͰ͓͖ͯ͠·ͨ͠https://note.mu/r82/n/ne217ba36d233
ΞϑλʔύʔςΟͰଟ͔࣭ͬͨNuxt.jsΛAWS LambdaͰಈ͔͢·Ͱʹ ϋϚΓͲ͜Ζͱ͔ͳ͔ͬͨͰ͔͢??
͋Γ·ͨ͠ઌਓͷܙ(@mya_ake san)͕͋ͬͨͷͰଟ͘ͳ͍͚Ͳ
ࠓ͓͢Δ͜ͱnoteʹ͓͚Δ Nuxt.jsΛAWS LambdaͰಈ͔͢·Ͱʹ ൃੜͨ͠ͱͦͷରॲʹ͍ͭͯ ͓͠·͢
αʔόߏhttps://note.mu/recommendhttps://note.mu/recommend_nuxt͍ΘΏΔαʔόϨεΞʔΩςΫνϟ
ຊʹೖΔલʹओͳొਓΛͬ͘͟Γհ
ओͳొਓ• Nuxt.js• AWS API Gateway• AWS Lambda• Serverless Framework
Nuxt.jsϢχόʔαϧͳVue.jsΞϓϦέʔγϣϯΛߏங͢ΔͨΊͷϑϨʔϜϫʔΫ• Server Side Rendering (SSR)ͷαϙʔτ• ϧʔςΟϯάͷࣗಈੜ• ϝλσʔλͷੜ• ঢ়ଶཧ• webpackʹΑΔϏϧυΛαϙʔτ
AWS API Gateway• WebAPIΤϯυϙΠϯτͷ࡞ɾཧ͕Ͱ͖Δ• όοΫΤϯυʹAWS LambdaΛར༻Ͱ͖Δ• ैྔ՝ۚ
AWS Lambda• αʔόͷϓϩϏδϣχϯάͳ͠ͰίʔυΛ࣮ߦ• Function as a Service• ରԠݴޠ: Node.js, Python, Go, Java, C#• ಛఆͷΠϕϯτΛτϦΨʔͱ࣮ͯ͠ߦՄೳ• ϦΫΤετʹԠͯ͡ΦʔτεέʔϦϯά• ैྔ՝ۚ
Serverless Framework• ߏཧσϓϩΠΛ୲͏• ΤίγεςϜ(plugin)͕๛• AWSͷଞɺAzure Functions, Google CloudFunctionʹରԠ͍ͯ͠Δ
Nuxt on Lambdaͷͬ͘͟ΓΈAWS Lambda্ͰexpressΛಈ͔͠ɺNuxt.jsΛexpressͷmiddlewareͱͯ͠ಈ͔͢͜ͱͰ࣮ݱ
ൃੜͨ͠ͱͦͷରॲ
ൃੜͨ͠1. cold start2. request headerͷαΠζաଟ3. ϦΫΤετ࣌ͷϗετ͕औಘͰ͖ͳ͍
cold startͱશ෦ڭ͑·͢ʂαʔόϨεΞϓϦͷΞϯνύλʔϯͱνϡʔχϯάhttps://d0.awsstatic.com/events/jp/2017/summit/devday/D4T7-2.pdf
cold startͷൃੜ݅શ෦ڭ͑·͢ʂαʔόϨεΞϓϦͷΞϯνύλʔϯͱνϡʔχϯάhttps://d0.awsstatic.com/events/jp/2017/summit/devday/D4T7-2.pdf
cold startରࡦTune Up AWS Lambdahttps://www.slideshare.net/keisuke69/tune-up-aws-lambda
ॳͷఆศརpluginͰ͕ͯ͢ղܾ͢Δ༧ఆͩͬͨ…
ͱ͜Ζ͕…ಉVPCʹઃஔ
ͱ͜Ζ͕…VPCͰLambdaΛ༻͍ͯ͠Δ߹ɺཁNAT Gateway
ͱ͜Ζ͕…1ϲ݄(30)Ͱ¥5,000
ࣗલͰ༻ҙ͢Δ͜ͱʹ
ࣗલͰ༻ҙᶃ5ஔ͖ʹwarmup༻ͷendpointΛୟ͘Lambdaؔ
ࣗલͰ༻ҙᶄdeploy༻script(Shell)Ͱdeployޙʹwarmup༻ͷendpointΛcurlͰୟ͘Α͏ʹͨ͠
ࣗલͰ༻ҙᶅ• Nuxt.jsͷmiddlewareͱͯ͠ಈ࡞• status: 200, ContentType: text/plain ͰOKΛฦ͚ͩ͢• ݩʑELBͷϔϧενΣοΫ༻్Ͱར༻͍ͯͨ͠• warmup༻ͷendpointͱͯ͠ར༻• (खલຯḩͰ͍͢·ͤΜ)
serverless-warmup-plugin ͱಉͷͷΛࣗ࡞͠cold startରࡦ͕Ͱ͖ͨ(݄¥5,000͔͚ͣʹࡁΜͩ)
αʔόߏhttps://note.mu/recommendhttps://note.mu/recommend_nuxtαʔόؒ௨৴
Nuxt.js ~ Rails·Ͱͷ௨৴ͷྲྀΕLambda(Nuxt.js)͔ΒHTTP Request(axios)Λ͛ΔEC2(Rails)ʹͯNginxͰHTTP RequestΛड͚ΔNginx͔ΒRailsϦόʔεϓϩΩγ͢Δ
NginxͰ400 Request Header Or Cookie Too Largeൃੜ
ͳ͔ͥ•X-Apigateway-Event•X-Apigateway-Context10KB• API Gateway͕Lambdaݺͼग़࣌͠ʹHeaderʹ༩͢Δ• ϦΫΤετύϥϝʔλCookieͷใ͕٧·ͬͯΔ
Ͳ͏͢ΕΑ͍͔A. Nginxͷlarge_client_header_buffersΛ૿͢B. Nuxt.js(Lambda) ~ Rails(EC2)ͰෆཁͳͷͰ HTTP RequestΛ͛Δલʹheader͔Βআ͢ΔBΛબ
Nuxt.js(Lambda) ~ Rails(EC2) ͷHTTP௨৴͕Ͱ͖ͨ
ϞνϕʔγϣϯNuxt.jsͷSSR࣌ʹ(Lambda্͔Β)Request HeaderͷHostΛϦΫΤετ࣌ͷϗετͱͯ͠ॲཧ͍ͯ͠ΔϩδοΫ͕͋Δ
ଞʹํ๏͋ΔͷͰʁA. ڥมʹڥ͝ͱͷϗετΛఆ͓ٛͯ͘͠B. ڥ͝ͱͷconfigΛ༻ҙͯ͠ಈతʹಡΉ͜Ή
ଞʹํ๏͋ΔͷͰʁA. ڥมʹڥ͝ͱͷϗετΛఆ͓ٛͯ͘͠B. ڥ͝ͱͷconfigΛ༻ҙͯ͠ಈతʹಡΉ͜ΉnoteಠࣗυϝΠϯ͕ར༻Ͱ͖ΔͷͰݻఆʹͳΒͳ͍e.g.www.pieceofcake.co.jpdiehardtales.commm.hyuki.net
API GatewayҎ֎ͷ߹Host: note.mu Host: note.mu Host: note.muϦΫΤετ࣌ͷϗετ(note.mu)͕औಘͰ͖Δ
API GatewayҎ֎ͷ߹CloudFrontͷBehaviorsͷઃఆΑΓɺCache Based on Selected Request Headers ΛALL ·ͨ Whitelist Ͱ Host
ಉ͡Α͏ʹAPI GatewayͰࢼͯ͠ΈΔͱ…
API Gatewayʹproxy͞Εͳ͍
Amazon CloudFrontͰAPI Gatewayͷᙱ͍ͱ͜ΖʹखΛಧ͚Δhttps://dev.classmethod.jp/cloud/cache-api-gateway-by-cloudfront҆ఆͷΫϥϝι͞Μ
Ͳ͏ͨ͠ΒϦΫΤετ࣌ͷϗετ͕औಘͰ͖ΔΜͩΖ͏͔
AWSެࣜϑΥʔϥϜʹٹ͍ͷҰखLambda@Edge!!!!!https://forums.aws.amazon.com/message.jspa?messageID=682411
Lambda@Edge• CloudFront্ͰҎԼͷ͍ͣΕ͔ͷΠϕϯτΛϑοΫͯ͠LambdaΛ࣮ߦ͢ΔαʔϏε• Ϗϡʔϫʔ͔ΒϦΫΤετΛड৴ͨ͠ޙ• ϦΫΤετΛΦϦδϯʹసૹ͢Δલ• ΦϦδϯ͔ΒϨεϙϯεΛड৴ͨ͠ޙ• ϏϡʔϫʔʹϨεϙϯεΛసૹ͢Δલ• 2017/7ʹҰൠఏڙ։࢝
API Gatewayͷ߹ͷྫHost: note.muHost: xxx.cloudfront.netX-Forwarded-Host: note.muϦΫΤετ࣌ͷϗετ(note.mu)͕औಘͰ͖ΔHostΛX-Forwarded-Hostʹ٧ΊΔHost: xxx.cloudfront.netX-Forwarded-Host: note.muϏϡʔϫʔϦΫΤετΛϑοΫ
API Gatewayͷ߹ͷྫexpressNuxt.js
CloudFront ~ API Gateway ~ Lambda ͷߏͰϦΫΤετ࣌ͷHost͕औಘͰ͖ͨ
Lambda@Edge ར༻࣌ͷҙ• όʔδϣϯ͖ͭͷLambdaؔͷARNΛઃఆ͢Δඞཁ͕͋Δ• όʔδχΞ(us-east-1)Ϧʔδϣϯʹஔ͢Δඞཁ͕͋Δ• ֤ϦʔδϣϯʹϨϓϦΧ͕࡞ΒΕ࣮ͯߦ͞ΕΔ• ಈ࡞ͤͨ͞ΤοδϩέʔγϣϯʹΑͬͯϩάग़ྗ͞ΕΔϦʔδϣϯ͕ܾ·Δ• ڥมར༻ෆՄ• ௨ৗͷLambdaಉ༷ʹεϩοτϦϯά͕ൃੜ͢ΔͨΊΞΫηεΛߟྀΛ͢Δඞཁ͕͋Δ
·ͱΊ
·ͱΊ• ैདྷͷΞʔΩςΫνϟͱύϥμΠϜ͕ҟͳΔͷͰવͳ͕Βॳݟͷଟ͍͠ɺ͓ͦΒ͘͜ͷઌ…• ӡ༻͕ܰݮ͞ΕΔͷେ͖͍• ϓϩηεཧ• Φʔτεέʔϧ• ॳݟͷͱ͖߹͏ڧ͍ؾ͕࣋ͪ͋ΔͳΒ αʔόϨεΞʔΩςΫνϟ͍͍ͧ
Special ThanksNaoto Ishizawa (@youyo_)
͋Γ͕ͱ͏͍͟͝·ͨ͠ΤϯδχΞืूͯ͠·͢ٸதͷʮnoteʯͷϑϩϯτΤϯυΛ৽͢ΔΤϯδχΞΛืूʂhttps://www.wantedly.com/projects/208206