Share
Embed
サーバーレスでAPIを提供する際のアプリケーション"以外"の話 / Talk about Serverless Other than Application
ServerlessDays Fukuoka 2019
Shimpei Takamatsu
December 14, 2019
Transcript
43 slides
-
Shimpei Takamatsu (@shimpeiws) WebΞϓϦέʔγϣϯΛத৺ʹ JavaScript / Ruby / React /
Node.js …. ιϑτΣΞΤϯδχΞ at Tokyo Certified Scrum Master ΞδϟΠϧ։ൃ ΞʔϦʔεςʔδͷελʔτΞοϓΛத৺ʹɺ ΞʔΩςΫνϟ/ઃܭɾ࣮ͷαϙʔτ ٕज़ࢧԉ ౙפ͍͠҉͍ɺαϘΓ͕ͪ δϣΪϯά 01 02 03 04 ࠓͪ͜Βͷ͓Ͱ͢ -
w Ϣʔβʔ͔ΒͷϦΫΤετΛड͚ϨεϙϯεΛฦ٫ w )551+40/ w ޙଓͷΞϧΰϦζϜϞδϡʔϧʹϦΫΤετ͠ɺ݁Ռ ΛΞάϦήʔγϣϯ w ೝূɾೝՄͳͲ "1*αʔϏϯά
w ը૾ೝࣝɺػցֶशɾਂֶशɺΞόλʔੜFUDʜ w ༻ݴޠ͕ΞϧΰϦζϜʹΑͬͯҟͳΔ w ϫʔΫϩʔυ͕ΞϧΰϦζϜʹΑͬͯҟͳΔ w *0͕ΞϧΰϦζϜʹΑͬͯҟͳΔ w */࠾ੇσʔλɺը૾FUDʜ w 065σʔλɺը૾ɺ%ϑΝΠϧFUDʜ ΞϧΰϦζϜϞδϡʔϧ αʔϏεͷ֓ཁͱΞʔΩςΫνϟ 01 γεςϜߏͷಛ w"1*αʔϏϯά෦ͱΞϧΰϦζϜϞδϡʔϧʹ͔ΕΔ wΞϧΰϦζϜ෦ͷԠεϐʔυϞδϡʔϧʹΑ༷ͬͯʑ wΞϧΰϦζϜϞδϡʔϧݴޠϫʔΫϩʔυϨεϙϯελΠϜ*0͕༷ʑ -
αʔϏεͷ֓ཁͱΞʔΩςΫνϟ 01 Rails + PostgreSQL Elastic BeanstalkͰΦʔτεέʔϦϯά APIαʔόʔ Python, C++
etc… EC2Πϯελϯε(CPU/GPU) ֤Ϟδϡʔϧ͕HTTPΠϯλϑΣʔεఏڙ Algorithm Modules HTTP/JSONͰͯ͢ಉظతʹ௨৴ ௨৴(API <> ΞϧΰϦζϜ) 01 02 03 Before -
αʔϏεͷ֓ཁͱΞʔΩςΫνϟ 01 Serverless + DynamoDB + Ұ෦postgres εέʔϦϯάLambda APIαʔόʔ Python,
C++ etc… EC2Πϯελϯε(CPU/GPU) ֤ϞδϡʔϧSQSΛϙʔϦϯά Algorithm Modules SQSΛத৺ͱͨ͠ΠϯλϑΣʔε Ұ෦S3DynamoDBͷτϦΨʔ ௨৴(API <> ΞϧΰϦζϜ) 01 02 03 After -
w 4FSWFSMFTT'SBNFXPSL /PEFKT 5ZQF4DSJQU "84 w ୯७ͳ"1*ɺετϦʔϜ͔Βͷ-BNCEBىಈ w ϛυϧΣΞͷ༻
%ZOBNP%#ɺ"1*(BUFXBZ ͰͷXFCTPDLFUFUDʜ w ϓϩμΫγϣϯͰ༻͠ͳ͔ͬͨͷ͋Δ 1P$ w ϨΠϠϦϯάσΟϨΫτϦߏͷܾఆ w ڞ௨Ϟδϡʔϧͷ࡞ ϨεϙϯεΤϥʔϋϯυϦϯ ά w Ϣχοτςετ KFTU ͷڥͱςετରɾςετͷ ॻ͖ํͷύλʔϯΛඋ w -JOU ։ൃڥͷඋ αʔόʔϨεͲ͏ͩͬͨ? ։ൃલͷࣄલ४උ w։ൃऀdਓఔɺػೳ։ൃɾςετͰϲ݄ఔͷظؒ wࣄલʹ͕ࣗ୲Ͱ༷Λຬͨ͢͜ͱ͕Մೳ͔ͷ1P$ͱ։ൃڥͷඋΛ ͓͜ͳͬͨ 02 -
w ։ൃͷ্ཱ͕ͪΓ͕ૣ͔ͬͨ w ΞϓϦέʔγϣϯΛॻ͘ʹֶशίετ͕͍ w جຊతʹ-BNCEBͷ'VODUJPOΛॻ͚ͩ͘ w ϢχοτςετͰ࣭҆ఆͨ͠ (PPE w
$*ϦϦʔεϑϩʔ w MPDBM։ൃڥ w ωοτϫʔΫઃఆ w υϝΠϯɺ71$ɺ֎෦ωοτϫʔΫଓFUDʜ .PSF αʔόʔϨεͲ͏ͩͬͨ? (PPE.PSF w։ൃΛ௨ͯ͡ྑ͔ͬͨ෦ (PPE ͱͨ͠PSͬͱվળ͍ͨ͠ .PSF ͳ෦ wΞϓϦέʔγϣϯ։ൃ૯ͯ͡εϜʔζͩͬͨ w.PSFΞϓϦέʔγϣϯzҎ֎zͷ෦ 02 -
w ։ൃͷ্ཱ͕ͪΓ͕ૣ͔ͬͨ w ΞϓϦέʔγϣϯΛॻ͘ʹֶशίετ͕͍ w جຊతʹ-BNCEBͷ'VODUJPOΛॻ͚ͩ͘ w ϢχοτςετͰ࣭҆ఆͨ͠ (PPE w
$*ϦϦʔεϑϩʔ w MPDBM։ൃڥ w ωοτϫʔΫઃఆ w υϝΠϯɺ71$ɺ֎෦ωοτϫʔΫଓFUDʜ .PSF αʔόʔϨεͲ͏ͩͬͨ? (PPE.PSF w։ൃΛ௨ͯ͡ྑ͔ͬͨ෦ (PPE ͱͨ͠PSͬͱվળ͍ͨ͠ .PSF ͳ෦ wΞϓϦέʔγϣϯ։ൃ૯ͯ͡εϜʔζͩͬͨ w.PSFΞϓϦέʔγϣϯzҎ֎zͷ෦ 02 -
։ൃڥ/։ൃϑϩʔ ·ͩ՝ʹײ͍ͯ͡Δ෦ w։ൃڥ wͬͺΓϩʔΧϧͰಈ࡞֬ೝ͍ͨ͠ɺΫϥΠΞϯτͱ͋Θͤͯಈ࡞֬ೝ ͨ͠ wϩʔΧϧͰಈ͔ͤͳ͍ͳΒɺGFBUVSF୯ҐͷςετڥΛ࡞Δ wσϓϩΠ w3%#ͷ߹ɺNJHSBUJPOΛͲ͏ཧ͍ͯͭ͠σϓϩΠ͢Δ
wϫϯγϣοτͰྲྀ͍ͨ͠εΫϦϓτతͳͷΛͲ͏ྲྀ͢ wTFSWFSMFTTEFQMPZʹΓΒͳ͍ͷΛͲ͏ѻ͏ 03 -
։ൃڥ/։ൃϑϩʔ ·ͱΊ w։ൃڥ wϛυϧΣΞ͕ଟ͘ͳΓ͕ͪͰɺಈ࡞֬ೝ·Ͱग़དྷΔϩʔΧϧڥ͕࡞Γ ͮΒ͍ wEPDLFSΠϝʔδͰϛυϧΣΞΛଗ͑ͯɺςετΛॻ͘͜ͱͰ࣭୲อ ͨ͠ w$*ͷඋ w$PEF#VJMEΛTFSWFSMFTTͱผͷ$MPVE'PSNBUJPOͰ४උɺ$*͔Β࣮ ߦͯ͠σϓϩΠ
wTFSWFSMFTTEFQMPZʹΓΒͳ͍ͷΛͲ͏ѻ͏͔ Έͳ͞ΜNBLF TIFMMɺ࡞ΓࠐΜͰ·͢ΑͶ 03 -
w ։ൃͷ্ཱ͕ͪΓ͕ૣ͔ͬͨ w ΞϓϦέʔγϣϯΛॻ͘ʹֶशίετ͕͍ w جຊతʹ-BNCEBͷ'VODUJPOΛॻ͚ͩ͘ w ϢχοτςετͰ࣭҆ఆͨ͠ (PPE w
$*ϦϦʔεϑϩʔ w MPDBM։ൃڥ w ωοτϫʔΫઃఆ w υϝΠϯɺ71$ɺ֎෦ωοτϫʔΫଓFUDʜ .PSF αʔόʔϨεͲ͏ͩͬͨ? (PPE.PSF w։ൃΛ௨ͯ͡ྑ͔ͬͨ෦ (PPE ͱͨ͠PSͬͱվળ͍ͨ͠ .PSF ͳ෦ wΞϓϦέʔγϣϯ։ൃ૯ͯ͡εϜʔζͩͬͨ w.PSFΞϓϦέʔγϣϯzҎ֎zͷ෦ 02 -
2"1*αʔόʔΛಠࣗυϝΠϯͰӡ༻͍ͨ͠Ͱ͢ w63-ͷσϑΥϧτ"84͕ൃߦ͢Δ'2%/ wಠࣗυϝΠϯ༻ͷͨΊʹ3PVUFͰυϝΠϯʹඥ͚Δ TTMূ໌ ॻͷ४උ wlBNQMJGZFEVDBUJPOTFSWFSMFTTEPNBJONBOBHFSz͕ศར wࣄલʹ$FSUJGJDBUF.BOBHFSͰ44-5-4ূ໌ॻΛൃߦ͓ͯ͘͠ wσϓϩΠલʹlTFSWFSMFTTDSFBUF@EPNBJOzͰ$VTUPN%PNBJOΛ࡞ ͢Δ αʔόʔϨεͱඇػೳཁ݅(ωοτϫʔΫͳͲ)
04 custom: customDomain: domainName: ${self:provider.stage}-your-domain.${env:CUSTOM_DOMAIN_NAME} certificateName: ${env:CERTIFICATE_NAME} basePath: '' stage: ${self:provider.stage} createRoute53Record: true endpointType: 'regional' -
αʔϏεͷ֓ཁͱΞʔΩςΫνϟ 01 Rails + PostgreSQL Elastic BeanstalkͰΦʔτεέʔϦϯά APIαʔόʔ Python, C++
etc… EC2Πϯελϯε(CPU/GPU) ֤Ϟδϡʔϧ͕HTTPΠϯλϑΣʔεఏڙ Algorithm Modules HTTP/JSONͰͯ͢ಉظతʹ௨৴ ௨৴(API <> ΞϧΰϦζϜ) 01 02 03 Before -
2ؒఀࢭՄೳͳ&$ΠϯελϯεΛఀࢭ͍ͨ͠Ͱ͢ wඅ༻ݮ͕తɺಛʹ(16ΠϯελϯεͳͲߴՁͳͷΛରʹ͍ͨ͠ wTFSWFSMFTTͰTDIFEVMFىಈͷΠϕϯτΛDSPOͰهड़͢Δ w"84Ͱ$MPVEXBUDI&WFOUT͕࡞͞Εͯ-BNCEBΛτϦΨʔͯ͠ ͍Δ αʔόʔϨεͱඇػೳཁ݅(ωοτϫʔΫͳͲ) 04 startEC2: handler: src/functions/EC2Start.index
events: - schedule: cron(0 1 * * ? *) stopEC2: handler: src/functions/EC2Stop.index events: - schedule: cron(0 2 * * ? *) -
αʔόʔϨεͱඇػೳཁ݅(ωοτϫʔΫͳͲ) 04 ͦͷଞͷখωλ wڥ໊ͷTVGGJY͕ݪҼͰQSPEVDUJPOڥߏஙͷλΠϛϯάͰ-BNCEBͷ จࣈ੍ݶΛ͑ͨ wϦϦʔεؒࡍʹͳΓɺQSPEVDUJPOڥΛ४උͯ͠ʜ w"1*(BUFXBZɺ-BNCEBͦΕͧΕʹϖΠϩʔυ্ݶΛ͍࣋ͬͯΔ w"1*(BUFXBZ .# ɺ-BNCEB
.# ʜ wϛυϧΣΞΛଟ༻͢ΔͨΊ6OJU5FTU༻%PDLFSίϯςφͷϝϞϦফඅ͕ େ͖͘ɺ$JSDMF$*ͷඪ४ϝϞϦαΠζΛ͑ͨ wແ೦ͷҰ෦UFTUTLJQʜ w<13>ऴΘΒͳ͍-BNCEB࣮ߦͱ͍͏-BNCEBͰϋϚͬͨύλʔϯωλΛ ΞυϕϯτΧϨϯμʔͰॻ͖·͢