YAPC::Japan::Online 2022 Track B
͡Θ͡ΘͱPerl͔ΒGoʹҠߦ͠Α͏ͱ͍ͯ͠ΔԶͨͪͷϚΠΫϩαʔϏγʔζYAPC::Japan::Online 20222022-03-05 Track B 13:40ʙ14:20@macopy a.k.a @mackee_w
View Slide
͜ͷηογϣϯͷུ֓
1FSMೖֶࣜ͘ΜIUUQTQFSMFOUSBODFDPOOQBTTDPN 3FOÉF'SFODIIUUQTSFOFFGSFODICMPHTQPUDPN
(·ͩ)શ෦ஔ͖͍͑ͯͳ͍
Tonamelͷنײ -PCJ5PVSOBNFOUޙͷ5POBNFM։ൃ։࢝5POBNFMʹ໊લ͕มߋ1FSMͷߦߦͭͳ͗͜ΈͰएׯ૿Ճ1FSMͷߦߦ(PϚΠΫϩαʔϏεº(Pͷߦߦ͏ͪίʔυੜߦ
͜Ε·Ͱ2΄Ͳ͔͚ͯ͡Θ͡ΘҠߦͭͭ͋͠Δ
ͦͷؒʹػೳ͕૿͑
େձ૿͍͑ͯ͘
͜ͷηογϣϯͰٞͷҰൠԽΛ͋͑ͯͤͣTonamelͰͷࣄྫΛ͠·͢
ୈ1ষ: ͳͥϚΠΫϩαʔϏεʹ͢Δͷ͔ʁୈ2ষ: ॳΊͯͷαʔϏεׂୈ3ষ: ϚΠΫϩαʔϏεͨͪͷ࿈ܞํ๏
@macopy• ໘ന๏ਓΧϠοΫ eεϙʔπࣄۀ෦TonamelαʔόαΠυςοΫϦʔυ• Perlେ͖ Go͖• GGST༻Ωϟϥ: ϥϜϨβϧ• ISUCON11 ༏উ ←NEW!
ୈ1ষͳͥϚΠΫϩαʔϏεʹ͢Δͷ͔ʁ
Ҡߦલͷߏ(ʙ2020-07)͜ͷޙʹϚΠΫϩαʔϏεԽʹ߹ΘͤͯECSԽ
՝: PerlͰڊେGraphQLΛ͘͞ͷՙ͕ॏ͍• TonamelͰओͳAPIܗࣜͱͯ͠GraphQLΛ࠾༻͍ͯ͠Δ• ڊେͳϨεϙϯεΛฦ͢ͱ͖ɺGraphQL.pm0.47(2021-02ϦϦʔε)ҎલͰܕνΣοΫ͕ϨεϙϯελΠϜͷ΄ͱΜͲΛΊ͍ͯͨ• GraphQLΛ͍ଓ͚Δʹɺ͜ͷ͋ͨΓʹԿΒ͔ͷվળҊ͕ඞཁͩͬͨ
ݱࡏͷGraphQL.pm(>=0.47)σϑΥϧτͰ࣮ߦ࣌ܕνΣοΫ͕Φϑʹͳ͍ͬͯΔ࣌ʹͳ͍ͬͯͨGraphQL QueryͷϕϯνϚʔΫΛͬͯΈͨ(256ਓγϯάϧΤϦϛωʔγϣϯͷΫΤϦ)$ carton exec perl -Ilib tmp/graphql_benchmark.pl bench 47bIgBenchmark: timing 10 iterations of default...default: 4 wallclock secs ( 3.22 usr + 0.08 sys = 3.30 CPU) @ 3.03/s (n=10)Rate defaultdefault 3.03/s —`local $ENV{PERL_STRICT} = 1;` ΛίʔυʹೖΕͯܕνΣοΫΛ༗ޮʹͯ͠ΈΔ(࣌͜ͷঢ়ଶͩͬͨ)$ carton exec perl -Ilib tmp/graphql_benchmark.pl bench 47bIgBenchmark: timing 10 iterations of default…default: 7 wallclock secs ( 6.57 usr + 0.07 sys = 6.64 CPU) @ 1.51/s (n=10)Rate defaultdefault 1.51/s --
͍͔ͭ͘ͷબࢶ• GraphQLΛ࠾༻͢Δ߹• Perl ͷ··Ͱ GraphQL ΛߴԽ͢Δ• GraphQLΛίετΊʹฦͤΔϥΠϒϥϦ͕͋ΔݴޠʹΓ͑Δ• ͦΕҎ֎Λ࠾༻͢Δ߹• PerlͰѻ͑ΔൣғͷAPIతͳͷʹ͢Δ• XslateͰMPAʹΔ
GraphQLҎ֎ͷ՝: εέʔϦϯάੑ• ͕͋ΔτϥϑΟοΫͷରԠ• όοΫΤϯυDB͕Aurora MySQLͳͷͰɺखಈͰεέʔϧΞοϓ/Πϯͯ͠ෛՙʹରԠ͍ͯͨ͠• => ӡ༻ͷख͕ؒ͠ΜͲ͍ͷͰɺࣗಈͰਫฏεέʔϧ͢ΔσʔλετΞʹҠߦ͍ͨ͠Ϟνϕʔγϣϯ• ྫ͑DynamoDBͱͳΔ͕ɺPerlͰDynamoDBΛѻ͏ϊϋ͕ͳ͍
ΠϕϯτʹΘΕΔαʔϏεͳͷͰτϥϑΟοΫͷ͕େ͖͍
GraphQLҎ֎ͷ՝: ੩తܕ͕ͳ͍ݴޠ͕ਏ͍• τʔφϝϯτදͷߏஙൺֱతෳࡶͳϓϩάϥϛϯάΛཁٻ͞ΕΔํ• εΠευϩʔͷOMW%, μϒϧΤϦϛͷഊऀαΠυͷஔͳͲ• ෳࡶͳϩδοΫΛΉͷʹܕ͕͋Δͱ”҆৺”͢Δ• ͪΖΜςετඞཁ
ͱ͍͏Θ͚ͰGo͕͍͍ͨ• GraphQL => gqlgenͱ͍͏εΩʔϚϑΝʔετͰ੩తܕνΣοΫΛߦ͏ϥΠϒϥϦ• ਫฏεέʔϦϯάՄೳͳDBΛ͍͍ͨ => GoެࣜAWS SDK͕͋ΓɺDynamoDBΛѻ͏ͨΊͷϥούʔϥΠϒϥϦ͋Δ• ੩తܕ͕ͪΐ͏Ͳ͍͍ײ͡ʹଘࡏ͢Δ• ͳʹΑΓνʔϜϝϯόʔ͕աڈʹͬͨ͜ͱ͕͋ΔݴޠͰ͋Δ
Ͳ͏GoΛΈࠐΉ͔ʁ• શ෦Goʹ͢Δͱʁ• ࠓ·Ͱೖ͍ͬͯΔDBʹೖ͍ͬͯΔσʔλΛͲ͏͢Δͷ͔• શ෦GoͰ࣮͠ऴΘΔ·Ͱ৽ن։ൃΛࢭΊΔͷ͔• => ݁ߏ͍͠• Ұ෦͚ͩGoʹ͍ͨ͠• ͕ͩDBΛڞ༗ͨ͘͠ͳ͍ DynamoDBʹ͍ͨ͠
ϚΠΫϩαʔϏεׂ͢Δ
ҰൠతͳϚΠΫϩαʔϏεͷޮೳ• ݸʑͷΞϓϦέʔγϣϯͷΛখ͘͞อͯΔ• ΞδϦςΟ͕ߴ͘ͳΔ• ΞϓϦέʔγϣϯ͝ͱʹదͳΞʔΩςΫνϟΛબΔ• ؔ৺͝ͱʹνʔϜΛׂ͢Δ͜ͱ͕༰қʹͳΔ• etc…
ϚΠΫϩαʔϏεΛΓ͔ͨͬͨͱ͍͏ΑΓͦΕҎ֎ͷྑ͍બࢶ͕ͳ͔ͬͨͷͰͬͨ• ϚΠΫϩαʔϏεΛબ͢Δͷʹ્͢Δཁૉ• νʔϜׂ͢Δ΄Ͳن͕େ͖͘ͳ͍• ͚Ͳɺݱঢ়ͷΞʔΩςΫνϟͰղܾͰ͖ͳ͍՝͕͋Δ• ࠷ऴతʹϞδϡϥϞϊϦεʹ߹ମ͢ΔՄೳੑ͋Δͱࢥ͍ͬͯΔ
ͦͦϞδϡϥϞϊϦεͩͬͨͷͰׂ͔ͬͨ͢͠• ઌਓ͕TonamelΛϞδϡϥϞϊϦεͰ࡞ͬͯ͘Ε͍ͯͨ• ׂ͢ΔͨΊͷػೳͷڥք͕͢Ͱʹଘࡏ͍ͯͨ͠
ͰͲ͏͍͔ͬͯ͘
ୈ2ষॳΊͯͷαʔϏεׂ
ॳखɺԿΛΓग़͔͢
͡ΊʹΓग़͢ͱྑ͍ͱ͞ΕΔαʔϏεͷ݅• ͋ΔఔαʔϏε͕ʮڥք͚ͮΒΕͨίϯςΩετʯʹͦͬͯղ͞Ε͍ͯΔલఏͰҎԼ• ଞͷίϯςΩετ͔Βͷґଘ͕গͳ͍ => ղ͍͢͠• ϩʔϧόοΫ͕͍͢͠ => ࡉ͔͘ϦϦʔεͰ͖Δ• ղʹΑΔརӹ͕େ͖͍
༏ઌॱҐ͚ݶʮϞϊϦε͔ΒϚΠΫϩαʔϏεʯΛࢀߟʹ
ͳͥτʔφϝϯτද͔• GraphQLͷϨεϙϯελΠϜΛվળ͔ͨͬͨ͠ͷτʔφϝϯτද• => ղʹΑΔརӹ͕͋Δ• τʔφϝϯτදʹ͍ͭͯ৽ػೳ(μϒϧΤϦϛωʔγϣϯ)ͷ࣮͕༧ఆ͞Ε͍ͯͨ• => ৽ػೳΛΔҰͱͯ͠ϚΠΫϩαʔϏεͷղ͕ߦ͑Δ• τʔφϝϯτද΄͔ͷαʔϏεʹґଘ͢ΔαʔϏεͳͷͰɺґଘ͞ΕΔଆͰͳ͍• => ղͷ͢͠͞
্ͬͨͰ͜ͷஅͷৼΓฦΓ• ৽ػೳͷҰͱͯ͠ղΛߦ͏ͷ͋·ΓಘࡦͰͳ͍• ϩʔϧόοΫ͕ͮ͠Β͘ͳΔ• ։ൃνʔϜ֎͔Βͷਐḿͷݟ͕ͨѱ͍• ໌ࣔతʹػೳͷϚΠΫϩαʔϏεͷ࠶࣮Λ͍ͬͯΔͱ͍͏ͷΛݴͬͨ΄͏͕ྑ͍• ϦϦʔε͕ϏοάόϯʹͳΓ͕ͪ(͋Δఔ؇ࡦ͋Δ)
طଘͷϦΫΤετͱ৽τʔφϝϯτදϦΫΤετͷ͚ํ
GraphQLΤϯυϙΠϯτΛ͚Δ
ϢʔβʔใϔομʹJWTͰຒΊࠐΉ• ϞϊϦεͰड͚ͨϦΫΤετͷCookie͔ΒϦΫΤετϢʔβʔͷηογϣϯใΛऔΓग़͢• ͜͜·Ͱैདྷ·Ͱ͋Δಈ࡞• `X-Awesome-Authentication: ` ͷΑ͏ͳHTTPϔομʹJWTϊܗͰೖΕΔ• ϓϩΩγͰBodyΛ͍ͬͨ͡ΓಡΜͩΓͨ͘͠ͳ͍
͞ΒʹύεΛ͚ͯϢʔβ×େձͷݖݶใ༩
GraphQLͷύεΛେձ͝ͱʹ͚Δྫ: େձID=XXXXX ͷ߹POST /new_awesome/graphql/XXXXX͜ΕͰBodyΛಡ·ͳͯ͘τʔφϝϯτදαʔϏε͕ΞΫηεϢʔβͷݖݶΛΕΔ
ͿͬͪΌ͚Δͱ͜Ε͓͢͢ΊͰͳ͍• GraphQLΤϯυϙΠϯτ͕Ұݸʹ·ͱ·Δͷ͕͍͍ͱ͜ΖͷҰͭ• ΫϥΠΞϯταΠυෳݸʹ͔ΕΔͷରԠ͍ͯ͠ͳ͍͜ͱ͕ଟ͍• ͬͱ΄͔ʹΓํ͕͋ͬͨɺޙड़͢Δେ౷Ұʹ࣋ͪӽ͍ͯ͠Δ• ผղ: ύʔεޙʹผͷAPIʹେձใ+ݖݶใ͍߹Θͤ + େձαʔϏεΛઌʹ࡞Δ
ͰͲͷΑ͏ʹຊ൪ʹೖΕΔ͔
͓खܰʹαΠυΧʔʹͨ͠
αΠυΧʔʹ͢ΔϝϦοτɾσϝϦοτ• ϝϦοτ• Πϯϑϥ͕ෳࡶʹͳΒͳ͍, Ճ͢Δख͍ؒ҆• εέʔϧΞτϞϊϦεͱҰॹʹ͢Δ => ෛՙ͕ಡΊͳ͍ͱ͖ʹศར• σϝϦοτ• ECS Taskͷ10ίϯςφ੍ݶΛ͑Δ͜ͱग़དྷͳ͍• αʔϏεͷधཁʹ߹ΘͤͯݸผʹεέʔϧΞτ͕ग़དྷͳ͍
ͯ͞ϦϦʔε…͕ͩ💥Ϗοάόϯ💥Λආ͚͍ͨ
ϕετϓϥΫςΟε: 💥Ϗοάόϯ💥Λආ͚Δ• ͜ͷ߹ͷϏοάόϯͱ• ͍͖ͳΓ৽࣮ͨ͠ϚΠΫϩαʔϏεʹαʔϏεશମΛΓସ͑Δ• ϏοάόϯͷσϝϦοτ• Γ͕͠ࠔʹͳΔ• ϦϦʔε୯Ґ͕େ͖͘ͳΔ => ݁ՌతʹσϦόϦʔ͕͘ͳΔ
τʔφϝϯτදαʔϏεͰߦͬͨ͜ͱ• Ұ෦ͷϢʔβʹݶఆػೳͱͯ͑͠ΔΑ͏ʹఏڙ• ϑΟʔυόοΫΛΒ͍͍͢Ϣʔβʹݶఆͯ͠ఏڙͰ͖Δ• େ͖ͳେձΛආ͚ͯఏڙ͢Δ• چτʔφϝϯτදػೳฒߦͯ͠ఏڙ͠ଓ͚Δ• ͕͋Εݹ͍ํΛͬͯΒ͏
β൛தʹߦͬͨ͜ͱ• ຊ൪ͰΤϥʔϩά͕ग़ͨΒ͙͢ʹ͢• σʔλͿͬյΕܥ͍ʹগͳ͔ͬͨ(͋Δʹ͕͋ͬͨ)• ن͕େ͖ΊͷେձͰΘΕͯͨΒࢹ͍ͯ͠ΔϝτϦοΫΛݟΔ• DynamoDBΛॳΊ͍ͯͬͯͨͷͰෛՙ͕Θ͔Βͳ͔ͬͨͷ͋Δ• ༷ʑͯ͠େৎͦ͏ͳͷͰਖ਼ࣜϦϦʔε
͍Ζ͍Ζ͕͋ͬͨͨ͠ʂ
Ͱ͜Ε͚ͩͩͱͨͩͷPolyglotߏͩΑͶ
ୈ3ষϚΠΫϩαʔϏεͨͪͷ࿈ܞํ๏
τʔφϝϯτදαʔϏεҎ߱ͷ։ൃํ• GoΛؚΊͨpolyglotͰΕΔ͜ͱ͕Θ͔ͬͨͷͰҎԼͷํʹ͢Δ• ৽ػೳͯ͢ϚΠΫϩαʔϏεଆʹ࣮͢Δ• طଘػೳͷվमPerlϞϊϦεͷ࣮͕ۃʹૣ͍߹ͦͪΒʹ࣮͢Δɻͦ͏Ͱͳ͍߹ϚΠΫϩαʔϏεଆ
࣍ԿΛΓग़͢ͷ͔
༏ઌॱҐ͚ݶ
༏ઌॱҐ͚ݶ(Update൛)
εϙϯαʔػೳΛ࡞Δ͜ͱʹͳͬͨ
εϙϯαʔػೳͱ• େձϖʔδʹࠂΛࡌͤΒΕΔػೳ• ࠂओ࠵ஂମ͕ืूͯ͠ɺࠂओ͕ओ࠵ஂମʹ͓ۚΛ͏͜ͱͰࡌͤͯΒ͑Δ
ઃܭํ• εϙϯαʔαʔϏεͱܾࡁαʔϏεͷ2ͭʹׂ͢Δ• εϙϯαʔαʔϏεͷ => େձʹඥͮ͘εϙϯαʔͷཧ• ਃ༰ঝೝϑϩʔɺऔΓԼ͛ͳͲΛ͔ͭ͞ͲΔ• εϙϯαʔ͕ԿΛͬͯਃ͞ΕΔ͔͋·Γؾʹ͠ͳ͍• ܾࡁαʔϏε => StripeΛ༻͍ͨ͋Δਓ͔Β͋Δਓͷࢧ͍ͷཧ• Կͷࢧ͍͔ܾࡁαʔϏε͋·Γؾʹ͠ͳ͍
εϙϯαʔػೳͷσʔλͷྲྀΕ
͜͏ݴ͏ਤΛ࠷ॳʹॻ͘ͷ͓͢͢Ίʂ
Domain Event• ৽τʔφϝϯτදαʔϏε࣮Ҏલ͔Β͋ΔඇಉظδϣϒΛҕৡ͢ΔͨΊͷػߏͱͯ͠Domain Eventͱݴ͏֓೦Λ༻ҙͨ͠• ࣮ৄࡉతʹHTTPͰLambdaΛୟ͘ͱSQSʹΤϯΩϡʔ͞ΕͯɺϝοηʔδΛผͷLambda͕ىಈͯ͠ɺ֤ϚΠΫϩαʔϏεͷhandlerʹϝοηʔδΛ৴͢Δ• ϝοηʔδʮ○○͕ىͬͨ͜ʂʯͱ͍͏ײ͡Ͱpublish͞Ε͍ͯΔ• ʮ˓˓Λͯ͘͠Εʯͱ͍͏ײ͡Ͱͳ͍
େձ࡞࣌ͷϝοηʔδ৴εϚʔτΤϯυϙΠϯτɾμϜύΠϓతͳࢥ
εϙϯαʔػೳͷͦͷଞ• σʔλετΞMySQL• τʔφϝϯτදαʔϏε΄ͲͷεέʔϧΞτੑೳ͍Βͳ͍• ౿ΜͰͯࣾͰൺֱతѻ͑Δਓ͕ଟ͍MySQLΛ͏• ΞʔΩςΫνϟActive Recordύλʔϯ• τʔφϝϯτදαʔϏεClean Architecture
͜ΕͳΜͱ͔ϦϦʔεʂ
·ͱΊͱࠓޙͷల
ϚΠΫϩαʔϏεखஈͰ͋ΓతͰͳ͍• TonamelʹͱͬͯϚΠΫϩαʔϏεҎԼͷ՝Λղܾ͢Δखஈ• ݱࡏͷαʔϏεΛࢭΊͣʹஞ࣍৽ػೳΛՃ͢Δ• ϞϊϦεଆͷ࠾༻ٕज़Ͱग़དྷͳ͔ͬͨ͜ͱΛॊೈʹಋೖ͢Δ• ࣌ظ͕དྷΕશ෦·ͨϞδϡϥϞϊϦε߹ମ͢Δͷݕ౼• νʔϜ͕ෳʹͳΔ͙Β͍େ͖͘ͳΔ͔Ͳ͏͔• ࡞Δͷ͕ਖ਼͍͔͠Θ͔ΒΜॳظϞϊϦεͷ΄͏͕͍Ͱ͢• ϞϊϦε͔ΒΓग़͢߹ɺਖ਼͘͠ಈ͘ͷ͕ͦ͜ʹ͋Δ͔Β࡞Δͷ͕ૣ͘ͳΔ
ࠓޙͷల• Apollo Federationͷಋೖ• PerlϞϊϦε, τʔφϝϯτද, εϙϯαʔ, ܾࡁͱͯ͢GraphQL͕͔Ε͍ͯΔͷΛ౷߹͢ΔͨΊͷιϦϡʔγϣϯ• ϞϊϦεʹ͋Δͯ͢ͷػೳΛϚΠΫϩαʔϏεׂ• ݱࡏҠ২࡞ۀதͷͷ͋Γ
Any Questions?
ࢀߟʹͨ͠ͷ• ʮϞϊϦε͔ΒϚΠΫϩαʔϏεʯSam Newman ஶ, ౡా ߒೋ ༁• ͜ͷࢿྉΛ࡞Δࡍʹࢀরɻ͖ͬͯͨ͜ͱͷཧ͚આ໌ʹ༻͍ͨɻ͜ͷຊͰΞϯνύλʔϯͱ͞Ε͍ͯΔ͜ͱɺTonamelͰ(ؾ͔ͮͣʹ)ߦ͍ͬͯΔɻ
ิҨಠཱσϓϩΠՄೳੑ
ϚΠΫϩαʔϏεͰ͜Εͬͱ͍ͨ΄͏͕͍͍ͧͬͯͭ• ʮϞϊϦε͔ΒϚΠΫϩαʔϏεʯͱ͍͏ຊʹॻ͔Ε͍ͯΔຊॻ͔ΒಘΒΕΔͷ͕͚ͭͩͩͱͨ͠ΒɺͦΕʮϚΠΫϩαʔϏεʹಠཱσϓϩΠՄೳੑͷ֓೦Λ࣮֬ʹऔΓೖΕΑ͏ʯͱ͍͏͜ͱͩɻ
ಠཱσϓϩΠՄೳੑ🤔
ಠཱσϓϩΠՄೳੑͱ• ʮ͋ΔϚΠΫϩαʔϏεʹର͢ΔมߋΛɺଞͷαʔϏεʹӨڹΛ༩͑Δ͜ͱͳ͘ຊ൪ڥͰϓϩΠͰ͖Δͱݴ͏ߟ͑ํͩɻʯ• by ʮϞϊϦε͔ΒϚΠΫϩαʔϏεʯ• αʔϏεAΛมߋͨ͠ͱ͖ʹɺҰॹʹαʔϏεBมߋ͠ͳ͍ͱ͍͚ͳ͍ʂͱ͍͏ͷಠཱ͍ͯ͠ͳ͍• => ϚΠΫϩαʔϏεͰͳ͘”ࢄϞϊϦε”ͱ͍͏͜ͱʹ
ಠཱσϓϩΠՄೳੑͷద༻• TonamelͰͦ͜·ͰશͳಠཱੑΛ୲อͰ͖͍ͯͳ͍• τʔφϝϯτදαʔϏεPerlϞϊϦεͷαΠυΧʔલఏͷ࡞Γ• εϙϯαʔαʔϏεͱܾࡁαʔϏε΄ͱΜͲͷ௨৴͕Eventܦ༝• ඇಉظΠϕϯτରԠ͢Δϋϯυϥʔ͕࣮͞Εͯͳ͚Εແࢹ͢Δ͚ͩͳͷͰಠཱσϓϩΠՄೳੑ͕͋Δ
ಠཱσϓϩΠՄೳੑΛୡ͢ΔͨΊͷઓུ• αʔϏεؒͷґଘؔΛDAG(༗ඇ८ճάϥϑ)Ͱఆٛ• αʔϏεؒAPIʹඇޓ͕ൃੜ͢Δ߹• ґଘ͞ΕΔଆޙํޓੑΛߟྀ͢Δ• deprecatedͳkeyΛҠߦظؒαϙʔτ͢ΔͳͲ• ґଘ͢ΔଆޓੑΛߟྀͤͣ͏
αʔϏεؒґଘؔͷDAG
“جຊతʹ”ಉ࣌ʹߋ৽͕ඞཁͰ͋ͬͯґଘ͞ΕΔଆ͔ΒσϓϩΠ͢ΕOKσϓϩΠ͚Ε͍͍͚ΕͲݕূͳͲͷؔͰػೳ୯ҐͰσϓϩΠ͕ͪ͠
TonamelͷσϓϩΠϑϩʔ• લఏ: αʔόɾϑϩϯτΤϯυɾΠϯϑϥͯ͢ҰͭͷϨϙδτϦ(monorepo)Ͱཧ͍ͯ͠Δ• ϦϙδτϦ͕ࢄͯ͠ͳ͍ͷͰɺmasterϒϥϯνͰϩʔΧϧڥΛཱͯͨΒͦͷ··ຊ൪ՔಇͷαʔϏεͱΠίʔϧͷͷ͕ಘΒΕΔ• ͦΕͧΕͷαʔϏεಠཱͨ͠ECSαʔϏεσϓϩΠ͞ΕΔ• σϓϩΠπʔϧkayac/ecspresso
monorepoͳͷͰશ෦ͷαʔϏεΛͲʔΜͱΔͧʂ
ຖճશ෦ͷαʔϏεΛσϓϩΠ͍ͯ͠Δͱ͍ʂ
ࢄϞϊϦεσϓϩΠ͕͘ͳΔ• σϓϩΠ͢Δͱ͖ʹͯ͢ͷαʔϏεΛ͋Δॱ൪ʹԊͬͯσϓϩΠ͠ͳ͍ͱ͍͚ͳ͍ͱͳΔͱɺσϓϩΠʹඇৗʹ͕͔͔࣌ؒΔ• ϩʔϦϯάσϓϩΠͷ߹ Blue/Greenͷ߹ૣ͍͔• σϓϩΠ͕͘ͳΔͱϩʔϧόοΫ͘ͳΔ͜ͱ͕ଟ͍͠ɺԿΑΓػೳͷσϦόϦʔʹ͕͔͔࣌ؒΓɺϦϦʔεϏοάόϯ͡Όͳ͍ͱ͍ͬͨͳ͍Έ͍ͨʹͳͬͯྑ͘ͳ͍
େମͰಠཱσϓϩΠՄೳͳͷͰߋ৽͞ΕͨαʔϏε͚ͩͰϓϩΠͯ͋͠ͱσϓϩΠεΩοϓ͢Ε͍͍ͷͰʁ
σϓϩΠεΩοϓઓུ• ECSʹ͏ίϯςφΠϝʔδͷߋ৽ΛɺʮαʔϏε͕ґଘ͢ΔrepositoryͷಛఆͷσΟϨΫτϦ͕ߋ৽͞Ε͍ͯͨΒʯʹ͢Δ• ٖࣅతʹpolyrepoతͳcommit hashΛಘͯλάʹ͏• ຊ൪ڥͱσϓϩΠ༧ఆͷcommit hashؒͰECS Task Definitionͷ͕ࠩ͋ΕσϓϩΠ͢Δ• ecspresso diff ΛͬͯdiffΛ֬ೝ
σϓϩΠͷ༷ࢠ