「Developers.IO 2022 〜技術で心を揺さぶる3日間〜」 の発表で利用した資料です
■Youtube動画 https://youtu.be/EpiGUb50bIE
$9ࣄۀຊ෦%FMJWFSZ෦."%άϧʔϓۚल࠸"84$%,ͱ(JU)VC"DUJPOTͰ࢝ΊΔ*OGSBTUSVDUVSFBT$PEFͷ$*$%
View Slide
ࣗݾհ w $9ࣄۀຊ෦%FMJWFSZ෦."%άϧʔϓw αʔόʔαΠυΤϯδχΞw "1/"--"84$FSUJGJDBUJPOT&OHJOFFSTw ͖ͳ"84ͷαʔϏεw "84$%,ɺ$MPVE'PSNBUJPOw $PEFγϦʔζۚल࠸ 4IVZB,JOKP@joe-king-sh
"84ͷϦιʔεΛͲͷΑ͏ʹཧ͍ͯ͠·͔͢ʁ
"84ͷϦιʔεཧํ๏ Ϛωδϝϯτίϯιʔϧ"84$-**OGSBTUSVDUVSFBT$PEF *B$
"84ͷϦιʔεཧํ๏ Ϛωδϝϯτίϯιʔϧ"84$-**OGSBTUSVDUVSFBT$PEF *B$͍ࣺͯɺ΄ͱΜͲมߋ͠ͳ͍߹
"84ͷϦιʔεཧํ๏ Ϛωδϝϯτίϯιʔϧ"84$-**OGSBTUSVDUVSFBT$PEF *B$ఆظతʹ࣮ߦ͢Δӡ༻ɺॳظߏஙͷΈ
͜͏ߟ͍͑ͯΔͳΒ ܧଓతʹมߋ͕ඞཁӡ༻Λָʹ͍ͨ͠։ൃεϐʔυΛ্͍͛ͨ
Infrastructure as Code(IaC)͕͋ͳͨΛͤʹͯ͘͠Ε·͢☺
"84ͷϦιʔεཧํ๏ Ϛωδϝϯτίϯιʔϧ"84$-**OGSBTUSVDUVSFBT$PEF *B$ܧଓతʹมߋ͕ඞཁɺӡ༻Λָʹ͍ͨ͠ɺ։ൃΛ্͍͛ͨ
ͦͷ*B$ΛͲ͏ͬͯσϓϩΠ͢Δ͔ʁ
ܧଓతʹมߋ͕ඞཁͳIaCͷσϓϩΠΛʮखಈʯͰߦ͍ͬͯΔ߹…
IaCͷޮՌΛ࠷େݶʹൃشͰ͖͍ͯ·ͤΜ
͔ͤͬ͘IaCԽͯ͠࡞ۀΛࣗಈԽ͢ΔͳΒɺ࠷ޙͷσϓϩΠ·ͰࣗಈԽ͠·͠ΐ͏🚀
͜Ε͔Β͢༰ ͳͥ*B$$*$%ʹͤΔ͖͔ʁ Ͳ͏ͬͯ*B$$*$%Λߏங͍ͯ͘͠ͷ͔ʁ *B$πʔϧ ϦϙδτϦɺ$*πʔϧ ΞϓϦͱΠϯϑϥͷίʔυཧ ϒϥϯνઓུ *B$$*$%ߏͷ۩ମྫ
͜Ε͔Β*B$Λಋೖ͢Δํ*B$$*$%ߏஙͷϋʔυϧΛԼ͛Δ$*$%ͷߏஙΛηοτͰߟ͍͑ͯͨͩ͘͢Ͱʹ*B$$*$%ΛಋೖࡁΈͷํطଘͷӡ༻ݟ͠ͷ͖͔͚ͬͱͳΔࠓޙͷݕ౼࣌ͷબࢶΛ૿͢ຊηογϣϯͷΰʔϧ
͋ͳͨͷ৫ʹ߹ͬͨɺ࠷దͳIaCͱCI/CDͷߏஙํ๏ΛҰॹʹߟ͍͖͑ͯ·͠ΐ͏😄
*B$ʹԿΛٻΊΔͷ͔ʁ
*B$ͰಘΒΕΔͷ Πϯϑϥͷόʔδϣϯཧมߋ༰ͷίʔυϨϏϡʔਓతϛεͷݮมߋཧߏཧ։ൃεϐʔυίʔυΛಡΊΠϯϑϥߏ͕Θ͔ΔΠϯϑϥΛҰݩཧ࠶ݱੑͷ͋ΔσϓϩΠૉૣ͍σϓϩΠɾϩʔϧόοΫ༰қʹڥΛෳ
ຊʹͦ͏Ͱ͠ΐ͏͔🤔
ྫ͑ɺ͜ΜͳखಈσϓϩΠΛͯ͠Δͱʜ લఏɿ$MPVE'PSNBUJPOͰ*B$ԽᶃϩʔΧϧ1$͔Β"84$-*ͰσϓϩΠᶄσϓϩΠڥ͝ͱʹύϥϝʔλʔΛ্ॻ͖ᶅελοΫؒʹґଘ͕ؔ͋ΔɺσϓϩΠखॱ͕ෳࡶ
ᶃϩʔΧϧ1$͔Β"84$-*ͰσϓϩΠ ϦϞʔτϦϙδτϦ͔Β࠷৽ίʔυΛऔಘ ϩʔΧϧͰίʔυΛमਖ਼ $-*Ͱຊ൪ڥσϓϩΠ͠ϦϞʔτνΣοΫΠϯΛΕΔͱʜ
͠ϦϞʔτνΣοΫΠϯΛΕΔͱʜ ࠷৽ιʔεͱΠϯϑϥ͕ဃ͠ɺ࠷ѱͷ߹σάϨ͕ൃੜ͠·͢⚠
*B$͚ͩͰอূ͞Εͳ͍ͷ Πϯϑϥͷόʔδϣϯཧมߋ༰ͷίʔυϨϏϡʔਓతϛεͷݮมߋཧߏཧ։ൃεϐʔυίʔυΛಡΊΠϯϑϥߏ͕Θ͔ΔΠϯϑϥΛҰݩཧ࠶ݱੑͷ͋ΔσϓϩΠૉૣ͍σϓϩΠɾϩʔϧόοΫ༰қʹڥΛෳ
ᶄσϓϩΠڥ͝ͱʹύϥϝʔλʔΛ্ॻ͖ $MPVE'PSNBUJPOͷύϥϝʔλʔΛखಈઃఆڥ͝ͱʹύϥϝʔλʔίʔυԽ͍ͯ͠Δ͕ɺEFW TUH QSEͱ͍ͬͨڥΛखಈͰࢦఆBXTDMPVEGPSNBUJPOEFQMPZaUFNQMBUFfiMFUFNQMBUFZBNMaQBSBNFUFSPWFSSJEFTFOWJSPONFOUQSEaTUBDLOBNF.Z4UBDL
σϓϩΠઃఆΛؒҧ͑Δͱʜ ҙਤ͠ͳ͍ϦιʔεͷઃఆมߋɺσϓϩΠઌͷڥΛޡΓ·͢😨
ᶅελοΫؒʹґଘ͕ؔ͋ΔɺσϓϩΠखॱ͕ෳࡶ VPC DatabaseAPI GWLambda
ελοΫؒʹґଘ͕ؔ͋ΔɺσϓϩΠखॱ͕ෳࡶ σϓϩΠ͕ਏ͍͢ͷͬͱਏ͍😢
͜ΕΒ*B$$*$%ͰॳΊͯอূ͞ΕΔͷͰ͢ Πϯϑϥͷόʔδϣϯཧมߋ༰ͷίʔυϨϏϡʔਓతϛεͷݮมߋཧߏཧ։ൃεϐʔυίʔυΛಡΊΠϯϑϥߏ͕Θ͔ΔΠϯϑϥΛҰݩཧ࠶ݱੑͷ͋ΔσϓϩΠૉૣ͍σϓϩΠɾϩʔϧόοΫ༰қʹڥΛෳ※खಈͰAWS৮Βͳ͍ͱ͍͏લఏ༗Γ
ͬͱྑ͍͜ͱ͋Γ·͢
*B$$*$%ͰಘΒΕΔͷЋ Πϯϑϥͷόʔδϣϯཧมߋ༰ͷίʔυϨϏϡʔਓతϛεͷݮมߋཧߏཧ։ൃεϐʔυίʔυΛಡΊΠϯϑϥߏ͕Θ͔ΔΠϯϑϥΛҰݩཧ࠶ݱੑͷ͋ΔσϓϩΠૉૣ͍σϓϩΠɾϩʔϧόοΫ༰қʹڥΛෳࣗಈςετࠪରԠΞΫηεݖݶཧҾܧ͕؆୯
CI/CD·Ͱඋͯ͠IaCΛ࠷େݶʹ׆༻͠·͠ΐ͏🎉
࣍ ͳͥ*B$$*$%ʹͤΔ͖͔ʁ Ͳ͏ͬͯ*B$$*$%Λߏங͍ͯ͘͠ͷ͔ʁ *B$πʔϧ ϦϙδτϦɺ$*πʔϧ ΞϓϦͱΠϯϑϥͷίʔυཧ ϒϥϯνઓུ *B$$*$%ߏͷ۩ମྫ
*B$$*$%ߏஙͷݕ౼ϙΠϯτ Ͳͷ*B$πʔϧΛ͏ʁ ϦϙδτϦɾ$*πʔϧԿΛબͿʁ ΞϓϦͱΠϯϑϥ͚Δʁ ϒϥϯνઓུͲ͏͢Δʁ
"84ϦιʔεΛཧ͢Δ*B$πʔϧͷྫ AWS SAMAWS CDKCloudFormation
πʔϧબఆͷ؍ΠϯϑϥͷཧऀνʔϜͷεΩϧηοτߏங͢ΔΞϓϦέʔγϣϯͷछྨ*5౷੍ํ ϚϧνΫϥυఆͷ༗ແͳͲͲͷ*B$πʔϧΛ͏͔ʁ CloudFormation AWS SAM AWS CDK
Ͳͷ*B$πʔϧΛ͏͔ʁ AWS CDK"84$%,ҎԼͷͰΦεεϝͰ͢։ൃεϐʔυΛ্ͤ͞Δมߋࠩͷࢹೝੑ͕ྑ͍*B$Λॻָ͍͍͍ͯͯ͠ιϑτΣΞΤϯδχΞͱͷੑ͕ߴ͍*B$ͷςελϏϦςΟ͕ߴ͍
ϓϩάϥϛϯάݴޠͰ"84ͷΠϯϑϥΛهड़5ZQFTDSJQU 1ZUIPO +BWB (P /&5ιʔείʔυ͔Β$MPVE'PSNBUJPOςϯϓϨʔτΛੜͯ͠σϓϩΠϕετϓϥΫςΟεʹԊͬͨܗͰΠϯϑϥ͕நԽ͞Ε͍ͯͯɺগͳ͍ίʔυͰΠϯϑϥ͕ఆٛՄೳΦʔτίϯϓϦʔτ੩తܕղੳͳͲΤσΟλͷԸܙ͕ಘΒΕΔϦιʔεͷ୯ମςετΛ$*Ͱճ͢͜ͱ͕Ͱ͖·͢"84$%,ͱ AWS CDK
4OBQTIPU5FTUJOH$MPVE'PSNBUJPOςϯϓϨʔτͷมߋݕ$%,ͷόʔδϣϯΞοϓ࣌ͷมߋ֬ೝ'JOFHSBJOFE"TTFSUJPOTఆٛͨ͠Πϯϑϥ͕ҙਤ௨Γ͔୯ମςετ$%,ͷ"TTFSUJPOTϞδϡʔϧΛ༻"84$%,Λͬͨ*B$ͷςετ
ྫ͑ɺҎԼͷΑ͏ͳ୯ମςετ͕ՄೳͰ͢ຊ൪ڥͰ%#ͷআϙϦγʔΛ3&5"*/ʹ͓͖͍ͯͨ͠"VUP4DBMJOH(SPVQͷ࠷খҎ্Λอূ͍ͨ͠։ൃڥͷΠϯελϯελΠϓUNFEJVN·Ͱ"84$%,ͷ'JOFHSBJOFE"TTFSUJPOT
"84$%,Λ৮ͬͨ͜ͱ͕ͳ͍ํ $%,ϫʔΫγϣοϓ͔Βࢼͯ͠Έ͍ͩ͘͞IUUQTDELXPSLTIPQDPN
*B$$*$%ߏஙͷݕ౼ϙΠϯτ Ͳͷ*B$πʔϧΛ͏ʁ ϦϙδτϦɾ$*πʔϧԿΛબͿʁ ΞϓϦͱΠϯϑϥ $%,ͷιʔεཧҰॹʁผʑʁ ϒϥϯνઓུͲ͏͢Δʁ
Կͷ(JUϗεςΟϯάαʔϏεΛ͏͔ CodeCommit GitHubBitBucketFUDʜ
Ͳͷ$*πʔϧΛબ͢Δ͔ CodeCommitGitHubBitBucketCodePipeline#JU#VDLFU1JQFMJOFT(JU-BC3VOOFS
ҎԼͷΑ͏ͳ؍ͰબΜͰ͍͖·͢(JUͷ͍͢͞1VMM3FRVFTUϨϏϡʔɺλά͚ɺ3FWFSUͳͲ(6*ͷૢ࡞ײ(JUҎ֎ͷػೳ֎෦αʔϏε࿈ܞλεΫཧɺϓϩδΣΫτཧɺφϨοδཧػೳ࿈ܞ͢Δ$*πʔϧʹԿΛ͍͍͔ͨ*5౷੍ํ ೝূใͷཧɺ4BB4ར༻Մ൱Կͷ(JUϗεςΟϯάαʔϏεΛ͏͔
(JU)VC͕ఏڙ͢ΔϫʔΫϑϩʔαʔϏεϫʔΫϑϩʔΛ:".-Ͱఆٛ͢Δ1VTIɺ*TTVFɺ1VMM3FRVFTUɺ3FMFBTFͳͲɺ(JU)VCϓϥοτϑΥʔϜͷ༷ʑͳΠϕϯτͰىಈ0*%$Ͱ(JU)VCଆʹ"84ͷӬଓతͳΫϨσϯγϟϧ͕ෆཁ1VCMJDϦϙδτϦແྉɺ1SJWBUFϓϥϯʹԠͨ͡Ұఆ࣌ؒແྉ(JU)VC"DUJPOT
ҎԼͷߏΛத৺ʹઆ໌͍͖ͯ͠·͢ຊηογϣϯͰऔΓѻ͏ߏ GitHub4PVSDF #VJME 5FTU %FQMPZAWS CDK
*B$$*$%ߏஙͷݕ౼ϙΠϯτ Ͳͷ*B$πʔϧΛ͏ʁ ϦϙδτϦɾ$*πʔϧԿͰબͿʁ ΞϓϦͱΠϯϑϥ $%,ͷιʔεཧҰॹʁผʑʁ ϒϥϯνઓུͲ͏͢Δʁ
ΠϯϑϥͱΞϓϦέʔγϣϯͰɺσϓϩΠͷϥΠϑαΠΫϧ͕Ұॹͷ߹ɺಉ͡ϦϙδτϦͰཧͨ͠ํ͕߹͕ྑ͍Ͱ͢ɻྫ41"Λ$MPVE'SPOUͰ৴"1*(BUFXBZ-BNCEBɺ4UFQ'VODUJPOT-BNCEBͳͲͷαʔόϨεಉ͡ϦϙδτϦͰཧ͖͢߹
ΠϯϑϥͱΞϓϦέʔγϣϯͰ୲νʔϜ͕͔Ε͍ͯΔ߹ɺσϓϩΠύΠϓϥΠϯ͕ผͷ߹ɺผϦϙδτϦͰཧ͢Δ͜ͱʹͳΓ·͢ɻྫΠϯϑϥͷཧΠϯϑϥνʔϜίϯςφΠϝʔδͷϏϧυΞϓϦνʔϜผͷϦϙδτϦͰཧ͖͢߹
දతͳϒϥϯνઓུ (JU'MPX (JU)VC'MPX (JU-BC'MPX τϥϯΫϕʔε։ൃ
(JU'MPX NBJOɺEFWFMPQͷӬଓϒϥϯνͱɺػೳ࣮༻ͷGFBUVSFϒϥϯνɺϦϦʔεSFMFBTFϒϥϯνɺۓٸରԠIPUfiYΛΔӡ༻NBJO·ͰϚʔδͷ͕͔͔࣌ؒΓɺίϯϑϦΫτղফͷίετ͕ߴ͍ӡ༻͕ෳࡶϦϦʔελΠϛϯά͕ܾΊΒΕ͍ͯΔ ִ͕͍ؒɺϦϦʔε༰Λࣗ༝ʹίϯτϩʔϧ͍ͨ͠߹͖SFGIUUQTOWJFDPNQPTUTBTVDDFTTGVMHJUCSBODIJOHNPEFM
(JU)VC'MPX (JU)VCͷ։ൃͰ༻͞Ε͍ͯΔઓུNBJOͱػೳ࣮༻ͷϒϥϯνͷΈͰӡ༻͢Δখ͍͞มߋΛεϐʔυײΛ࣋ͬͯ܁Γฦ͢։ൃ͖ӡ༻͕γϯϓϧmainfeature/aaa
(JU-BC'MPX (JU-BCͷ։ൃͰ༻͞Ε͍ͯΔઓུNBJOͱTUBHJOHQSPEVDUJPOͳͲɺ֤ڥ͝ͱʹϒϥϯνΛΓɺ։ൃεςʔδϯάຊ൪ɹͱ͍ͬͨॱͰϚʔδΛ͢Δ͜ͱͰɺ֤ڥʹσϓϩΠΛల։͢Δɻ(JU)VC'MPXͷΑ͏ʹӡ༻γϯϓϧ͕ͩɺϦϦʔελΠϛϯάͱ༰Λίϯτϩʔϧ͢Δ͜ͱ͕Ͱ͖Δmainstagingproductionfeature
τϥϯΫϕʔε։ൃ (JU)VC'MPXͷػೳϒϥϯν͕͞Βʹ໋Խͨ͠ͷσϓϩΠͱϦϦʔεΛ͍ͨ͠߹ɺϑΟʔνϟʔϑϥάΛ༻͍ΔίϯϑϦΫτղফͳͲɺແବͳ࡞ۀΛݮͰ͖ΔΠϯϑϥ୯ମཧͩͱϦϦʔελΠϛϯάௐͰ૬ੑ͕ѱ͍ΞϓϦͱΠϯϑϥΛಉࠝ͢ΔέʔεͰ͋Εੵۃతʹ࠾༻͍ͨ͠mainfeature/aaa1~2 days
ϒϥϯνઓུΛෳࡶ͞Ͱฒͼସ͑Δͱ (JU'MPX (JU-BC'MPX (JU)VC'MPXɺτϥϯΫϕʔε։ൃ ୯७ෳࡶ
ϒϥϯνઓུΛෳࡶ͞Ͱฒͼସ͑Δͱ (JU'MPX (JU-BC'MPX (JU)VC'MPXɺτϥϯΫϕʔε։ൃ ୯७ෳࡶ·ͣ୯७ͳͷ͔Βࢼͯ͠Έ·͠ΐ͏
ҎԼͷΑ͏ͳαʔόϨε"1*ߏங͢ΔΞϓϦέʔγϣϯ API Gateway Lambda DynamoDB
νʔϜͷମ੍ Backend TeamόοΫΤϯυνʔϜ͕ɺΞϓϦΠϯϑϥ྆ํཧLambdaAWS CDK
όοΫΤϯυνʔϜ͕ɺΞϓϦΠϯϑϥ྆ํཧνʔϜͷମ੍ LambdaAWS CDKBackend Team
։ൃɺεςʔδϯάɺຊ൪ڥ͕༻ҙ͞Ε͍ͯΔຊ൪σϓϩΠલʹεςʔδϯάڥͰखಈςετΛߦ͏σϓϩΠઌͷڥ ։ൃ εςʔδϯά ຊ൪
ͳΔ͘୯७ʹ͍ͨ͠ϦϦʔεͷִؒൺֱత͍ຊ൪ϦϦʔεͷτϦΨʔखಈͰίϯτϩʔϧ͍ͨ͠։ൃεςʔδϯά<खಈςετ>ຊ൪σϓϩΠϒϥϯνͷӡ༻
࠶ܝ(JU)VC'MPX (JU)VCͷ։ൃͰ༻͞Ε͍ͯΔઓུNBJOͱػೳ࣮༻ͷϒϥϯνͷΈͰӡ༻͢Δখ͍͞มߋΛεϐʔυײΛ࣋ͬͯ܁Γฦ͢։ൃ͖ӡ༻͕γϯϓϧmainfeature/aaa
(JU)VCͷϦϦʔεʹ͍ͭͯ
ͳΔ͘୯७ʹ͍ͨ͠ϦϦʔεͷִؒൺֱత͍ຊ൪ϦϦʔεͷτϦΨʔखಈͰίϯτϩʔϧ͍ͨ͠։ൃεςʔδϯά<खಈςετ>ຊ൪σϓϩΠϒϥϯνͷӡ༻ ύΠϓϥΠϯΛׂ
εςʔδϯάڥ·ͰͷσϓϩΠύΠϓϥΠϯ GFBUVSFCSBODIᶃPushNBJOCSBODIᶄPull Request & Merge։ൃ εςʔδϯά$ cdk deployϏϧυ୯ମςετ։ൃڥσϓϩΠ݁߹ςετ45(ڥσϓϩΠ$ cdk deployᶅAPIΛୟ͍ͯಈ࡞֬ೝ
ຊ൪ڥ·ͰͷσϓϩΠύΠϓϥΠϯ Ϗϧυ୯ମςετຊ൪ڥσϓϩΠ݁߹ςετ$ cdk deployHTTP Request3FMFBTFᶄλάͱϦϦʔεΛ࡞εςʔδϯά ຊ൪ᶃखಈͰϏδωεཁ݅ͳͲΛςετ
GitHub FlowͱGitHubͷReleaseͰ୯७ͳϒϥϯνઓུͷ··ɺϦϦʔελΠϛϯάΛίϯτϩʔϧͰ͖·͢
·ͱΊ
·ͱΊ *B$$*$%·Ͱߏங͢Δ͜ͱͰɺ࠷େݶͷޮՌΛൃش͠·͢ ͋ͳͨͷ৫ʹ͋ͬͨ࠷దͳπʔϧɺϒϥϯνઓུΛબΜͰɺշదͳσϓϩΠϥΠϑΛ͓ա͍ͩ͘͝͠͞🙌
ຊηογϣϯͰৄ͘͠͞ͳ͔ͬͨ༰ "84$%,Λ৮ͬͨ͜ͱ͕ͳ͍ํ$%,ϫʔΫγϣοϓ͔Βࢼͯ͠Έ͍ͩ͘͞ (JU)VC"DUJPOTΛ৮ͬͨ͜ͱͷͳ͍ํΫΠοΫελʔτΛࢼͯ͠Έ͍ͯͩ͘͞IUUQTDELXPSLTIPQDPNIUUQTEPDTHJUIVCDPNKBBDUJPOTRVJDLTUBSU