ࠓͦ͜͡ΊΑ͏ʂ࣮ફʂαʔόϨεΞʔΩςΫνϟ@Amimoto_Amiamimoto-ami.com
View Slide
ࣗݾհ• ໊લɿງՈོ• ॴଐɿAMIMOTO TEAM• Githubɿhttps://github.com/horike37• Qiitaɿhttp://qiita.com/horike37• ಘҙͳ͜ͱɿAWS, JavaScript, WordPress
࠷ۙ։ൃͨ͠αʔόϨεͳOSSϓϩμΫτ
https://github.com/horike37/simple-api-gatewaySimple API Gateway• API GatewayͷઃఆΛ؆୯ʹ͢Δͱ͍͏ίϯηϓτ• ରίϚϯυʹΑΔઃఆͷखҾ• ϚοϐϯάςϯϓϨʔτCORSͷઃఆΛҙࣝ͠ͳͯ͘ྑ͍
https://github.com/horike37/serverless-command-line-event-args• Serverless FrameworkͷϓϥάΠϯ• Serverless FrameworkʹΑΔ։ൃͷޮԽ͕Մೳʹ• Lambdaʹ͢ҾΛίϚϯυϥΠϯͰ͢͜ͱ͕͖ͰΔServerless CommandLine Event Args
ຊ
αʔόϨεΞʔΩςΫνϟͱ
• ΫϥυͰఏڙ͞ΕΔαʔϏεར༻Λલఏʹߏங͢ΔαʔϏεٴͼΞϓϦέʔγϣϯ• ԾϚγϯΛΘͣʹΞʔΩςΫνϟΛߏEC2
Կ͕خ͍͠ͷ͔
ຊདྷΓ͔ͨͬͨίʔυΛॻ͘͜ͱʹूதग़དྷΔڥΛ࡞Δ
• webαʔϏεΛ։ൃӡ༻ͯ͠ϏδωεΛޭͤ͞Δ͜ͱ• ͦͷͨΊʹΞϓϦέʔγϣϯͷίʔυΛॻ͘͜ͱຊདྷΓ͔ͨͬͨ͜ͱ͔͠͠ݱ࣮ʹίʔυΛॻ͚ͩ͘Ͱແ͍
• OSωοτϫʔΫͷઃఆɾཧ• αʔόͷߏஙɾϥϯλΠϜڥͷηοτΞοϓ• ϛυϧΣΞΞϓϦέʔγϣϯͷηΩϡϦςΟΞοϓσʔτ• Πϯϑϥͷϝϯςφϯε• ΞΫηεϢʔβͷ৳ͼʹର͢ΔαʔόߏͷมߋɾΩϟύγςΟཧ• ݸਓใͷཧαʔό͕ଘࡏ͢Δ߹ʹൃੜ͢ΔλεΫ
αʔό͕ଘࡏ͢ΔwebαʔϏεͷ্ཱͪ͛ॳίʔυͷ࣮αʔόϝϯςφϯεαʔόͷߏஙΩϟύγςΟϓϥϯχϯάඅͤΔ࣌ؒͷׂ߹• ଟ͘ͷ࣌ؒΛίʔυͷ࣮ʹඅͤΔ
αʔό͕ଘࡏ͢ΔwebαʔϏε͕͢Δͱαʔόͷࢹαʔόϝϯςφϯείʔυͷ࣮ΩϟύγςΟϓϥϯχϯάඅͤΔ࣌ؒͷׂ߹• ૿͑ߦ͘ΞΫηεϢʔβʹର͢ΔαʔόͷߏมߋɾΩϟύγςΟϓϥϯχϯά• ϞϊϦγοΫͳγεςϜʹର͢Δϝϯςφϯείετ• γϏΞͳݸਓใͷཧ• αʔόͷࢹͦΕʹର͢Δ24/365ͷରԠͷඞཁੑηΩϡϦςΟΞλοΫͷରԠ
͍ͭͷؒʹ͔ଟ͘ͷ࣌ؒΛՃՁͷੜ·ͳ͍ॏ࿑ಇʹඅ͍ͯ͠Δ
Ͳ͏ղܾ͢Δͷ͔
αʔό͕ଘࡏ͢ΔwebαʔϏεͷظαʔόͷࢹαʔόϝϯςφϯείʔυͷ࣮ΩϟύγςΟϓϥϯχϯάඅͤΔ࣌ؒͷׂ߹• ૿͑ߦ͘ΞΫηεϢʔβʹର͢ΔαʔόͷߏมߋɾΩϟύγςΟϓϥϯχϯά• ϞϊϦγοΫͳγεςϜʹର͢Δϝϯςφϯείετ• γϏΞͳݸਓใͷཧ• αʔόͷࢹͦΕʹର͢Δ24/365ͷରԠඞཁੑ%%PT߈ܸͷରԠͯ͢ΛΫϥυαʔϏεΞτιʔε
݁ՌͨΒ͞ΕΔϝϦοτϏδωεͷՃՁΛ͚ͭΔίʔυͷ࣮ʹଟ͘ͷ࣌ؒΛඅͤΔΑ͏ʹͳΔ
࣮ફฤ
ҰൠతͳϒϥβΞϓϦέʔγϣϯΛαʔόϨεΞʔΩςΫνϟͰ࣮ͨ͠߹ͷߏΛݟ͍͖ͯ·͠ΐ͏
ϒϥβΞϓϦέʔγϣϯͷߏਤ
ϒϥβΞϓϦέʔγϣϯͷߏਤCognitoʹΑΔೝূɾೝՄ
ϒϥβΞϓϦέʔγϣϯͷߏਤಈతॲཧAPI GatewayΛ௨ͯ͠LambdaͰॲཧ
ϒϥβΞϓϦέʔγϣϯͷߏਤHTML,CSSͳͲ੩తϦιʔεS3ʹઃஔ
Cognito User PoolsೝূɾೝՄ
Cognito User Pools• ಠࣗͷϢʔβσΟϨΫτϦΛ࡞Ͱ͖ΔϑϧϚωʔδυαʔϏε• ԯϢʔβ·Ͱεέʔϧ• ೝূɾೝՄγεςϜΛεέʔϧͤ͞ɺηΩϡΞʹ͢Δͱ͍͏ॏ࿑ಇΛͯͬͯ͘͢ΕΔαʔϏε
Cognito User Pools• جຊతʹ1ͭͷΞϓϦέʔγϣϯʹ͖ͭ1ͭͷUser PoolΛ࡞Δ• αΠϯΞοϓͷࡍͷύεϫʔυͷϙϦγʔೋஈ֊ೝূͳͲηΩϡϦςΟʹؔ͢ΔઃఆΛ֤User Poolຖʹઃఆ͢Δ• αΠϯΞοϓࡁΈͷϢʔβͷҰཡϚωδϝϯτίϯιʔϧ͔Β֬ೝͰ͖Δ
Amazon Cognito Identity SDK for JavaScripthttps://github.com/aws/amazon-cognito-identity-js• User PoolͱwebαΠτͱͷ࿈ܞΛߦ͏ϥΠϒϥϦ• αΠϯΠϯɺαΠϯΞοϓɺύεϫʔυϦϚΠϯμʔͳͲɺϢʔβཧΛߦ͏্Ͱඞཁͳϝιου͕શͯ༻ҙ͞Ε͍ͯΔ• JavaScriptͰϝιουΛهड़͢Δ͚ͩͰྑ͍ɻෳࡶͳϏδωεϩδοΫΛ࣮͢Δඞཁͳ͍
Customer AuthorizerAPI GatewayCognitoUser Pools• API GatewayʹೝূೝՄͷΈΛUserPoolsΛ࣮ͬͯݱͰ͖Δ• ϩάΠϯࡁΈͰ͋ΕAPIͷॲཧΛಈ࡞ͤͯ͞ɺະϩάΠϯঢ়ଶͰ͋ΕɺAPIͷॲཧΛ࣮ࢪͤ͞ͳ͍ͱ͍ͬͨ͜ͱ͕Մೳ
ຊϕʔλ͕औΕͯਖ਼ࣜϦϦʔε
DynamoDBಈతॲཧLambdaAPI Gateway
API Gateway• ΞϓϦέʔγϣϯͷݰؔͱͯ͠ৼΔ͏ APIΛ࡞͢Δ͜ͱ͕Ͱ͖ΔϚωʔδυαʔϏε• APIόοΫΤϯυγεςϜʹLambdaΛઃఆͯ͠֎෦͔ΒͷೖྗσʔλΛॲཧͤ͞Δ• ͲͷΑ͏ͳεέʔϧͰ͋ͬͯɺ؆୯ʹ API ͷ࡞ɺɺอकɺࢹɺอޢ͕ߦ͑Δ
Lambda• ΞϓϦέʔγϣϯίʔυΛ࣮ߦͰ͖ΔίϯϐϡʔταʔϏε• ϢʔβΞϓϦέʔγϣϯίʔυͷΈΛAWSʹΞοϓϩʔυ͢Εྑ͍ɻϢʔβ͕Λෛ͏ͷίʔυͷΈ• αʔόɺOSɺΩϟύγςΟʔͷϓϩϏδϣχϯά͓ΑͼࣗಈεέʔϦϯάɺίʔυͷϞχλϦϯά͓ΑͼϩάهAWS͕ཧٴͼ࣮ࢪ͢Δ
DynamoDB• ϑϧϚωʔδυͳNo SQLσʔλϕʔεαʔϏε• SPOF͕ଘࡏ͠ͳ͍ɻߴՄ༻ੑ 3 x ϨϓϦέʔγϣϯ• ετϨʔδ༰ྔ੍ݶͳ͠• ਫฏεέʔϦϯάʹΑΔෛՙࢄ
• ͜ͷ3ͭͷαʔϏεΛΈ߹ΘͤΔ͜ͱͰɺΞϓϦέʔγϣϯʹඞཁͳσʔλͷೖग़ྗɺॲཧɺӬଓԽ͕ՄೳʹͳΔαʔόϨεΞʔΩςΫνϟࡾछͷਆث
αʔόϨεΞʔΩςΫνϟͰͷ։ൃΛΑΓޮతʹ
։ൃπʔϧϑϨʔϜϫʔΫServerlessFrameworkAPI GatewayٴͼLambdaɺͦͷଞAWSϦιʔεΛͬͨΞϓϦέʔγϣϯΛߏங͢ΔͨΊͷϑϨʔϜϫʔΫAPEXLambdaϑΝϯΫγϣϯΛϏϧυɺσϓϩΠɺཧ͢ΔͨΊͷπʔϧchalice Serverless FrameworkʹࣅͨϑϨʔϜϫʔΫLamveryLambdaͷσϓϩΠFunctionͦͷͷΛؚΊͨपลػೳͷઃఆɾཧΛࢧԉ͢ΔπʔϧSimple APIGatewayAPI GatewayͷઃఆٴͼσϓϩΠΛ؆୯ʹ͢Δπʔϧ
੩తϦιʔεS3 Bucket
Simple Strage Service• Πϯλʔωοτ༻ͷετϨʔδαʔϏε• εέʔϥϒϧͰ৴པੑ͕ߴ͘ɺ͔ͭߴͰ҆ՁͳσʔλετϨʔδΠϯϑϥετϥΫνϟΛར༻Ͱ͖Δ • ϑϩϯτ༻ͷHTMLS3όέοτʹஔ͢Δ͜ͱͰແݶͷεέʔϥϏϦςΟΛ࣮ݱ͢Δ
ϑϩϯτͷϒϥβͱAPIΛޮΑ͘ଓͯ͘͠ΕΔͷ͕ඞཁ
ϑϩϯτͷϒϥβͱAPIΛޮΑ͘ଓͯ͘͠ΕΔͷ͕ඞཁSingle Page ApplicationʹΑΔϒϥβΞϓϦέʔγϣϯͷ։ൃ
• ୯ҰϖʔδʹΑΔWebΞϓϦέʔγϣϯ• ϖʔδϋογϡͷมߋ DOM ͷૢ࡞ʹΑͬͯΓସΘΔ• αʔόͱͷ௨৴ Ajax WebSocket ͳͲͰߦ͏Single Page Applicationͱ
• APIͱϖʔδ͕શʹ͍ͯ͠ΔͨΊɺAPIϑΝʔετͷߟ͑ํͰࣗવʹΞϓϦέʔγϣϯ͕ΊΔ• ΫϥΠΞϯτͱAPIͦΕͧΕʹ։ൃϦιʔεΛׂͯ͠ΓͯΔ͜ͱ͕༰қSingle Page ApplicationͷϝϦοτ
ϓϦίϯύΠϧʹΑΔΫϥΠΞϯταΠυϨϯμϦϯάAPI Gateway͔ΒͷσʔλऔಘίϯύΠϧͯ͠HTMLͷੜϒϥβͰͷඳը
·ͱΊ• ͜͜·Ͱʹհͨ͠αʔϏεπʔϧΛ͏͜ͱͰैདྷͷϒϥβΞϓϦέʔγϣϯΛαʔόϨεΞʔΩςΫνϟͰ։ൃɺӡ༻͢Δ͜ͱ͕ՄೳʹͳΔ
·ͱΊhttp://qiita.com/horike37ࠓհͨ͠ΞʔΩςΫνϟͷৄࡉQiitaͷํʹιʔείʔυؚΊͯॻ͍͍ͯ·͢ڵຯ͋Δํੋඇͷ͍ͧͯΈ͍ͯͩ͘͞
αʔόϨεΞʔΩςΫνϟͰ࠷େࣄͳ͜ͱ࠷ޙʹ
αʔόϨεΞʔΩςΫνϟͰ͍ͬͯ͘ؾ࣋ͪʂ
ࣗͨͪͰ։͠ɺࣄྫΛ࡞͍ͬͯ͘ؾ࣋ͪʂ
ͦΜͳ͍ؾ࣋ͪΛ͞ΒʹΓ্͛ͯ͘ΕΔΠϕϯτ͕͋Γ·͢ʂ
Serverless Conf Tokyo͕։࠵͞Ε·͢ʂhttp://tokyo.serverlessconf.io/
@Amimoto_Amiamimoto-ami.comTHANK YOU!ࠓͦ͜͡ΊΑ͏ʂ࣮ફʂαʔόϨεΞʔΩςΫνϟ