Serverless Meetup Fukuoka #2
*P5Λ4FSWFSMFTT෩ʹςετ͍ͨ͠ʂໟརܒଠ4FSWFSMFTT.FFUVQ'VLVPLB
View Slide
ࣗݾհໟརܒଠʢ͏Γ͚͍ͨʣ 'VTJD$P -UE ൃҊऀϓϩμΫτΦʔφʔ *P5ܥͷडୗҊ݅ લ৬ ༯ոͱ͔Ͱ༗໊ͳήʔϜձࣾ
ࣗݾհIUUQTRJJUBDPN,UB.JUFNTBGBBCCIUUQTHJUIVCDPN,UB.[BSVϝʔϧʹύεϫʔυ͖[JQΛఴͯ͠ʮύεϫʔυผ్͓ૹΓ͍ͨ͠·͢ʯͱ͢Δ׳श͕ΊΜͲ͍͘͞ͷͰͳΜͱ͔ͨ͠4FSWFSMFTTతͳաڈ࡞
ຊͷ͓‣ *P5ͱ4FSWFSMFTT‣ *P5ͱςετ‣ *P5ͱ4FSWFSMFTTͱςετͱ
*P5ͱ4FSWFSMFTT
*P5ݩ*P5ݩɹ*P5ݩɹ*P5ݩɹ*P5ݩɹݕࡧݕࡧ ݕࡧݕࡧ
*P5ݩ*P5ݩɹ ݕࡧͳ͠ ‣ ͕࣌ਐΈ࢝Ί͍ͯΔ‣ *P5ͷ͍߹Θͤ૿͖͑ͯͨ‣ 1P$͔Βຊ։ൃͷҠߦ૿͖͑ͯͨ‣ େنͳ*P5։ൃ͕૿͖͍͑ͯͯΔʂ
4FSWFSMFTTͰ͋ͬͯ͘ΕࠓͲ͖4FSWFSMFTT͡Όͳ͍ͱࢮΜͰ͠·͏BackendSensor/Device
͠4FSWFSNPSF ͩͬͨΒʜBackendSensor/Deviceো͕ى͖ͨΑʂPSϝϯςͯ͠Ͷʂ
͠4FSWFSNPSF ͩͬͨΒʜBackendSensor/Deviceແ࣊൵ʹσʔλΛૹΓଓ͚ΔΑʂো͕ى͖ͨΑʂPSϝϯςͯ͠Ͷʂ
োϝϯςʹରͯ͠ແ࣊൵
͠4FSWFSNPSF ͩͬͨΒʜBackendSensor/DeviceҰؾʹ૿͢Αʂ
͠4FSWFSNPSF ͩͬͨΒʜBackendSensor/DeviceҰؾʹ૿͢Αʂࠓௐࢠ͕͍͍͔Βͨ͘͞ΜૹΔΑʂ
͠4FSWFSNPSF ͩͬͨΒʜBackendSensor/DeviceҰؾʹ૿͢Αʂࠓௐࢠ͕͍͍͔Βͨ͘͞ΜૹΔΑʂ ϜϦϜϦϜϦ
͠4FSWFSNPSF ͩͬͨΒʜBackendSensor/DeviceϜϦϜϦϜϦແ࣊൵ʹσʔλΛૹΓଓ͚ΔΑʂ
εέʔϧʹରͯ͠ແ࣊൵
*P5ͷσʔλϩετ͔ͳΓࠔΔ‣ औΓͤͳ͍ ਓؒ૬खͱҧͬͯʮ͏Ұૹͬͯʯ͕Ͱ͖ͳ͍ ͜ͱ͕ଟ͍‣ ࣌ܥྻͰҙຯ͕͋Δ ͷมಈΛάϥϑͰݟ͔ͨͬͨΓ σʔλʹԠͯ͡εςʔλε͕มΘΔͷͩͬͨΓ‣ ॏཁͳҙຯΛ࣋ͭσʔλͷ߹ ΞϥʔτͷτϦΨʔʹͳΔΑ͏ͳͷͩͬͨΒେม
*P5ͱ4FSWFSMFTT*P5ͷ൵௧ͳڣͼোى͖ͳ͍Ͱʂ͍͍ײ͡ʹεέʔϧͯ͠ʂϝϯςདྷͳ͍Ͱʂ
*P5ͱ4FSWFSMFTT*P5ͷ൵௧ͳڣͼ 4FSWFSMFTTͷแ༰ྗোى͖ͳ͍Ͱʂ͍͍ײ͡ʹεέʔϧͯ͠ʂো ΄΅ͳ͠εέʔϧ͕ಘҙ ͳͷ͕ଟ͍ϝϯςདྷͳ͍Ͱʂ ϝϯς ͨͿΜͳ͠
"84ᐌ͘IUUQTXXXTMJEFTIBSFOFU"NB[PO8FC4FSWJDFT+BQBOBXTCMBDLCFMUPOMJOFTFNJOBSJPU"84#MBDL#FMU0OMJOF4FNJOBS*P5͚࠷৽ΞʔΩςΫνϟύλʔϯ
"[VSFᐌ͘IUUQTBLBNTJPUSFGBSDIJUFDUVSF"[VSF*P53FGFSFODF"SDIJUFDUVSF(VJEF
($1ᐌ͘IUUQTXXXZPVUVCFDPNXBUDI WLQ&U92BL"OPWFSWJFXPG$MPVE*P5$PSF (PPHMF*0
ຊͷ͓‣ *P5ͱ4FSWFSMFTT *P5ͷ#BDLFOE4FSWFSMFTTͰΩϚϦʂ‣ *P5ͱςετ‣ *P5ͱ4FSWFSMFTTͱςετͱ
*P5ͱςετ
*P5ͷςετ͕ΓͮΒ͍ͪΌΜͱςετ͠Α͏ͱ͢ΔͱͱͯΓͮΒ͍BackendSensor/Device
*P5ͷςετ͕ΓͮΒ͍σʔλ͕དྷͳ͍ͱಈ͔ͳ͍BackendSensor/DeviceD a t a
*P5ͷςετ͕ΓͮΒ͍ςετʹඞཁͳσʔλΛͲ͔͜Βௐୡ͠Α͏ʁBackendSensor/DeviceD a t a
*P5ͷςετ͕ΓͮΒ͍ͦͷ··࣮σόΠε͔ΒσʔλΛૹΖ͏BackendSensor/DeviceD a t a
࣮σόΠε͔ΒૹΔ࡞ઓ‣ ௐୡ ͔ͳΓ͕͔͔࣌ؒΔ ࣗࣾ։ൃ ηϯαʔͷબఆɾઃܭɾ࣮ͳͲPSطͷߪೖ‣ ॳظίετ ͋ͨΓͦΕͳΓͷඅ༻͕͔͔Δ ςετతͰ५ʹ༻ҙ͢Δͷඇݱ࣮త‣ धཁʹԠͨ͡εέʔϧ ͪΖΜ͠ͳ͍
͓ʜ
͜ΕҎલզʑ͕ܾผΛਤͬͨʮΦϯϓϨʯతͳͭͰʁ
*P5ͷςετ͕ΓͮΒ͍ͳΒγϛϡϨʔλʔΛ࡞ͬͯૹͬͯ͋͛Α͏BackendSimulatorD a t a
γϛϡϨʔλʔ͔ΒૹΔ࡞ઓ‣ αʔόʔͷ͓ੈ Ͳ͔͜͠Βͷαʔόʔ খنͳΒϩʔΧϧʁ͔ΒૹΒͳ͚Ε αʔόʔͷઃఆͱ͔͍Ζ͍Ζେม‣ ΖΖಠ࣮ࣗ #BDLFOEͷଓɾೝূ ૹΔσʔλͷதσόΠεͷঢ়ଶભҠ੍ޚ Քಇঢ়گͷࢹ େྔՔಇ࣌ͷεέʔϧ‣ ςετ༻σʔλ͕ཉ͍͚ͩ͠ͳͷʹ࡞ۀྔ͕ଟ͗͢Δ
͜ΕҎલզʑ͕ܾผΛਤͬͨʮαʔόʔʯతͳͭͰʁ
4FSWFSMFTTతʹղܾ͠Α͏σόΠεͷ'VODUJPOBM4BB4Ͱ͖ͳ͍ͷ͔ʜBackendFunctional Saas?D a t a
͜Μͳײ͡‣ ඞཁͳͱ͖ʹ͙͢ʹௐୡͰ͖Δ‣ αʔόʔͷଘࡏΛҙࣝͤͣʹඞཁͳ͚ͩՔಇͰ͖Δ‣ ඞཁͳσʔλΛૹΔ͜ͱ͚ͩʹूதͰ͖Δ‣ ϓϩάϥϜͰىಈఀࢭ੍͕ޚͰ͖Δ
ຊͷ͓‣ *P5ͱ4FSWFSMFTT *P5ͷ#BDLFOE4FSWFSMFTTͰΩϚϦʂ‣ *P5ͱςετ ී௨ʹΔͱπϥ͍ɻ'VODUJPOBM4BB4ͳσόΠε͕΄͍͠ʂ‣ *P5ͱ4FSWFSMFTTͱςετͱ
*P5ͱ4FSWFSMFTTͱςετͱ
*P5ςετ༻ԾσόΠε࡞αʔϏεੈքॳʂ
NPDLNPDLͱʁσόΠεʹΘͬͯςετ༻σʔλΛૹΔԾσόΠεBackendD a t a
ಈ࡞֓ཁ BackendίϯιʔϧͰઃఆΛߦͳ͏ σʔλૹ৴ઌ ϓϩτίϧ σʔλੜํ๏ͷઃఆ ঢ়ଶભҠͷઃఆ FUDʜ
ಈ࡞֓ཁ BackendNPDLΛͭ͘Δ
ಈ࡞֓ཁ BackendD a t aNPDLΛಈ͔͢
ରԠϓϩτίϧɾ࿈ܞαʔϏεɹϓϥοτϑΥʔϜ ɹαʔϏε ɹϓϩτίϧɹಠࣗαʔόʔ ɹɹ)551)5514 ɹ.255.2554ɹ"NB[PO8FC4FSWJDFTɹɹɹ"84*P5$PSF ɹ)5514.2554ɹɹɹ"NB[PO,JOFTJT%BUB4USFBNT ɹɹ(PPHMF$MPVE1MBUGPSN ɹɹɹ$MPVE*P5$PSF ɹ.2554ɹ.JDSPTPGU"[VSF ɹɹɹ"[VSF*P5)VC ɹ.2554 ".214ɹ403"$0.ɹɹɹ403"$0.1MBUGPSN ɹɹɹ#FBN'VOOFM)BSWFTU ۙϦϦʔεɹɹͦͷଞ ɹ͓ؾܰʹ͝૬ஊ͍ͩ͘͞
ରԠϓϩτίϧɾ࿈ܞαʔϏεɹϓϥοτϑΥʔϜ ɹαʔϏε ɹϓϩτίϧɹಠࣗαʔόʔ ɹɹ)551)5514 ɹ.255.2554ɹ"NB[PO8FC4FSWJDFTɹɹɹ"84*P5$PSF ɹ)5514.2554ɹɹɹ"NB[PO,JOFTJT%BUB4USFBNT ɹɹ(PPHMF$MPVE1MBUGPSN ɹɹɹ$MPVE*P5$PSF ɹ.2554ɹ.JDSPTPGU"[VSF ɹɹɹ"[VSF*P5)VC ɹ.2554 ".214ɹ403"$0.ɹɹɹ403"$0.1MBUGPSN ɹɹɹ#FBN'VOOFM)BSWFTU ۙϦϦʔεɹɹͦͷଞ ɹ͓ؾܰʹ͝૬ஊ͍ͩ͘͞4FSWFSMFTTͳ*P5#BDLFOEʹରԠʂ
"MM4FSWFSMFTTBackendD a t a'VODUJPOBM4BB4 'VODUJPOBM4BB4'BB4
͜͜·Ͱ͘Ε *P5ͷ&&ςετ͕$*ͰͰ͖Δʂ
"84ͰͬͯΈͨThermometerAmazon KinesisData StreamsAWS Lambda Amazon DynamoDB{"serial_number": "mk-00001","timestamp": "2018-08-21T07:09:05Z","temperatures": ["22.8","21.9"]}ఆظతʹσʔλऔಘ ݅ͣͭ1VU|serial_number|timestamp |temperature01|temperature02|created_at ||-------------|-------------------|-------------|-------------|-------------------||mk-00001 |2018/08/21 07:09:05|23.8 |25.4 |2018/08/21 07:09:06||mk-00002 |2018/08/21 07:09:05|23.2 |24.0 |2018/08/21 07:09:06||mk-00001 |2018/08/21 07:09:15|24.1 |25.6 |2018/08/21 07:09:17||mk-00002 |2018/08/21 07:09:15|23.8 |24.4 |2018/08/21 07:09:18||mk-00001 |2018/08/21 07:09:25|24.3 |25.0 |2018/08/21 07:09:26||mk-00002 |2018/08/21 07:09:25|24.0 |23.9 |2018/08/21 07:09:27|ςετରͷΞϓϦέʔγϣϯ
σϞ
"84ͰͬͯΈͨᶃίʔυΛ1VTI
"84ͰͬͯΈͨᶃίʔυΛ1VTI ᶄ$*ىಈ
"84ͰͬͯΈͨAWS BatchᶃίʔυΛ1VTI ᶄ$*ىಈᶅ"84#BUDIͷ +PCΛૹ৴ཧԼͷίϯϐϡʔςΟϯάڥ &$্Ͱ+PCΛ࣮ߦ͢Δ&$࣮ߦ͢Δ+PCͷྔʹԠͯࣗ͡ಈͰ૿ݮͯ͘͠ΕΔ+PCίϯςφΛ࣮ͬͯߦ͢Δ େʹͬ͘͟Γݴ͑࣌ؒՔಇ͕Մೳͳ-BNCEB
"84ͰͬͯΈͨAWS BatchEC2 instanceᶃίʔυΛ1VTI ᶄ$*ىಈᶅ"84#BUDIͷ +PCΛૹ৴ᶆίϯϐϡʔςΟϯάڥ࡞
"84ͰͬͯΈͨAWS BatchEC2 instanceAmazon ECRContainerᶃίʔυΛ1VTI ᶄ$*ىಈᶅ"84#BUDIͷ +PCΛૹ৴ᶆίϯϐϡʔςΟϯάڥ࡞ᶇίϯςφىಈ
"84ͰͬͯΈͨEC2 instanceContainerᶈ$MPOFAWS SAMTest Script#!/bin/bashgit clone $CODE_REPO $CODE_DIRcd $CODE_DIRsh test/batch/run.sh
"84ͰͬͯΈͨEC2 instanceContainerᶈ$MPOFAWS SAMTest ScriptAmazon KinesisData StreamsAWS Lambda Amazon DynamoDBᶉ%FQMPZ#!/bin/bashgit clone $CODE_REPO $CODE_DIRcd $CODE_DIRsh test/batch/run.sh Cloudformation Stack
"84ͰͬͯΈͨEC2 instanceContainerᶈ$MPOFAWS SAMTest ScriptAmazon KinesisData StreamsAWS Lambda Amazon DynamoDBᶉ%FQMPZ#!/bin/bashgit clone $CODE_REPO $CODE_DIRcd $CODE_DIRsh test/batch/run.shᶊNPDLىಈ"1*Cloudformation Stack
"84ͰͬͯΈͨEC2 instanceContainerᶈ$MPOFAWS SAMTest ScriptAmazon KinesisData StreamsAWS Lambda Amazon DynamoDBᶉ%FQMPZ#!/bin/bashgit clone $CODE_REPO $CODE_DIRcd $CODE_DIRsh test/batch/run.shᶊNPDLىಈ"1*ᶋςετσʔλૹ৴Cloudformation Stack
"84ͰͬͯΈͨEC2 instanceContainerAWS SAMTest ScriptAmazon KinesisData StreamsAWS Lambda Amazon DynamoDBᶌͨ·ͬͨσʔλΛूܭCloudformation Stack
"84ͰͬͯΈͨEC2 instanceContainerAWS SAMTest ScriptAmazon KinesisData StreamsAWS Lambda Amazon DynamoDBᶌͨ·ͬͨσʔλΛूܭᶍ4MBDLʹ݁ՌΛ௨Cloudformation Stack
"84ͰͬͯΈͨEC2 instanceContainerAWS SAMTest ScriptAmazon KinesisData StreamsAWS Lambda Amazon DynamoDBᶌͨ·ͬͨσʔλΛूܭᶍ4MBDLʹ݁ՌΛ௨ᶎ4UBDLΛআCloudformation Stack
"84ͰͬͯΈͨEC2 instanceContainerAWS SAMTest ScriptAmazon KinesisData StreamsAWS Lambda Amazon DynamoDBᶌͨ·ͬͨσʔλΛूܭᶍ4MBDLʹ݁ՌΛ௨ᶎ4UBDLΛআCloudformation Stackᶏ$POUBJOFSऴྃ
"84ͰͬͯΈͨEC2 instanceContainerAWS SAMTest ScriptAmazon KinesisData StreamsAWS Lambda Amazon DynamoDBᶌͨ·ͬͨσʔλΛूܭᶍ4MBDLʹ݁ՌΛ௨ᶎ4UBDLΛআCloudformation Stackᶏ$POUBJOFSऴྃᶐίϯϐϡʔςΟϯάڥআ
"84ͰͬͯΈͨ‣ ຊ൪ڥͱશ͘ಉ͡ڥͰςετ͕Ͱ͖Δ‣ ςετڥཱ͕ͭͷςετͷͱ͖͚ͩ‣ "84#BUDIΛ͍ͬͯΔͷͰ$JSDMF$*͙͢ʹख์ͤΔ ࣌ؒɺɺिؒ୯ҐͷΤΠδϯάςετͰݱ࣮తʹՄೳ
ຊͷ͓‣ *P5ͱ4FSWFSMFTT *P5ͷ#BDLFOE4FSWFSMFTTͰΩϚϦʂ‣ *P5ͱςετ ී௨ʹΔͱπϥ͍ɻ'VODUJPOBM4BB4ͳσόΠε͕΄͍͠ʂ‣ *P5ͱ4FSWFSMFTTͱςετͱ Λ͏͜ͱͰ"MM4FSWFSMFTTʹʂ$*ճͤΔʂʂ
ͷ͜Ε͔Β‣ ͱΓ͋͑ͣ"1*ΛϦϦʔε͢Δ ϦϦʔεͨ͠Βࠓճͷ$*͕Ͱ͖·͢‣ ૹ৴ͨ͠σʔλΛऔಘͰ͖ΔΑ͏ʹ͢Δʂ ཷ·ͬͨσʔλͱಥ͖߹ΘͤͨΓͰ͖ͯɺςετͷ෯͕͕Δ
·ͱΊ
ຊͷ͓‣ *P5ͷ#BDLFOE4FSWFSMFTT͕ελϯμʔυ‣ *P5ͷςετී௨ʹΔͱπϥ͍‣ Λ͏͜ͱͰ"MM4FSWFSMFTTͰςετ͕Մೳʹ‣ ͦͷ͍ʹͬͯ$*ճͨ͠ʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂIUUQTNPDLNPDLDPNKB