Fukuoka.dev #1
ͷେྔͷϩάΛ͍͍ײ͡ʹࡹ͖͍ͨ'VLVPLBEFWໟརܒଠ
View Slide
‣ 'VTJD$P -UE‣ ൃҊऀϓϩμΫτΦʔφʔ‣ *P5ܥͷडୗҊ݅‣ "84 403"$0. (P 3VCZ‣ ͖ͳ"84αʔϏε,JOFTJTໟརܒଠʢ͏Γ͚͍ͨʣ
ࠓ͓͍ͨ͜͠ͱ
ͷલʹʜ
ͬͯͳʹʁ
*P5։ൃऀ͚ٙࣅσʔλੜαʔϏε
*P5ͷ
Ϟϊ͕Thing
Πϯλʔωοτܦ༝ͰThing
αʔόʹσʔλΛૹΓBackendThingD a t a
ղੳͨ͠Γͯ͠BackendThingD a t a
Կ͔͢ΔBackendThingD a t a
*P5ͷ͓ΘΓ
*P5։ൃ͠·͢
ςετ͍ͨ͠BackendThingD a t a
σʔλૹͬͯ΄͍͠BackendThingD a t a
Ͱ
Ϟϊʹͩͬͯ߹͋Δ
͑͐ͬɺ։ൃʹ͔͔Δͷʂʁ
͑͐ͬɺϗϯτʹյ͞ͳ͍ͱΤϥʔσʔλग़ͤͳͷʂʁ
ෛՙࢼݧ༻ʹཉ͍͚͠Ͳʜݸສԁʂʁ
ෛՙࢼݧ༻ʹ༻ҙ͚ͨ͠Ͳʜ୭͕ૢ࡞͢Δͷ͜Εʂʁ
ςετʹࠔΔ
ͦ͏ͩʂ
γϛϡϨʔλʔΛ࡞Ζ͏ʂBackendSimulatorD a t a
͍ɺϦϦʔεʹؒʹ߹Θͳ͍ʂ
͗ͯ͢͠ʓʓ͞Μ ࡞ͬͨਓ͔͠ಈ͔ͤͳ͍ʜ
ٱ͠ͿΓʹಈ͔ͨ͠Βશવಈ͔ͳ͍ʜ
ͦ͜Ͱ
ࢥ͍Ͳ͓ΓʹͳΔϞϊBackendD a t a
͍ͭͰཉ͍͠σʔλΛཉ͍͠ྔ͚ͩૹͬͯ͘ΕΔʂ
͏Ε͍͠
ը໘Πϝʔδࢥ͍௨ΓͷϑΥʔϚοτͰ+40/σʔλΛੜ ԾσόΠεͷεςʔλεͱͦͷมԽΛҙʹઃఆ͞·͟·ͳ࣌ܥྻσʔλੜػೳ
ͷͬ͘͟Γͨ͠Έ
ϩάॲཧػߏPublicSubnet PrivateSubnet PrivateSubnetS3 Bucket(Lot)S3 Bucket(Binary)WebWeb WorkerWorkerMockMockMockMockMockWebίϯιʔϧͰಈ࡞ΛઃఆmockΛૢ࡞
PublicSubnet PrivateSubnetS3 Bucket(Lot)S3 Bucket(Binary)WebWeb WorkerWorkerWebίϯιʔϧͰಈ࡞ΛઃఆmockΛૢ࡞mockૢ࡞JobΛൃߦPrivateSubnetMockMockMockMockMockϩάॲཧػߏ
PublicSubnet PrivateSubnetS3 Bucket(Lot)S3 Bucket(Binary)WebWeb WorkerWorkermockૢ࡞JobΛൃߦઃఆϑΝΠϧΛΞοϓϩʔυmockαʔόʔʹૢ࡞ࢦࣔPrivateSubnetMockMockMockMockMockMockWebίϯιʔϧͰಈ࡞ΛઃఆmockΛૢ࡞ϩάॲཧػߏ
PublicSubnet PrivateSubnetS3 Bucket(Lot)S3 Bucket(Binary)WebWeb WorkerWorkermockૢ࡞JobΛൃߦઃఆϑΝΠϧΛΞοϓϩʔυmockαʔόʔʹૢ࡞ࢦࣔઃఆϑΝΠϧόΠφϦΛDLPrivateSubnetMockMockMockMockMockMockWebίϯιʔϧͰಈ࡞ΛઃఆmockΛૢ࡞ϩάॲཧػߏ
PublicSubnet PrivateSubnetS3 Bucket(Lot)S3 Bucket(Binary)WebWeb WorkerWorkermockૢ࡞JobΛൃߦઃఆϑΝΠϧΛΞοϓϩʔυmockαʔόʔʹૢ࡞ࢦࣔઃఆϑΝΠϧόΠφϦΛDLPrivateSubnetMockMockMockMockMockMockmockىಈWebίϯιʔϧͰಈ࡞ΛઃఆmockΛૢ࡞ϩάॲཧػߏ
PublicSubnet PrivateSubnetS3 Bucket(Lot)S3 Bucket(Binary)WebWeb WorkerWorkermockૢ࡞JobΛൃߦઃఆϑΝΠϧΛΞοϓϩʔυmockαʔόʔʹૢ࡞ࢦࣔՔಇঢ়گɾϩάૹ৴ઃఆϑΝΠϧόΠφϦΛDLPrivateSubnetMockMockMockMockMockMockmockىಈWebίϯιʔϧͰಈ࡞ΛઃఆmockΛૢ࡞ϩάॲཧػߏ
ϩάॲཧػߏPublicSubnet PrivateSubnetS3 Bucket(Lot)S3 Bucket(Binary)WebWeb WorkerWorkerίϯιʔϧͰmockΛૢ࡞mockૢ࡞JobΛൃߦઃఆϑΝΠϧΛΞοϓϩʔυmockαʔόʔʹૢ࡞ࢦࣔՔಇঢ়گɾϩάૹ৴ઃఆϑΝΠϧόΠφϦΛDLPrivateSubnetMockMockMockMockMockmockىಈMockMock[ mock ]GoόΠφϦ͔ΒཱͯͨԾσόΠεϓϩηε[ tower ]GoόΠφϦ͔Βཱͯͨmockཧϓϩηε
ࠓ͓͍ͨ͜͠ͱվΊͯʂ
͜ͷ͋ͨΓʹө͠ͳ͍ͱ͍͚ͳ͍
‣ ֤NPDLͷৄࡉͳϩάΛऔΓ͍ͨ ૹ৴σʔλૹ৴ઌϓϩτίϧFUD ϩάͷαΠζૹ৴σʔλαΠζʹΑͬͯେ͖͘มಈw ,#ҎԼdे,#‣ ֤NPDLͷঢ়ଶΛϦΞϧλΠϜʹߋ৽͍ͨ͠ 3%4ͷߋ৽‣ ࠷େNPDLՔಇ࣮Ͱສ Քಇͷͱ͖͋Ε͍͖ͳΓສʹͳΔ͜ͱ͋Δ‣ ՔಇʹΑͬͯඅ༻εέʔϧ͢ΔΑ͏ʹ͍ͨ͠ NPDLNPDLࣗମैྔ՝ۚཁ݅
͋ͳͨͳΒͲ͏͢Δʁ
ୈ̍ੈ
‣ NPDLαʔόʔʹԿΠϯετʔϧ͠ͳ͍ ࢹͱ͔ΞοϓάϨʔυͱ͔͕໘‣ ϩάॲཧػߏʹωοτϫʔΫଳҬΛۃྗׂ͔ͳ͍ ϝΠϯػೳͷٙࣅσʔλૹ৴ʹ͍͍ͨୈੈํ
͜͏ͳΓ·ͨ͠S3 Bucket LambdaPrivateSubnetWorkerWorkerS3 Bucketૹ৴ຖʹϩάΛॻ͖ग़͢1ຖʹશmockͷϩάΛूܭS3ͷputͰLambda͕ൃՐmockͷঢ়ଶΛHTTPͰ͑ΔmockຖʹϩάΛόϥͯ͠อଘ
‣ NPDLαʔόʔʹԿΠϯετʔϧ͠ͳ͍͍ͯ͘ ϩάॲཧػߏʹׂ͘ωοτϫʔΫଳҬ͕࠷ݶ‣ ϩάͷୡʹͨΒ͕͔͔࣌ؒΔ ϩάͷ༰͕ඞཁ࠷ݶ ҟৗܥ·Ͱߟ͑Δͱϩάͷूॲཧ͕ෳࡶʹʜ XPSLFSαʔόʔʹNPDLͷঢ়ଶΛ͑Δͱ͜Ζ͕ಉظతࣦഊ࣌ͷ࠶ૹॲཧͱ͔ʜ ͳΜ͔͔ͬ͜ѱ͍ʜ݁Ռ
ୈ̎ੈ
‣ NPDLαʔόʔʹԿΠϯετʔϧ͠ͳ͍ ͬͺΓࢹͱ͔ΞοϓάϨʔυͱ͔͕໘‣ ϩάॲཧػߏʹωοτϫʔΫଳҬΛ͋Δఔׂ͜͏ Γͳ͔ͬͨΒ͓ۚͷྗʹཔͬͯੜ͖͍ͯ͜͏‣ ͬͺΓ%ZOBNP%#͔ͳ͊ʜ ͰΩϟύγςΟͷཧ໘ͩͳ͊ʜୈ̎ੈํ
%ZOBNP%#0O%FNBOEരʂ
‣ ैདྷͷ%ZOBNP%#ͰɺΩϟύγςΟϢχοτ ಡΈॻ͖ੑೳΛ ͋Β͔͡Ίઃఆ͓ͯ͘͠ඞཁ͕͋ͬͨ 8$6 8SJUF$BQBDJUZ6OJU 3$6 3FBE$BQBDJUZ6OJU‣ ΩϟύγςΟϢχοτͷΦʔτεέʔϦϯάઃఆͰ͖͕ͨɺ ͙͢ʹεέʔϧ͢ΔΘ͚Ͱͳ͍‣ 0O%FNBOEϞʔυͰɺͬͨΩϟύγςΟϢχοτʹରͯ͠ ैྔ՝ۚͯ͘͠ΕΔʂ ͋Β͔͡ΊΩϟύγςΟϢχοτΛઃఆ͓ͯ͘͠ඞཁ͕ͳ͍ʂ%ZOBNP%#0O%FNBOEരʂ
͜͏ͳΓ·ͨ͠DynamoDB(On-Demand)Lambda SNS SQS֤mock͕DynamoDBʹϩάΛॻ͖ࠐΉPrivateSubnetWorkerWorkerDynamoDB StreamsʹΑͬͯLambdaΛൃՐඇಉظʹσʔλΛߋ৽Ͱ͖ΔΑ͏ʹ
‣ NPDLαʔόʔʹԿΠϯετʔϧ͠ͳ͍͍ͯ͘ ϩάͷୡ͕΄΅ϦΞϧλΠϜ ৄࡉϩά͕ݟΕΔ ϩάॲཧػߏ͕ൺֱత؆୯‣ ϩάॲཧػߏʹׂ͘ωοτϫʔΫଳҬ͕େ͖͘ͳͬͨʜ‣ %ZOBNP%#0O%FNBOEΰϦΰϦ͏ͱߴ͍ʜ݁Ռ
ୈ̏ੈ
‣ NPDLαʔόʔʹԿΠϯετʔϧ͠ͳ͍ ͬͺΓࢹͱ͔ΞοϓάϨʔυͱ͔͕໘‣ ϩάॲཧػߏʹωοτϫʔΫଳҬΛ͋Δఔׂ͜͏ Γͳ͔ͬͨΒ͓ۚͷྗʹཔͬͯੜ͖͍ͯ͜͏‣ %ZOBNP%#0O%FNBOE٫͠Α͏ ͓ۚʹݶք͕͋ΔΑͶୈ̏ੈํ
‣ ΩϟύγςΟ͕ৗʹେ͖͘มಈ͢Δ߹༗ޮ‣ NPDLNPDLͰมಈ͢Δ͕ɺ֤NPDL͕ॻ͖ࠐΉྔҰఆ ؤுΕ1SPWJTJPOFE͕͑ΔͷͰʁΰϦΰϦ%ZOBNP%#0O%FNBOEͣͬ͠ͱҰఆͰ͍ଓ͚ͨΒʜ0O%FNBOE 1SPWJTJPOFEར༻͍ͯ͠ΔΩϟύγςΟͷഒΛϓϩϏδϣϯ͍ͯ͠Δঢ়ଶʹ
‣ ىಈ࣌ʹඞཁͳΩϟύγςΟΛ༧ଌͰ͖Ε࣮ݱ͢Δ ૹ৴σʔλαΠζʹΑͬͯϩάͷαΠζ͕େ͖͘มಈ ૹ৴σʔλαΠζΛ༧ଌ͢Δͷࠔw ૹ৴σʔλͷ෦͚ͩผͷػߏΛͬͯอଘ͢ΕΑ͍ͷͰʁ‣ ΩϟύγςΟ૿͢ํʹճ੍ݶ͕ແ͍͚ͲɺݮΒ͢ํʹճ੍ݶ͕͋Δ NPDLͷՔಇ୯Ґ͝ͱʹΩϟύγςΟΛࢉग़ͯ͠Ճ DSPOͰ࣌ؒຖʹՔಇ୯ҐͷΩϟύγςΟͷ߹ܭΛग़ͯ͠ద༻%ZOBNP%#0O%FNBOE͔Βͷ٫
‣ ෳͷαʔόʔ͔ΒϚϯτͰ͖Δڞ༗ετϨʔδ ωοτϫʔΫϑΝΠϧγεςϜͱͯ͠Ϛϯτ‣ ༰ྔ͕ࣗಈͰεέʔϧ͢Δ‣ εϧʔϓοτ੍͕ޚՄೳ όʔετεϧʔϓοτϑΝΠϧγεςϜͷαΠζʹ߹Θͤͯεέʔϧ ϓϩϏδϣϯυεϧʔϓοτεϧʔϓοτΛઃఆ‣ ෳͷ";͔ΒΞΫηεՄೳ"NB[PO&MBTUJD'JMF4ZTUFN &'4
͜͏ͳΓ·ͨ͠DynamoDB(Provisioned)Lambda SNS SQSDynamoDBʹεςʔλεߋ৽༻ͷϩάEFSʹશͳϩάΛॻ͖ࠐΉPrivateSubnetWorkerWorkerDynamoDB StreamsʹΑͬͯLambdaΛൃՐEFSΩϟύγςΟmockىಈ࣌ʹௐPublicSubnetWebWebඇಉظʹσʔλΛߋ৽Ͱ͖ΔΑ͏ʹ
‣ NPDLαʔόʔʹԿΠϯετʔϧ͠ͳ͍͍ͯ͘ ϩάͷୡ͕΄΅ϦΞϧλΠϜ ৄࡉϩά͕ݟΕΔ ϩάॲཧػߏ͕ൺֱత؆୯ %ZOBNP%#ͷඅ༻͕࠷దԽ͞Εͨ‣ ϩάॲཧػߏʹׂ͘ωοτϫʔΫଳҬ͕ͬͱେ͖͘ͳͬͨʜ Ұఆ࣌ؒܦաޙʹ&'4͔ΒσʔλΛআ͢Δͷ͕खؒ‣ &'4*0Λ૿ͦ͏ͱ͢ΔͱͦΕͳΓʹඅ༻͕ʜ݁Ռ
ୈ̐ੈ ͜Ε͔Β
‣ NPDLαʔόʔʹԿ͔ΛΠϯετʔϧ͢ΔͷΛڐ༰͠Α͏ શମతʹ͜ͳΕ͖ͯͨͷͰɺࠓͳΒ͍͚Δؾ͕͢Δ‣ ࠓͦ͜,JOFTJTͱ͖߹͓͏ γϟʔυͷѻ͍͕େมͳͷͰࠓ·Ͱආ͚͖ͯͨ‣ ૣ͘&'4͔Β٫͍ͨ͠ؾ࣋ͪ ωοτϫʔΫଳҬͷϘτϧωοΫʹͳΓ͕ͪ ͓ۚͰղܾͰ͖Δ͚Ͳ͓ۚେࣄ ϩάͷͨΊʹNPDL͔ΒϲॴʹσʔλΛૹ͍ͬͯΔͷΠϠͩୈ̐ੈํ
‣ ,JOFTJT%BUB4USFBNTʹσʔλΛ͛ࠐΉϥΠϒϥϦ‣ ͋ΔఔσʔλΛ·ͱΊͯૹͬͯ͘ΕΔ γϟʔυ͋ͨΓͷॻ͖ࠐΈ੍ݶΛΫϦΞ͘͢͠ͳΔw .#ඵw ϨίʔυඵίϨ ωοτϫʔΫଳҬతʹ͞͠Ί -BNCEB࣮ߦճతʹ͞͠Ί‣ ૹ৴͕ඇಉظʹͳΔ‣ qVFOUEͱΈ߹Θͤͯ͏ͱΓ͍͢ BXTqVFOUQMVHJOLJOFTJT"NB[PO,JOFTJT1SPEVDFS-JCSBSZ ,1-
‣ ͦͷ໊ͷ௨ΓϩάΛཧͯ͘͠ΕΔͭ $MPVE8BUDI-PHT*OTJHIUTͰϩάσʔλΛੳ͢Δ͜ͱՄೳ อଘظؒઃఆͰ͖Δʂ‣ Ұճݕ౼͚ͯͨ͠Ͳ੍ݶ༰Λצҧ͍͍ͯͯ͠Ϙπʹʜʂ‣ ϩάೖසͷ੍ݶ؇͕Ͳ͜·Ͱ͍͚Δ͔ʜɻ σϑΥϧτͰ݅ඵͷτϥϯβΫγϣϯ BQOPSUIFBTU"NB[PO$MPVE8BUDI-PHT
͜͏ͳΔ༧ఆLambda SNS SQSKPLͰσʔλΛ·ͱΊͯૹ৴PrivateSubnetWorkerWorkerPublicSubnetWebWebKinesis Data StreamsCloudWatchLogs
‣ ϩάͷୡ͕΄΅ϦΞϧλΠϜ ৄࡉϩά͕ݟΕΔ ϩάॲཧػߏ͕ൺֱత؆୯ %ZOBNP%#Λ͏ඞཁ͕ͳ͘ͳͬͨ ϩάॲཧػߏʹׂ͘ωοτϫʔΫଳҬ͕খ͘͞ͳͬͨ‣ NPDLαʔόʔʹqVFOUEΛΠϯετʔϧͪ͠ΌͬͨͰ·͍͔͊ͬʂ γϟʔυͷ੍ޚͲ͏͠Α͏ ߟ͑த݁Ռ ͨͿΜ
ୈੈ ͋ΘΑ͘
ظͷ৽"NB[PO5JNFTUSFBN
‣ ߴͰεέʔϥϒϧͳશϚωʔδυܕͷ࣌ܥྻσʔλϕʔε ॻ͖ࠐΈΫΤϦετϨʔδʹΑΔैྔ՝ۚ *0ͷੑೳ ੍ݶ·ͩग़͍ͯͳ͍ʜ ŠƄŞž σʔλอଘظ͕ؒઃఆͰ͖ΔͷͰআॲཧඞཁͳ͍ʁ‣ ϓϨϏϡʔਃͯ͠Δ͚Ͳ·ͩདྷͳ͍ʜظͷ৽"NB[PO5JNFTUSFBN
͜͏ͳΔ͔ʁLambda SNS SQSKPLͰσʔλΛ·ͱΊͯૹ৴PrivateSubnetWorkerWorkerPublicSubnetWebWebTimestreamKinesis Data StreamsCloudWatch Logsʹ Θͬͯ͑Δʁ
·ͱΊ
‣ େྔͷNPDL͔Βൃੜ͢ΔϩάΛॲཧ͢ΔػߏͷมભΛݟ͖ͯͨ‣ ͳʹ͛ʹશ෦TFSWFSMFTT අ༻NPDLͷՔಇʹԠͯ͡εέʔϧ͢Δ ෦͕ଟ͍‣ ࣗͰ࡞Δͷ͕͍͠ػߏ͕ͨ͘͞Μ༻ҙ͞Ε͍ͯͯ ؾܰʹࢼߦࡨޡ͕Ͱ͖ΔͷΫϥυͳΒͰ ύζϧͷΑ͏ʹ͍Ζ͍ΖΈ߹Θ͍ͤͯ͘ͷָ͍͠ʂ‣ େنͳσʔλΛѻ͏ͱ͖ʹ࠷ޙʹϘτϧωοΫʹͳΔͷͬͺΓ*0·ͱΊ
ΛҰॹʹ։ൃͯ͘͠ΕΔؒΛืूதʂ͝ڵຯ͋Δํໟར·ͰʂGo RubyAWS IoTͬͱ͏·͘ΕΔʂ͓͠Ζͦ͏ʂin Fukuoka