- TOP
- ã¿ã°äžèЧ
- SQLite
SQLite
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
æè¡ããã°
æ¬èšäºã¯ã Merpay & Mercoin Tech Openness Month 2026 ãã®17æ¥ç®ã®èšäºã§ãã ãã®èšäºã¯æ°ããããŒã«ã§ããPdE (Product Engineer)ãšããClient / Backend ã®å¢çããŸãããè¶å¢éçºãããŒã«ã®åãçµã¿ã«ã€ããŠã@anzai, @victoria Li, @ninnin, @panoramaã®4åã§ãéãããŸããèšäºæ¬æã¯ããã®ãã¡ã®1人ã§ãã anzai ããèªåã®äœéšãäžäººç§°ã§æ¯ãè¿ãåœ¢ã§æžããŠããŸãã ã¯ããã« ãClient ãšã³ãžãã¢ã Backend ãæžããBackend ãšã³ãžãã¢ã Client ãæžããââãããªäœå¶ã¯å®éã«æç«ããã®ããQ4 ã«è©Šããå°ããªå®éšã玹ä»ããŸãã ã²ãšããšã§ãŸãšãããšãAndroid ãšã³ãžãã¢ã Postgres ã®ããŒã¿ããŒã¹ïŒDBïŒèšèšãšãµãŒããŒå®è£
ãæžããBackend ãšã³ãžãã¢ã iOS/Android ã®ç»é¢ãäœããŸããããã£ãŠã¿ãŠæç«ã¯ãããã®ã®ã楜ãªéã§ã¯ãããŸãããäœãå¹ããŠãã©ãã§è©°ãŸã£ãã®ããæ¬èšäºã§ã¯ãè¶å¢éçºããšããããŒãã«çµã£ãŠããã®å®éãå
±æããŸãã è¶å¢éçºã®èæ¯ ç§ã¯æ®æ®µã¡ã«ãã€ã§ClientïŒAndroid / iOSïŒã®ããŒã ãèŠãŠãã Engineering Manager ã§ããä»åã¯ManagerãšããŠã§ã¯ãªããèªåã®æã§ã³ãŒããæžãäžå¡ãšã㊠KYCïŒæ¬äººç¢ºèªïŒé åã®AI pod (å°èŠæš¡ãªéçºããŒã )ã«åå ããŸããã ãã®ããŒã ã§ã¯ãProduct ManagerïŒPdMïŒã眮ããããšã³ãžãã¢ã1人ã§1ãããžã§ã¯ãã仿§çå®ããããªããªãŒãŸã§äžæ°éè²«ã«æã€ïŒ1 Person 1 ReleaseïŒããšããäœå¶ã詊ããŠããŸãã ãããŠãã®äœå¶ãåãããšãããšãé¿ããŠéããªã課é¡ã1ã€åºãŠããŸããããã¯ã1人㧠End-to-EndïŒE2EïŒã«æã€ãªããClientã Backend ãèªåã§æžãããšã«ãªãããšããããšã§ãã KYC ã®ãããžã§ã¯ãã¯ãã»ãšãã©ã®å Žå iOS / Android ã®ClientãšããµãŒããŒåŽã® APIã»DB ã®äž¡æ¹ã«æãå
¥ããŸããåŸæ¥ã¯ãããã¯ã©ã€ã¢ã³ãæ
åœãšãµãŒããŒæ
åœã§åããŠããŸããã1人1ãããžã§ã¯ãã«ãããªãããã®å¢çããŸããå¿
èŠããããŸããE2Eã§éçºããäžã§ãClient ãšã³ãžãã¢ã Backend ããBackend ãšã³ãžãã¢ã Client ãéçºã§ããããããå®ãããžã§ã¯ãã§æ€èšŒããããšã«ããŸããã ããã€ãã®ãããžã§ã¯ãã§ Client-Backend ãäžæ°é貫ã§éçºããçµæã仿ã¯ã©ã¡ããæç«ããŸãããClient ãšã³ãžãã¢ããµãŒããŒã® DB ãš API ãæžããŠãªãªãŒã¹ããBackend ãšã³ãžãã¢ãã¢ãã€ã«ã®ç»é¢ãåºããããèªäœãããŸã確ããããã£ãããšã§ãã 以äžã§ã¯ãç§ãã©ãéçºãé²ããããæç³»åã§æ¯ãè¿ãããã®ããšã§ãã©ãã§è©°ãŸã£ãããå
±æããŸãã AI ãæŽ»çšããè¶å¢éçºã®é²ãæ¹ ç§ã¯Clientãšã³ãžãã¢ã§ããä»åæ
åœãããããžã§ã¯ãã§æçµçã«å¿
èŠãšããŠããã¢ãŠããããã¯ãå
·äœçã«ã¯2ã€ã§ããã1ã€ã¯ã客ããŸã«èŠãã UI/UXããã1ã€ã¯ããã®åŸã®æ¥åå ±åã«äœ¿ãã¬ããŒãã§ãããã®2ã€ã®å
·äœçãªã¢ãŠããããããéç®ããŠããã§ã¯ããã®è£åŽã§ã©ããªä»çµã¿ãå®è£
ããªããã°ãªããªããããæ±ºããŠããå¿
èŠããããŸããããããŠãã®ä»çµã¿ã®å€§éšåããç§ã«ãšã£ãŠåããŠã®ãµãŒããŒãµã€ãïŒGo / PostgresïŒã§ãã ããã§ãŸããæ¢åã®å®è£
ã AI Agent ã«èªã¿èŸŒãŸããããã®2ã€ã®ã¢ãŠãããããæºããã«ã¯ãã©ããªèšèšã»å®è£
ãå¿
èŠããã AI ã«æ€èšããŠããããšããããå§ããŸãããèŠä»¶ã¯æå
ã«ããã®ã§ãããšã¯ãããåããŠã®èšèªãšç°å¢ã«ã©ãèœãšããã ãã®èšäºã®ããããå
ã¯ããã®éã®ããæç³»åã§ãã©ããŸãã AI ã®èª¬æãã³ãŒãããæåã¯ããããªã æåã«ã¶ã€ãã£ãã®ã¯ãã³ãŒããæžã以åã®åé¡ã§ãããAI Agent ãè¿ããŠãã説æãã®ãã®ããäœãèšã£ãŠããã®ãããããªãã®ã§ãã ããšãã°ãPostgres ãèµ·åããŠãgoose ã§æ¢åã® migration ãæµããŠãpsql ã§ç¢ºèªããŠããš AI ã«èšãããŠããæåã¯äœãæããŠããã®ãããŸã£ããçè§£ã§ããŸããã§ãããgoose ãšã¯äœããpsql ã§äœã確ãããã°ããã®ã ââ ãã®ã²ãšã€ã²ãšã€ããClient éçºããããŠããªãã£ãç§ã«ã¯åããŠã®èšèã§ããAI ã¯æ£ããããšãèšã£ãŠããã®ãããããªãããã©ããã¡ãã«ãããåãåãåæç¥èããªãããšããç¶æ
ããã®ã¹ã¿ãŒãã§ããã ããã§ãã£ãã®ã¯ãã²ããã AI ã«åãè¿ãããšã§ãããããã¯ã©ãããæå³ãããå³ã«ããŠèª¬æããŠããããšããããããªãã¿ãŒã³ã§åã¿ç ããŠãããããããŠèªåãçŽåŸã§ãããããã®çè§£ããããããããšã§ãããããšãä»åºŠã¯å¥ã®Backendãšã³ãžãã¢ã«ç¢ºèªãã«è¡ãããããç¹°ãè¿ãããšã§ãç°å¢ãã©ãåããŠããŠãäœãããã°ãã¹ããåãã®ããéçºã®åææ¡ä»¶ããŸãé ã«å
¥ããŠãããŸããã åæãèŠããŠãããšããã§ãããããå®è£
ã§ããããã»ã©ã®èŠä»¶ãããšã«ãèšèšããŠå®è£
ããŠã¿ãŠããš AI Agent ã«ãé¡ãããã³ãŒããæžããŠããããŸãããããšä»åºŠã¯ãåºãŠããã³ãŒããã®ãã®ãèªããŸããã ãªãããã§ defer ãåŒãã§ããã®ãããªã cancel() ããªããã°ãªããªãã®ããããã§ context ãåãåã£ãŠããã®ã¯ãã€ãŸãã©ãããããšãªã®ããGo ã®ã€ãã£ãªã ããããšããšãããããªãã®ã§ãã ããã§æåã¯ãäœã£ãŠããã£ãã³ãŒããäžè¡äžè¡ããã¹ãŠ AI ã«è§£èª¬ããŠããããŸããã context ã®ãã£ã³ã»ã«ã§ãªãœãŒã¹ãè§£æŸããªããš goroutine ãæŒãããã ãããã®äœçœ®ã§ defer cancel() ããããããã説æã1ã€ãã€åããªãããææ³æžã§ã¯ãªãç®ã®åã®å®ã³ãŒããææã«ããŠèªã¿è§£ããŠãããŸãã ãªããDB ã«ã€ããŠã¯ãŸã£ããã®ãŒãããã§ã¯ãããŸããã§ãããã¢ãã€ã«ã§ã端æ«äžã® SQLite ã§ããŒãã«ãèšèšããã¯ãšãªãæžãæ©äŒã¯ãããŸããæ£èŠåãã€ã³ããã¯ã¹ãšãã£ãåºç€æŠå¿µãã®ãã®ã¯æã£ãŠããã®ã§ããµãŒããŒã® Postgres ã¯ãç¥ã£ãŠããæŠå¿µãå¥ã®ã³ã³ããã¹ãã«ç¿»èš³ãããäœæ¥ã«è¿ããããã¯å©ãã«ãªããŸããã ãã£ã³ã¯ããšã®äžŠèµ°åã«ãã©ãçã ãã ããå
šéšæžããŠããã£ãŠããäžè¡ãã€è§£èª¬ãã§ã¯ãã©ãããŠãå¹çãè¯ããããŸããããããå€ããã®ããããŒã ã®ãµããããã§ããã ç§ãã¡ã¯é±ã«1åã¬ããã¹ãã¯ãã£ããéããããŒã ã®é²ãæ¹ãå°ããã€æ¹åããŠããŸããããã®äžã§ãã¡ã³ããŒã®äžäººãããã£ã³ã¯ïŒæå³ã®ããå¡ïŒããšã®äžŠèµ°åããšããããæ¹ãæã¡èŸŒã¿ãŸããAI ã«äžæ°ã«å
šéšãçæãããã®ã§ã¯ãªããæå³ã®ããã³ãŒããããã¯åäœã§å®è£
ãããããã®ãããã¯ãããªãå¿
èŠãªã®ãããèªåãçè§£ã§ããã°ãã®ãŸãŸé²ããçè§£ã§ããªããã°ãã¡ããšåãè¿ããããã㯠A ãš B ã®ããæ¹ãããããã ããã©ããªã A ãéžãã ã®ãããšéœåºŠããããŠããããšã§ãã³ãŒãã®äžè¡ãã€ã®æå³ãçè§£ããªããåã«é²ã¿ãŸãã ãã®ããæ¹ã ãšã巚倧ãªçæç©ãäžããé ã«èªã¿äžãå¿
èŠããªããªããéçºã®æµãããæå³ã®ããé åºãã§çè§£ã§ããŸããæ©æ¢°çãªè¡é ã§ã¯ãªããèšèšã®æå³ã«æ²¿ã£ãé åºã§é ã«å
¥ã£ãŠããæèŠã§ãã質åãšåçã¯ãã°ãšããŠæ®ããèªã¿è¿ãã°ã仿¥ã¯äœãåŠãã ããã®åŸ©ç¿ã«ããªããŸããã éžãã çç±ãæ®ããAI ã®ã³ãŒããèªåã§çè§£ãã ãã®é²ãæ¹ã«ã¯ãæãã¬å¯ç£ç©ããããŸããããããã€ãã®éžæè¢ã®ãªãã§ããªããã® A ãéžãã ã®ãããéçºã®éçšã§ãã§ã«èšèªåããŠããã®ã§ãããããã®ãŸãŸ Pull RequestïŒPRïŒã®èª¬æã«æžããã®ã§ããçµæãšããŠãã¬ãã¥ãŒã¯ããã»ã©è©°ãŸãããšãªãåŸãããŸãããåããŠã®é åã§ããéžæã®æ ¹æ ãæ·»ããããã°ã¬ãã¥ã¢ãŒã¯å€æããããã§ãããããããŸã§èããäžã§ã®PRãªãã ãªããšããä¿¡é ŒãåŸãããŸãããã®ããŒã®PRãèªãããšã¯ã³ãŒããªãŒããŒã«ãšã£ãŠå€§å€ãªè² æ
ã§ãã®ã§ããã®ãããªè¶å¢éçºã«ãããŠä¿¡é Œãäœãããã®èª¿æ»ã¯å¿
èŠãªå·¥çšã ã£ããšæããŸãã ããã§1ã€ãç«ã¡æ¢ãŸã£ãŠèããã¹ãè«ç¹ããããŸããAI ãæžããã³ãŒããã人éãããããèªãã§çè§£ããå¿
èŠã¯ããã®ããçæããŠããã¹ããéã£ãŠãåãã°ããã®ã§ã¯ãªãããããã¯ããããéèŠã«ãªãè°è«ã ãšæããŸãã ç§ã®çŸæç¹ã®çãã¯ãçè§£ãã¹ããã§ãã ããããã®çç£æ§ã¯ãæžããã³ãŒãéã§ã¯ãªããæææ±ºå®ã®åæ°ãšè³ªã§ã»ãŒæ±ºãŸã£ãŠãããšèããŠããŸãããããŠæææ±ºå®ã®è³ªãšåæ°ãäžããã«ã¯ããã¡ã€ã³ã®çè§£ãå¿
èŠã§ããããã®ããã¯ãšã³ãã®èšèšã¯ãããã§æ¬åœã«æ£ããã®ããã倿ããå Žé¢ã§ãããŸã®ãšããæçµçãªå€æã¯äººéãããŠããŸãããã®å€æãäžããã ãã®çè§£ãæã£ãŠããªããšãæææ±ºå®ã®åæ°ã質ãäžãã£ãŠãããŸãããã ãããããAI ãæžããã³ãŒãã§ãäžèº«ãçè§£ããŠãã䟡å€ãããããšããã®ãä»ã®ç«å Žã§ãã ãŸãAIã®ä»çµã¿çã«ãæ°žé ã«ãã®PRã«å¯ŸããŠæ¹åãã€ã³ããèãåºãããšãã§ããŸããããšãã°ãããPRã«ã€ããŠ1åç®ã®ã»ãã·ã§ã³ã§AIã«èããš Aã»Bã»C ã®3ç¹ãçŽãããèšããããã®ä¿®æ£çµæãå¥ã®ã»ãã·ã§ã³ã§èããšãä»åºŠã¯ Eã»Fã»G ã®3ç¹ãçŽãããèšãããããšããããšãèµ·ãããŸãããããå
šéšåæ ãããšãæçµçã«ã¯ãªãŒããŒãšã³ãžãã¢ãªã³ã°ããèšå€§ãªPRã«ãªããã¡ãªã®ã§ãçŸç¶ã¯ãã©ããŸã§ãé©åããã人ã倿ããå¿
èŠãããã§ãããã ãããã®ãçè§£ãããã®ã«2ã3幎ãããé·ææè³ãªããåŠã¶çç±ã¯ãã£ãšå³ããåãããã§ããããã§ããå®éã¯ããã§ã¯ãããŸããã§ãããããŸã® AI Agent ã«ãããªã³ããŒãã£ã³ã°ã¯æ¬åœã«ãããããããã°åªç§ãªæå°åœ¹ãé£ã«ã€ããŠããã€ã§ããã¢ããã«ä»ãåã£ãŠããããããªç¶æ³ã§ãããã®ç°å¢ã§ããã°ã3ã¶æãããã°ãããŸéçºããŠããé åã®äžéãã®ç¥èã¯åŸããããšããæå¿ãããããŸããããã¡ãããããšããšã·ãã¢ãšã³ãžãã¢ãšããŠã®çµéšãããããšããæ¡ä»¶ä»ãã§ã¯ãããŸããæè³ååãæ°å¹Žã§ã¯ãªãæ°ã¶æã®åäœã«çž®ãã§ããã®ãªããçè§£ããåŽãéžã¶ã®ãåççã ãšèããŠããŸãã èšèšã®æçµç¢ºèªã¯ã·ãã¢ãšã³ãžãã¢ãš ãšã¯ãããAI ã«èãã°ãã®ãŸãŸæ¡çšããšã¯ããŸããã§ããã象城çã ã£ãã®ãã€ã³ããã¯ã¹ã®èšèšã§ãã ããã®ã«ã©ã ã«ã€ã³ããã¯ã¹ã匵ãã¹ãããããAI ã®ææ¡ãéµåã¿ã«ããã®ã§ã¯ãªãããªãå¿
èŠãªã®ãïŒäžèŠãªã®ããèªåã§æ ¹æ ãæã£ãŠèª¿ã¹ãŸãããã©ããªã¯ãšãªãã¿ãŒã³ã§åŒãããã®ããã«ãŒãã£ããªãã£ã¯ã©ãããèªã¿åããéããªãã¶ãæžã蟌ã¿ã³ã¹ããšã®ãã¬ãŒããªãã¯ã©ããªãã®ãããããã芳ç¹ã1ã€ãã€ç¢ºãããŠãããã®èšèšã«ã¯ããããçç±ãããããšèª¬æã§ããç¶æ
ã«ããŸãã ããã§ããæåŸã¯ã·ãã¢ãšã³ãžãã¢ãšäžç·ã«ã¬ãã¥ãŒããŸãããæ£çŽã«èšãã°ãããã¯èªåã®èªä¿¡ã®ãªããåããããã§ããããŸãããAI ãçæãããã®ãæ¬åœã«æ£ããã®ãããã®æçµçãªå€æããç§äžäººã§ã¯ã©ãããŠãã€ããªãã£ãããã§ãã ãã®ã¬ãã¥ãŒã«ã¯ãäžå®ãæ¶ã以äžã®äŸ¡å€ããããŸãããã·ãã¢ãšã³ãžãã¢ããèãåŸããã¿ãŒã³ãããã€ãæããŠãããããã§ãã§ã¯ããã®æ¹æ³ã§ãããŸãããããšæææ±ºå®ã§ããããã€ãã®æ¹åç¹ãèŠã€ãããŸããããããã¿ãŒãª ããæ¹ã«ãã©ãçãããã§ã人ãšäžç·ã«èŠãŠãããå·¥çšã¯ãã¯ãå¿
èŠã ã£ãããã«æããŸãããã¡ã㯠Backend ãšã³ãžãã¢ã Client éçºãããå Žåãåæ§ã§ããã AI ã§äžæžããšçè§£ãå éããèªåã§æ ¹æ ãåºããæçµçã«ã¯äººãšã¬ãã¥ãŒããããã®3段æ§ãããåããŠã®é åã§å質ãæ
ä¿ãããã€èªåãå®å¿ããŠåã«é²ãããã§ãçŸå®çãªããæ¹ã§ãããAI ã¯åºçºç¹ãšäŒŽèµ°è
ãšããŠã¯éåžžã«åŒ·åã§ããããèšèšã®æçµçãªåŠ¥åœæ§ãèŠæ¥µããéžæè¢ãåºããŠãããã®ã¯ããŸã 人éã®ã¬ãã¥ãŒã ã£ãããšããã®ã宿ã§ãã ãªããä»åæžãã DB èšèšã¯2ããŒãã«ã ãã®ã·ã³ãã«ãªæ§æã§ãæ¬æ Œçãªåæ£ãã·ã£ãŒãã£ã³ã°ã®èæ
®ãŸã§ã¯èŠããŸããã§ãããããŒãã«ãå¢ããè€éãªã€ã³ããã¯ã¹èšèšã絡ãèŠæš¡ã§ãAI ãšãã®3段æ§ããã©ããŸã§éçšããã®ãã¯ããŸã æ€èšŒã§ããŠããŸããããã·ã³ãã«ã ã£ãããåã£ããå¯èœæ§ã¯ååã«ãããŸãã æåŸã«è£è¶³ãããšãããããŠé²ããããèæ¯ã«ã¯ãçµç¹å³äžã§ãè¶å¢ããããã®ã§ã¯ãªããåãããŒã ã®äžã§äºãã®é åããã¢ããã§æãåããç°å¢ããã£ãããšã倧ããã§ããAI ã«èããŠãããããªãããšãããããäœãèãã°ãããããããªãããšã¯ãé£ã«ãã詳ããã¡ã³ããŒã«ãã®å Žã§èããAI ãšäººãäž¡æ¹ã«é Œããçžæãããããšããè¶å¢ã®ã³ã¹ããæãäžããŸããã ã€ãŸããããã€ã³ããšå¯Ÿç ãããŸã§ã¯ãã©ãä¹ãè¶ãããããäžå¿ã«æžããŠããŸããããå®éã«ã¯æ°å€ãã®è©°ãŸãã©ããããããŸããããããŠãã®å€ãã¯èšèšãå®è£
ã®é£ããã§ã¯ãªããç°å¢ã»ããŒã«ã»éçšãã€ãŸãã³ãŒããæžã以å€ã®å
šéšã«ãããŸãããClient ããæžããŠããªãã£ã人éã Backend ã«å
¥ããšãããã§ããšããšãè¶³ãåãããŸãã代衚çãªãã®ã課é¡ããšã«ç޹ä»ããŸãã çŸç¶ã®éçºã¹ã¿ã€ã«ãããããªã æåã®å£ã¯ãéçºã¹ã¿ã€ã«ãã®ãã®ã®éãã§ããã Clientãšã³ãžãã¢ã®æèŠãšããŠããŸãããŒã«ã«ã§ãã«ãããŠåäœã確èªããããšããŸããããšãããããã®ã³ãŒããããšããšã¡ã³ããã³ã¹ããŠããããŒã ã¯ãéçºç°å¢ïŒdevïŒã«ãŸããããã€ããŠããåããããšããã¹ã¿ã€ã«ãåã£ãŠããŸãããã€ãŸããããŒã«ã«ã® docker compose ã¯ãå®ã®ãšããã»ãšãã©äœ¿ãããŠããªãã£ãã®ã§ãã ç§ã¯ãããç¥ããªããŸãŸãããŒã«ã«ã® docker compose ãç«ã¡äžããããšããŠããPostgres ã®ããŒãžã§ã³ãåããªãããç°å¢å€æ°ãç¡å¹ã ããšãåããªãç°å¢ãåã«åèŠå
«èŠããŸãããçµæããŒã«ã«ã§ãã¹ãã§ããããã«ãªã£ãã®ã§è¯ãã£ãã®ã§ããããªããžããªåºæã®ããããæé»ç¥ã¯ãAI ã§ã¯ã©ãã«ããªããªãéšåã§ãã enum ãäžã€å¢ãããããèã¥ãåŒã«ããŒãžã§ã³ãäžãã æ¬¡ã«ã€ãŸãããã®ã¯ãäŸåé¢ä¿ã®æŽæ°ã§ãããããããã£ãã®ã¯ãprotobuf ã®å®çŸ©ã« enum ãäžã€å¢ãããæ°ãã远å ããã宿°ãåç
§ããããšã ãã§ãããšãããããã®å®çŸ©ãåã蟌ãããš go mod tidy ãå®è¡ãããšãããçŽæ¥ã¯è§Šã£ãŠããªãã¯ãã®ã©ã€ãã©ãªã®ããŒãžã§ã³ãäžæã«äžãã£ãŠããŸããŸãããgRPC ãŸãããããæçµçã«ã¯ Go æ¬äœã®èŠæ±ããŒãžã§ã³ãŸã§åããŠããŸãããã£ãäžã€ã® enum ã®ããã«ããªããããŸã§åºããã®ããæåã¯ãŸã£ããèŠåœãã€ããŸããã§ããã ãã£ããã ã£ãã®ã¯ããã®ããªããã«å¯ŸããŠããã£ãšãããã説æãããã€ãåºãŠããŠãããããããééã£ãŠããããšã§ããAI ã«çç±ãèããšãããããã仮説ãããšãã°ãäœèšãªæŽæ°ãå·»ã蟌ãã§ããã ãã ãããæå°éã«æ»ããããšãã£ãçããè¿ããŠããŸããã§ããããã®éãã«æ»ãããšããŠãå·®åã¯åãŸããŸããã§ããã ã²ãããAIãšåçããããããåãããŸãããåå ã¯äŸåãæ§é çã«åã¿åã£ãŠããããšã§ãããæ°ããçæã©ã€ãã©ãªãæ°ãã gRPC ç³»ãèŠæ±ãããããããã«å¥ã®åºç€ã©ã€ãã©ãªãåŒããæçµçã« Go æ¬äœã®äžéãŸã§æŒãäžããŠããæ§é ã ã£ãã®ã§ããæ¬åœã«ãããªã®ãã®äŸåé¢ä¿ã®ã°ã©ããå³ç€ºããããã§ãèªä¿¡ãæãŠãªãã£ãã®ã§PR Reviewã§ã·ãã¢ãšã³ãžãã¢ã«ã¬ãã¥ãŒããã ããŸããã ããŒã«ã«ã§ã®ãã¹ããš Lint DB ã¢ã¯ã»ã¹å±€ïŒDAO: Data Access ObjectïŒã®ãã¹ããããŒã«ã«ã§åãããšãããšããã å®è¡ããã ãã§ã¯éããŸããã§ããããã¹ãçšã® Postgres ãå°çšããŒãã§ç«ãŠã PGPORT ãæç€ºçã«æå®ããããšãã£ããããŒã ã§ã¯åœããåãããŠèª°ãããã¥ã¡ã³ãã«æžããªãäœæ³ãã1ã€ãã€èžã¿ãªããç¥ã£ãŠãããŸãã ããšãã° DAO ãã¹ãã¯ã 5556 ã®ãããªå°çšããŒãã§ãã¹ãçšã® Postgres ãç«ãŠã PGPORT ã§ãããåããŠåããŠéããŸãããããç¥ããªããšããã¹ãã¯ããŒã«ã«ã®æ¢å®ã®ããŒã¿ããŒã¹ã«æ¥ç¶ããããšããŠãåå ã®èŠããªããŸãŸå€±æãç¶ããŸããã©ãã«ãæžãããŠããªããã®äžæã«ãã©ãçããŸã§ããšã©ãŒã¡ãã»ãŒãžãšã«ããã£ãããæéãç¶ããŸããã Lint ãåæ§ã§ãããããŒã«ã«ã§èµ°ããããšãèšå®ã®ããŒãžã§ã³å·®ïŒv1 系㚠v2 ç³»ã®éäºæïŒã§ããŸãéãããCIïŒContinuous IntegrationïŒã«ä»»ãããšããå²ãåãã«èœã¡çããŸããããããŒã«ã«ã§å
šéšç·ã«ããŠãã push ããããšããåæãããŸã厩ããŸãã E2E éçºã®ãã·ã³èŠä»¶ 1人㧠Client ã Backend ã1å°ã§åããšããã·ã³ãžã®è² è·ãäžæ°ã«äžãããŸããå®éãAndroid ãã«ãïŒãšãã¥ã¬ãŒã¿ãiOS ãã«ãïŒã·ãã¥ã¬ãŒã¿ãDocker ã³ã³ãã3ã€ãåæã«åãããŠãã¡ã¢ãªã90GB䜿ãå Žé¢ããããŸãããã¹ã¯ãããªãã§ E2E éçºããããªãã96GB ã¯æ¬²ãããšããã§ãã ç¹ã«Backendã®Engineerã¯å
ã
é«ãã¹ããã¯ã®PCãæã£ãŠããããClientéçºã§ãŸãæåã®ããŒã«ã«ãã«ããè©Šãæ®µéã§èºããŠããŸããŸãããããããããŒã«ã«ãã«ãã«èããPCãæ¯çµŠããŠããããŸã§Clientéçºã«çæã§ããªããšããããšãèµ·ããŠããŸã£ãŠããŸããã è¶å¢ã㊠E2E ã1äººã§æã€ãšããããšã¯ãããŒã«ãã§ãŒã³ãå
šéšæ±ãããšããããšã§ããããŸããããŒããŠã§ã¢ã¯ç®ç«ã¡ãŸããããç¡èŠã§ããªãæ¡ä»¶ã§ãããããŒã å
ã§ããè¶å¢ãã人ã»ã©ãã·ã³èŠä»¶ãäžããããšããåæãå
±æããéçºæ©ã®éžå®ã§ã¯å€ãã®ã¡ã¢ãªãèŠèŸŒãã§ããå¿
èŠãããããšãã話ã«ãªããŸããã æ¯ãè¿ã£ãŠ ãããã®èª²é¡ã«å
±éããŠããã®ã¯ãè©°ãŸã£ããã€ã³ãã®ã»ãšãã©ããèšèšãå®è£
ã®é£ããã§ã¯ãªããç°å¢ã»ããŒã«ã»éçšã®æé»ç¥ã ã£ãããšã§ããã³ãŒããæžãåãã®ãã®ãããããã®æåã®ãšããã§è¶³ãåãããŠããããšããã®ã宿ã§ããã ããã§å¹ããŠããã®ããããšããšäººéã®ãªã³ããŒãã£ã³ã°ã§ãéèŠã ã£ãæ¡ä»¶ã§ãããDXïŒDeveloper ExperienceïŒãæŽã£ãŠãããããªã³ããŒãã£ã³ã°è³æãéçºããã¥ã¡ã³ããæŽåãããŠããããšããã人ã«ãšã£ãŠã®æŽåç¶æ³ãããã®ãŸãŸ AI ã«ãšã£ãŠã®æŽåç¶æ³ã§ããããŸãããããã¥ã¡ã³ããèãæé»ç¥ã«é Œã£ãŠããé åã§ã¯ã人ã AI ãåãããã«è¿·ããŸãã ä»ã®ãšããã¯ããã£ãŠã¿ãŠåããŠãããåé¡ãèžãã§ã¯1ã€ãã€æœ°ããŠãããããã°ãæ²é³Žé§åãã§é²ãããããªããããŒã ãç«ã¡äžããŠããæ°ã¶æã¯çç£æ§ãäžããã®ãé£ããã®ãæ£çŽãªãšããã§ããéã«èšãã°ããããããã¥ã¡ã³ããšã»ããã¢ããã¹ã¯ãªããã§ãããããæœ°ããŠããã°ãè¶å¢ã®ã³ã¹ãã¯å€§ããäžããããããšããæ¹åã®çãã¯ã£ããèŠããŸãããæ¬¡ã«è¶å¢ã«æããªããæåã«çæããã®ã¯ãã®æŽåã ãããšèããŠããŸãã ãŸãšã KYC ã§è©Šããç¯å²ã§ã¯ãClient â Backend ã®è¶å¢éçºã¯æç«ããŸãããClient ãšã³ãžãã¢ããµãŒããŒãæžããBackend ãšã³ãžãã¢ã iOS/Android ãåºããŠããŸãã ãããæ¯ããã®ã¯ãããã€ãã®æ¡ä»¶ã§ããããŸããå°èŠæš¡ãªéçºããŒã ãšããŠäžäœã§åãããã¢ããããªã³ããŒãã£ã³ã°ã»ãã·ã§ã³ãããªããäºãã®é åãåŠã¹ãããšã次ã«ãAI Agent ãåèŠã®èšèªãã³ãŒããäžæãã€çè§£ãã䌎走è
ã«ãªã£ãŠãããããšããã ããèšèšã®æçµçãªåŠ¥åœæ§ãèŠæ¥µãããããŠéçºè
ã®äžå®ãææããã®ã¯ãããŸã人éã®ã·ãã¢ã¬ãã¥ãŒã§ãããç°å¢æ§ç¯ãããŒã«ã®ããŒãžã§ã³ãããŒã«ã«ãã¹ããšãã£ãæé»ç¥ãåããã«ã¯ããªã³ããŒãã£ã³ã°ç°å¢ãšããã¥ã¡ã³ããèŠããŸããäžæ¹ã§ãéžæã®æ ¹æ ãéçºã®éçšã§èšèªåãããããæ®ããŠããã°ãå°éå€ã®é åã§ãã¬ãã¥ãŒã¯åããŸããããããŠæåŸã«ãããããã¹ãŠã1å°ã§åãã«ã¯ãã¡ã¢ãª96GBçŽã®éçºæ©ãçŸå®çã«å¿
èŠã§ããã ãããŠãããããæã£ãŠããŠããæåã®æ°ã¶æã¯çç£æ§ãèœã¡ãŸããè¶å¢ã¯æé·çãšã»ããã§ãã£ãŠããããšããã®ãäžçªã®åŠã³ã§ãããéã«èšãã°ããã®æé·çãããŒã ãšããŠåŒãåããèŠæãšãAI ãå«ãããªã³ããŒãã£ã³ã°ã®ä»çµã¿ãããã°ããã¯ã©ã€ã¢ã³ããšã³ãžãã¢ãããµãŒããŒãšã³ãžãã¢ããšããè©æžãã®å¢çã¯ãæã£ãŠããããåãããŸãã æ¬¡ã¯ããã£ãšè€é㪠DB èšèšãå«ããããžã§ã¯ãã§ãAI ãã©ããŸã§è¶å¢ãæ¯ããããã®ãã確ãããŠãããŸãããšã³ãžãã¢äžäººã²ãšããé åããŸããã§åããããã«ãªãããšã¯ãå·¡ãå·¡ã£ãŠãããæ©ãã»ãã確ããªäŸ¡å€ãã客ããŸã«å±ããããšã«ã€ãªãããšèããŠããŸããããããããããã£ãææŠãç¶ããŠãããããšæããŸãã æ¬¡ã®èšäºã¯ yutaroããã§ããåŒãç¶ããæ¥œãã¿ãã ããã
æ¬èšäºã¯ 2026 幎 4 æ 17 æ¥ ã« AWS Migration & Modernization Blog ã§å
¬éãããã Modernize VB6 Applications at Scale with AWS Transform Custom ãã翻蚳ãããã®ã§ãã æ³å®æèŠæé : 90 ã 120 å ã¬ãã« : äžçŽ (400) Microsoft 㯠Visual Basic 6.0 (VB6) ã®å»¶é·ãµããŒãã 2008 幎ã«çµäº (*) ããŸããããéèãµãŒãã¹ãä¿éºããã«ã¹ã±ã¢ãè£œé æ¥ãªã©ãæ°åãã®ããã·ã§ã³ã¯ãªãã£ã«ã«ãªã¢ããªã±ãŒã·ã§ã³ãäŸç¶ãšã㊠VB6 ã«äŸåããŠããŸãããããã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯æ°å幎åã®ããžãã¹ããžãã¯ãå«ãŸããŠããŸããã幎ã
ã¡ã³ããã³ã¹ãå°é£ã«ãªã£ãŠããŸããVB6 éçºè
ã¯åŽååžå Žã«æ®ã人æ°ãæžå°ããŠããããæ¡çšã³ã¹ããäžæãããããæªé©çšã®è匱æ§ã¯ã³ã³ãã©ã€ã¢ã³ã¹éåã®ãªã¹ã¯ãé«ããã¢ããªã·ãã¯ãªã¢ãŒããã¯ãã£ã¯ AIãã¢ããªãã£ã¯ã¹ãã¯ã©ãŠããµãŒãã¹ãšã®çµ±åãå°é£ã«ããŠããŸãã * 蚳泚ïŒå³å¯ã«ã¯ãVB6 ã® IDE ã®ãµããŒãã¯çµäºããŠãŸãããVB6 ã®ã©ã³ã¿ã€ã ã¯ãŸã ãµããŒãã¯ãããŠããŸããã©ã³ã¿ã€ã 㯠Windows ã®ã©ã€ãã¿ã€ã ã«åãããŠãµããŒãç¶ç¶ãããŠããŸããã察å¿ã¯é倧ãªã»ãã¥ãªãã£åé¡çã«éå®ãããŠããŸãã詳现㯠ãã¡ã ãåç
§ããŠãã ããã ãããã®èª²é¡ã¯ãAWS Transform custom ã§ã«ã¹ã¿ã 倿ãã©ã³ãäœæããããšã§è§£æ±ºã§ããŸãã ãã®èšäºã§ã¯ãAWS Transform custom ã®ãšãŒãžã§ã³ãã£ã㯠AI æ©èœã掻çšããŠãçµç¹åºæã®ããžãã¹ã«ãŒã«ãç¶æããªãã VB6 ã¢ããªã±ãŒã·ã§ã³ãå€§èŠæš¡ã«ã¢ããã€ãºããæ¹æ³ã玹ä»ããŸãã VB6 ã¢ããã€ãŒãŒã·ã§ã³ã®èª²é¡ VB6 ã¢ããªã±ãŒã·ã§ã³ã®ã¢ããã€ãŒãŒã·ã§ã³ã«ã¯ãåçŽãªæ§æå€æãè¶
ããåºæã®èª²é¡ããããŸãã AWS Transform for .NET 㯠.NET Framework ã¢ããªã±ãŒã·ã§ã³ã®èªåããŒãã£ã³ã°ãæäŸããŠããŸãããVB6 ã«ã¯åºæã®ç¹æ§ããããããç°ãªãã¢ãããŒããå¿
èŠã§ãã VB6 ã®ã¢ããã€ãŒãŒã·ã§ã³ã§ã¯ãã¬ã¬ã·ãŒãã©ãããã©ãŒã ãšã¢ãã³ãª .NET ã®éã«ããæ ¹æ¬çãªã¢ãŒããã¯ãã£ã®éãã«å¯ŸåŠããå¿
èŠããããŸããèšèªã¬ãã«ã§ã¯ãVB6 ã®æç¶ãåããã³ COM ããŒã¹ã®ãã¿ãŒã³ããªããžã§ã¯ãæåã® C# æ§é ã«ãããã³ã°ããå¿
èŠããããŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ããActiveX ã³ã³ãããŒã«ã䜿çšãã VB6 ãã©ãŒã ãã Blazor ã ASP.NET Core MVC ãªã©ã®ã¢ãã³ãª Web ãã¬ãŒã ã¯ãŒã¯ãžã®å€æãå¿
èŠã§ããããŒã¿ã¢ã¯ã»ã¹ãã¿ãŒã³ã¯ã¬ã¬ã·ãŒãª ADO ã DAO ãã Entity Framework Core ã® async/await ãã¿ãŒã³ã«ç§»è¡ããCOM äŸåé¢ä¿ã¯ .NET ãã€ãã£ãã®ä»£æ¿ææ®µã NuGet ããã±ãŒãžã«çœ®ãæããå¿
èŠãããããšã©ãŒãã³ããªã³ã°ã¯ On Error Resume Next ã On Error GoTo ãã¿ãŒã³ããæ§é åããã try-catch äŸå€åŠçã«ç§»è¡ããŸãã ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®çŽ¹ä» Salmon King Seafood (SKS) ãšãã VB6 Multiple Document Interface (MDI) ã¢ããªã±ãŒã·ã§ã³ã䜿ã£ãŠ AWS Transform custom ã解説ããŸããããã¯å
žåçãªãšã³ã¿ãŒãã©ã€ãºã¢ããã€ãŒãŒã·ã§ã³ã®èª²é¡ã衚ãã¢ããªã±ãŒã·ã§ã³ã§ããSKS ã¯ä»¥äžã®ç¹åŸŽãæã€æ°Žç£ç©å泚管çã·ã¹ãã ã§ãã 15 以äžã® VB6 ãã©ãŒã â åæ³šã顧客管çãååã«ã¿ãã°ãåšåº«ç®¡çãæ¿èªã¯ãŒã¯ãããŒãå«ã 3 ã€ã® VB6 ã¢ãžã¥ãŒã« (modConnection.basãmodFunctions.basãmodMain.bas) â å
±æããžãã¹ããžãã¯ãšããŒã¿ããŒã¹æ¥ç¶ãå«ã SQLite ããŒã¿ããŒã¹ (Orders.db) â ADO ããŒã¿ã³ã³ãããŒã«ãšããŒã¿ãã€ã³ãã£ã³ã°ãéããŠã¢ã¯ã»ã¹ æšæº VB6 ã³ã³ãããŒã« â MSFlexGridãListViewãToolbarãImageListãComboBoxãControl Arrays ãå«ã MDI ã¢ãŒããã¯ã㣠â ã¡ã€ã³ã³ã³ãããã©ãŒã ãšã¡ãã¥ãŒããããªã¬ãŒãããåãã©ãŒã ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ããšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ã§ããèŠããã VB6 ãã¿ãŒã³ãå®è£
ããŠããŸãã ã€ãã³ããã³ãã©ãæã€ãã©ãŒã ããŒã¹ã® UI ããŒã¿ãã€ã³ãã£ã³ã°ã䜿çšãã ADO ããŒã¿ã¢ã¯ã»ã¹ COM ããŒã¹ã®ã³ã³ãããŒã« ã¢ãžã¥ãŒã«å
ã®æç¶ãåããžãã¹ããžã㯠ãããã®èŠçŽ ã«ãããSKS ã¯ãšã³ã¿ãŒãã©ã€ãº VB6 ã¢ããã€ãŒãŒã·ã§ã³ã§ééããè€éãã代衚ãããã®ãšãªã£ãŠããŸãã ãœãªã¥ãŒã·ã§ã³æŠèŠ VB6 ãã C# ãžã®ã¢ããã€ãŒãŒã·ã§ã³ã«ã¯ãAWS Transform custom ã®è€éãªå€æãã¿ãŒã³ã®åŠç¿ã»é©çšæ©èœã掻çšã§ããŸãããšã³ãããŒãšã³ãã®ããã»ã¹ã¯ä»¥äžã®ã¹ããŒãžã«åŸããŸãã è©äŸ¡ â VB6 ã¢ããªã±ãŒã·ã§ã³ããŒããã©ãªãªã®ã¹ã³ãŒããšè€éããè©äŸ¡ãã å®çŸ© â VB6 ãã C# ãžã®å€æãã¿ãŒã³ãããžãã¹ã«ãŒã«ãã³ãŒãã£ã³ã°æšæºãå«ãã«ã¹ã¿ã 倿ãå®çŸ©ãã å®è¡ â å€§èŠæš¡ã«å€æãå®è¡ãã ã¬ãã¥ãŒãšå埩 â ãã£ãŒãããã¯ã«ãŒãã«ããç¶ç¶çãªæ¹åãè¡ããªããã¬ãã¥ãŒãšå埩ãè¡ã ãã®ã¢ãŒããã¯ãã£ã«ããã倿å®çŸ©ãäžåºŠäœæããŠãã¹ãããæ°çŸã®ã¢ããªã±ãŒã·ã§ã³ã«é©çšã§ããŸãã åææ¡ä»¶ éå§ããåã«ã以äžã確èªããŠãã ããã AWS Transform Custom ãžã®ã¢ã¯ã»ã¹æš©ãæã€ AWS ã¢ã«ãŠã³ã ãçŸåšã®æéã®è©³çްã«ã€ããŠã¯ãAWS Transform ã®æéããŒãžãã芧ãã ããã ATX CLI (Command Line Interface) ãã€ã³ã¹ããŒã«ããã MacOS ãŸã㯠Linux ç°å¢ã詳现ãªã»ããã¢ããæé ã«ã€ããŠã¯ã AWS Transform custom åææ¡ä»¶ã¬ã€ã ãåç
§ããŠãã ããã **Windows éçºè
ã®å Žå** : WSL2 (Windows Subsystem for Linux) ãã€ã³ã¹ããŒã«ããUbuntu ãŸãã¯ãã®ä»ã® Linux ãã£ã¹ããªãã¥ãŒã·ã§ã³ãã ATX CLI ãå®è¡ããŠãã ãããCLI 㯠`/mnt/c/` ãã¹ãéããŠããŒã«ã«ã³ãŒãããŒã¹ãçŽæ¥æäœããŸãã 倿åŸã®ã¢ããªã±ãŒã·ã§ã³ããã¹ãããããã® .NET 10 SDK 以é ã³ãŒãã¬ãã¥ãŒçšã® Visual Studio 2022 以éãŸã㯠Visual Studio Code VB6 ããã³ .NET ã®éçºç¥è æå¹ãªèªèšŒæ
å ±ãèšå®ãããŠãã Git ãããããš ç°å¢ã®æºå Salmon King Seafood (SKS) ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ãããŠã³ããŒãããŸããããã«ã¯ãå
žåçãªãšã³ã¿ãŒãã©ã€ãº VB6 ã¯ãŒã¯ããŒãã代衚ãã VB6 MDI ã¢ããªã±ãŒã·ã§ã³ãå«ãŸããŠããŸãã ãªããžããªãããŒã«ã«ãã·ã³ã«ã¯ããŒã³ããŸãã git clone https://github.com/GAPVelocityAI/SKSVB6.git cd SKSVB6 Windows ã§ WSL2 ã䜿çšããŠããå Žåã¯ãäž¡æ¹ã®ç°å¢ããã¢ã¯ã»ã¹å¯èœãªãã¹ã«ã¯ããŒã³ããŸãã git clone https://github.com/GAPVelocityAI/SKSVB6.git /mnt/c/Projects/SKSVB6 cd <path-to-repository> ãªããžããªã®å
容ã確èªããŸããVB6 ãããžã§ã¯ããã¡ã€ã« (SKS.vbp)ããã©ãŒã ãã¡ã€ã« (.frm/.frx)ãã¢ãžã¥ãŒã« (.bas)ãSQLite ããŒã¿ããŒã¹ (Orders.db) ã衚瀺ãããŸãã ls -la *.vbp *.frm *.bas *.db å€æè¿œè·¡çšã«ãªããžããªãåæåããŸãã git add . git commit -m "Baseline before VB6 to C# transformation" 次ã«ããªãã¡ã¬ã³ã¹ããã¥ã¡ã³ããå«ããªããžããªãã¯ããŒã³ããŸãããã®ãªããžããªã«ã¯ãAWS Transform ã«ã³ã³ããã¹ããšããŠæž¡ãããžãã¹ã«ãŒã«ãšå€æäŸãå«ãŸããŠãããçµç¹ã®æšæºã«åã£ãã³ãŒããçæããŸãã git clone -b dotnet-transform-custom https://github.com/aws-samples/dotnet-genai-samples.git ãŠã©ãŒã¯ã¹ã«ãŒ 以äžã®ã»ã¯ã·ã§ã³ã§ã¯ãAWS Transform CLI ã䜿çšã㊠VB6 ã³ãŒããã¢ãã³ãª C# ãããžã§ã¯ãã«å€æããæé ã説æããŸãã ã¹ããã 1: VB6 ã¢ããªã±ãŒã·ã§ã³ãè©äŸ¡ãã 倿å®çŸ©ãäœæããåã«ãVB6 ããŒããã©ãªãªã®ã¹ã³ãŒããšè€éããææ¡ããŸããSKS ãªããžããªãã¯ããŒã³ããç¶æ
ã§ãATX CLI ãèµ·åããŠè©äŸ¡ãéå§ããŸãã atx custom def exec -p <path-to-repository> \ -n 'AWS/early-access-comprehensive-codebase-analysis' \ -t ãã©ã¡ãŒã¿ : -p: ãœãŒã¹ãããžã§ã¯ãã®ãã¹ (ã¯ããŒã³ãã SKS ãªããžããª) -n: 倿å®çŸ©å -t: 倿ã«é¢ãããã¹ãŠã®ããŒã«ãä¿¡é Œããå®è¡äžã« AWS Transform ãèš±å¯ãæ±ããŠäžæåæ¢ããã®ãé²ã 泚æ ïŒ2026 幎 5 æ 1 æ¥æç¹ã§ã¯ã倿å®çŸ©å㯠AWS/early-access-comprehensive-codebase-analysis ãã AWS/comprehensive-codebase-analysis ã«å€æŽã«ãªã£ãŠããŸã AWS Transform custom ã¯ãã·ã§ã«ã¹ã¯ãªãããªã©ã®ç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã«èš±å¯ãå¿
èŠãšããŸããäžèšã®ã³ãã³ãã® ât åŒæ°ã«ãããããŒã«ã¯ãŠãŒã¶ãŒã«ç¶ç¶çã«ããã³ããã衚瀺ããããšãªãå®è¡ã§ããŸãã è©äŸ¡ã§ã¯ SKS ãããžã§ã¯ããåæãããã©ãŒã æ° (15 以äž)ãã¢ãžã¥ãŒã«æ° (3)ãCOM ã³ã³ããŒãã³ãã®äŸåé¢ä¿ (MSFlexGridãListView)ãããŒã¿ããŒã¹ã¢ã¯ã»ã¹ãã¿ãŒã³ (ADO with SQLite)ãæšå®å€æè€é床ã¹ã³ã¢ãå«ãå
æ¬çãªã¬ããŒããçæããŸãã ãã®è©äŸ¡ã¬ããŒãã䜿çšããŠãVB6 ã¢ããªã±ãŒã·ã§ã³ã倿ããéã« AWS Transform custom ã«è¿œå ã®ã³ã³ããã¹ããæäŸããŸãã ã¹ããã 2: VB6 ãã C# ãžã®ã«ã¹ã¿ã 倿å®çŸ©ãäœæãã æ¬¡ã«ãVB6 ããã¢ãã³ãª C# ãžã®å€æãã¿ãŒã³ãšã«ãŒã«ããã£ããã£ããã«ã¹ã¿ã 倿å®çŸ©ãäœæããŸããAWS Transform custom ã¯ãæäŸãããäŸãããã¥ã¡ã³ããããžãã¹ã«ãŒã«ããåŠç¿ãããããã®ãã¿ãŒã³ãäžè²«ããŠé©çšããŸãã 察話å CLI ãèµ·åããŸãã atx -t ããã³ããã衚瀺ããããã倿ã®èª¬æãšã㊠VB6 to C# ASP.NET Core web application migration ãšå
¥åããŸããAWS Transform custom ã¯æ¢åã®å€æãæ€çŽ¢ãããã®ç¹å®ã®ã·ããªãªã«è©²åœãããã®ãèŠã€ãããªãå Žåãã«ã¹ã¿ã 倿ãäœæãããã©ãããå°ããŸãããcreate a new oneããšå
¥åããŠç¢ºèªããŸãã å³ 1 â atx cli ã®èµ·å 倿ã³ã³ããã¹ããšããžãã¹ã«ãŒã«ã®æäŸ AWS Transform custom ã¯ãããã¥ã¡ã³ããç§»è¡ã¬ã€ãããµã³ãã«ã³ãŒãã®æäŸãæ±ããŸããããã§çµç¹åºæã®èŠä»¶ã远å ããŸããSKS ã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠã¯ããã®ã¢ãŒããã¯ãã£ã«é¢ããã³ã³ããã¹ããæäŸããŸãã Salmon King Seafood (SKS) ãšãã VB6 MDI ã¢ããªã±ãŒã·ã§ã³ããããŸãããœãŒã¹ã³ãŒã㯠<path-to-repository> ã«ãããŸããæ³šæåä»ã顧客管çã補åã«ã¿ãã°ãåšåº«ç®¡çãæ¿èªã¯ãŒã¯ãããŒãªã©ã15 以äžã®ãã©ãŒã ããããŸãã3 ã€ã®ã¢ãžã¥ãŒã« (ããŒã¿ããŒã¹æ¥ç¶çšã® modConnection.basããŠãŒãã£ãªãã£é¢æ°çšã® modFunctions.basãã¢ããªã±ãŒã·ã§ã³ã®ãšã³ã㪠ãã€ã³ãçšã® modMain.bas) ã䜿çšããŠããŸããããŒã¿ããŒã¹ã¯ SQLite ã§ãããŒã¿ ãã€ã³ãã£ã³ã°ã䜿çšãã ADO ããŒã¿ ã³ã³ãããŒã«ãä»ããŠã¢ã¯ã»ã¹ããŸããã³ã³ãããŒã«ã«ã¯ãMSFlexGridãListViewãToolbarãImageListãããã³ã³ã³ãããŒã« ã¢ã¬ã€ãå«ãŸããŸããããã .NET 10 ãã¿ãŒã²ãããšãã ASP.NET Core Blazor Server ã¢ããªã±ãŒã·ã§ã³ã«å€æããŠãã ããã çµç¹åãã®ç§»è¡ãã¿ãŒã³ã®ã«ã¹ã¿ãã€ãº ç§»è¡ã®ç²ŸåºŠãåäžãããããã«ãçµç¹åºæã®ãããã³ã°ã«ãŒã«ãæäŸããŸãããããã¯ãŠãŒã¶ãŒãäœæããããŒã¯ããŠã³ãã¡ã€ã«ã§ãAWS Transform custom ããããã³ããã衚瀺ãããéã«åç
§ããŸããAWS Transform custom ã¯ãããã倿ãã©ã³ã«çµã¿èŸŒã¿ãŸããããã³ããã衚瀺ããããã察話åã»ãã·ã§ã³äžã« VB6 ãœãŒã¹ã³ãŒããšãšãã«ãããã®ãã¡ã€ã«ãåç
§ããŸãã å³ 2 â 倿ãã©ã³ãžã®ããžãã¹ã«ãŒã«ããã®ä»ã®ã³ã³ããã¹ãã®è¿œå 倿äŸã®åç
§ <path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/example-transformations.md ãã¡ã€ã«ã確èªããŸããATX ãšãŒãžã§ã³ãããµã³ãã«å€æãæ±ããããã³ããã衚瀺ãããã以äžã®ããã«åç
§ããŸãã 倿ååŸã®äŸã¯ã<path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/example-transformations.md ã«ãããŸãã äŒæ¥ã³ãŒãã£ã³ã°èŠçŽã®åç
§ AWS Transform custom ã§ã¯ãçµç¹ã®ã³ãŒãã£ã³ã°èŠçŽã倿ã«äœ¿çšããããšã§ã³ãŒãçæãå¶åŸ¡ã§ããŸããããã«ã¯ç¹å®ã® C# ã®æ©èœãèŠçŽãå«ããããšãã§ããŸããAWS Transform custom ã¯ãããã䜿çšããŠãããŒã ã®ã¹ã¿ã€ã«ã«åã£ãã³ãŒããçæããŸãã<path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/coding-standards.md ãã¡ã€ã«ã確èªããŸããçµç¹ã®ãã©ã¯ãã£ã¹ã«åãããŠç¬èªã®èŠçŽãäœæã§ããŸãã äŸ : <path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/coding-standards.md ã§å®çŸ©ãããŠããã³ãŒãã£ã³ã°èŠçŽãé©çšããŠãã ããã ã¿ãŒã²ããã¢ãŒããã¯ãã£ä»æ§ã®åç
§ ãªãã·ã§ã³ãšããŠã <path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/target-architecture.md ã«ãããããªãæãŸããåºåã¢ãŒããã¯ãã£ãèšè¿°ããããã¥ã¡ã³ãã䜿çšã§ããŸãã AWS Transform custom ã¯åç
§ããããã¹ãŠã®ãã¡ã€ã«ãèªã¿åããçµç¹ã®ãã¿ãŒã³ãèŠçŽãã¢ãŒããã¯ãã£ã«åã£ã倿ãã©ã³ãçæããŸãã çæããã倿å®çŸ© ããªãã®å
¥åã«æ
å ±ã«åºã¥ããŠãAWS Transform custom ã¯ãã§ãŒãºããšã«æŽçãããå
æ¬çãªå€æå®çŸ©ãçæããŸãã ãã§ãŒãº 1 â åæ : VB6 ã³ã³ããŒãã³ãã®ã€ã³ãã³ããªãäŸåé¢ä¿ã®ç¹å®ãäŸåé¢ä¿ã°ã©ãã®äœæ ãã§ãŒãº 2 â ãããžã§ã¯ãæ§é : ASP.NET Core Blazor Server ãããžã§ã¯ãã®çæãNuGet ããã±ãŒãžã®èšå®ãäŸåæ§æ³šå
¥ã®ã»ããã¢ãã ãã§ãŒãº 3 â ããŒã¿ã¬ã€ã€ãŒ : ADO/DAO ãã Entity Framework Core ãžã®å€æãDbContext ãšãšã³ãã£ãã£ã¢ãã«ã®çæ (é©åãªå Žå㯠record åã䜿çš) ãã§ãŒãº 4 â ããžãã¹ããžã㯠: ã¢ãžã¥ãŒã«ãããµãŒãã¹ã¯ã©ã¹ãžã®å€æ (ãã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çš)ã颿°ãã async ã¡ãœãããžã®å€æ ãã§ãŒãº 5 â UI ã¬ã€ã€ãŒ : VB6 ãã©ãŒã ãã Blazor ã³ã³ããŒãã³ããžã®å€æãã€ãã³ããã³ãã©ã®å€æ ãã§ãŒãº 6 â æ€èšŒ : ãã«ãæåã®ç¢ºèªããŠããããã¹ãã®çæãæ©èœçç䟡æ§ã®ãã¹ã 倿å®çŸ©ãããã«é©çšããããã¬ãã¥ãŒããŠä¿®æ£ããããã¬ãžã¹ããªã«å
¬éããŠåå©çšããããæ°ãããã©ã³ãéå§ããããéžæã§ããŸããæ¬¡ã®ã¹ãããã§ã¯ãå€§èŠæš¡ã«åå©çšã§ããããã«å€æå®çŸ©ãå
¬éããŸãã AWS Transform custom ã¯å€æãã©ã³ã®ååãšèª¬æãææ¡ããŠããŸãããã®ãŸãŸåãå
¥ããããå¿
èŠã«å¿ããŠä¿®æ£ã§ããŸããããã§å€æå®çŸ©ãããŒã å
šäœã§å©çšå¯èœã«ãªããŸãã ã«ã¹ã¿ã 倿å®çŸ©ã®è¡šç€ºãšç®¡ç å
¬éåŸã察話åãšãŒãžã§ã³ããŸãã¯ä»¥äžã® CLI ã³ãã³ãã䜿çšããŠãã«ã¹ã¿ã 倿å®çŸ©ãšå©çšå¯èœãªãã¹ãŠã® AWS ãããŒãžã倿ã衚瀺ã§ããŸãã atx custom def list å³ 3 â ãŠãŒã¶ãŒãäœæããã«ã¹ã¿ã 倿ãã©ã³ã®äžèЧ ãã®ã³ãã³ãã¯ãAWS ãããŒãžã倿 (AWS/ ãã¬ãã£ãã¯ã¹ä»ã) ãšã«ã¹ã¿ã å®çŸ©ã®å€æã®äž¡æ¹ã衚瀺ããŸããã«ã¹ã¿ã å®çŸ©ã®äžã« VB6-to-CSharp-Blazor-Migration 倿ãã©ã³ã衚瀺ãããŸãã ã¹ããã 3: 倿ãå®è¡ãã ã«ã¹ã¿ã 倿å®çŸ©ãå
¬éããããVB6 ã¢ããªã±ãŒã·ã§ã³ã®ã¢ããã€ãŒãŒã·ã§ã³ãå®è¡ã§ããŸããããã³ããã衚瀺ããããããããžã§ã¯ãã«å¯ŸããŠå€æãã©ã³ãå®è¡ããŸãããªããžããªãžã®ãã¹ãšã倿åŸã«ãããžã§ã¯ãããã«ãããããã®ãã«ãã³ãã³ããäžããå¿
èŠããããŸãã å³ 4 â å€æãæ€èšŒããããã®ãã«ãã³ãã³ãã®è¿œå 以äžã®ã³ãã³ãã䜿çšããŠå€æãã©ã³ãçŽæ¥ã¿ãŒããã«ããå®è¡ããããšãã§ããŸãã atx custom def exec -p <path-to-repository>\ -n 'VB6-to-CSharp-Blazor-Migration' \ -t AWS Transform custom ãèªèãã¹ã远å ã®ã³ã³ããã¹ããæäŸãããã©ãããå°ããããŸããããã¯ãä¿åããã倿å®çŸ©ã«ã¯å«ãŸããªããã®å Žéãã®ã³ã³ããã¹ã (ã³ãŒãåæã§çæãããããã¥ã¡ã³ããªã©) ãæäŸããå Žåã«äŸ¿å©ã§ãã å³ 5 â 倿ãã©ã³çæåã®è¿œå ã³ã³ããã¹ãã®è¿œå ããã³ããã«åçãããšãAWS Transform ã¯å®è¡ãŸãã¯ã¬ãã¥ãŒã»ä¿®æ£ããããã®å€æãã©ã³ãçæããŸãã å³ 6 â 倿ãã©ã³ã®ã¬ãã¥ãŒãŸãã¯ç¶è¡ 倿ãã©ã³ã®å
容ã«åé¡ãªããã° ç¶è¡ãã 倿ãšãŒãžã§ã³ã㯠SKS ãããžã§ã¯ãã®æ§é ãåæããMDI ã³ã³ãã (frmMain.frm)ãåãã©ãŒã ãã¢ãžã¥ãŒã«ãããŒã¿ããŒã¹ãã¿ãŒã³ãç¹å®ããŠããã倿å®çŸ©ãé©çšããŸãããšãŒãžã§ã³ãã¯ä»¥äžã倿ããŸãã frmMain.frm (MDI ã³ã³ãã) â ããã²ãŒã·ã§ã³ã¡ãã¥ãŒä»ãã® Blazor MainLayout.razor frmCustomers.frmãfrmProviders.frm ãªã© â åå¥ã® Blazor ããŒãžã³ã³ããŒãã³ã modConnection.bas â Entity Framework Core ãš SQLite ãããã€ããŒã䜿çšãã SksDbContext.cs modFunctions.bas â ãã¡ã€ã³ããšã«æŽçãããæ¡åŒµã¡ãœããã¯ã©ã¹ MSFlexGrid ããŒã¿ã°ãªãã â ããŒã¿ãã€ã³ãã£ã³ã°ä»ãã® Blazor ããŒãã«ã³ã³ããŒãã³ã ADO ããŒã¿ã³ã³ãããŒã« â async/await ã䜿çšãã Entity Framework Core ã¯ãšãª ã¹ããã 4: ã¬ãã¥ãŒããã¹ããå埩 倿ãå®äºãããšãAWS Transform custom ã¯å€æãããã³ãŒããæ°ãããã©ã³ããŸãã¯ãã£ã¬ã¯ããªã«åºåãã倿ã¬ããŒããšæåä¿®æ£ã®æ¬¡ã®ã¹ããããæç€ºããŸãã å€æçµæã®ã¬ãã¥ãŒ 倿ã¬ããŒãã«ã¯ã以äžãå«ãçµäºåºæºã®æ€èšŒãå«ãŸããŸãã dotnet build ããšã©ãŒãŒãã§æå ãã¹ãŠã® VB6 ãã©ãŒã ã Blazor ã³ã³ããŒãã³ãã«å€ææžã¿ (äŸ: frmCustomers.frm â Customers.razorãfrmOrderReception.frm â OrderReception.razor) ããŒã¿ã¢ã¯ã»ã¹ã¬ã€ã€ãŒã Entity Framework Core ãš SQLite ãããã€ããŒããã³ async ãã¿ãŒã³ãäœ¿çš (ADO/ADODC ããŒã¿ã³ã³ãããŒã«ã眮æ) COM äŸåé¢ä¿ã®æé€ â MSFlexGrid 㯠Blazor ããŒãã«ã³ã³ããŒãã³ãã«ãToolbar/ImageList 㯠Blazor ããã²ãŒã·ã§ã³ã«çœ®æ ãšã©ãŒãã³ããªã³ã°ã On Error æããæ§é åããã try-catch äŸå€åŠçã«å€æ 仿§ã«åŸã£ãã¢ãã³ãª C# æ©èœã®é©çš (ã¬ã³ãŒãåããã©ã€ããªã³ã³ã¹ãã©ã¯ã¿ãŒããã¿ãŒã³ãããã³ã°) modConnection.bas ã IDbContextFactory<SksDbContext> ã䜿çšããç»é²æžã¿ Dependency Injection (DI) ãµãŒãã¹ã«å€æ AWS Transform 㯠1 åã®å®è¡ã§æ€èšŒåºæºãæºãããªãå ŽåããããŸãã倿ã®å®è¡åŸãæåããéšåãšå€±æããéšåã®ãµããªãŒãå«ãéšåçãªå€æçµæãåŸãããããšããããŸãã以äžã«å€æçµæã瀺ããŸãã å³ 7 â å®äºããå€æçµæ ãã£ãŒãããã¯ããã³ãããããæªéæã®åºæºã«å¯ŸåŠããããã«å€æãåå®è¡ã§ããŸãã倿ããã SKS ã¢ããªã±ãŒã·ã§ã³ãæ€èšŒããã«ã¯ãã¿ãŒããã«ã«åãæ¿ããŠä»¥äžãå®è¡ããŸãã cd <path-to-your-project> dotnet build dotnet run ãã©ãŠã¶ã§ https://localhost:<port> ã«ã¢ã¯ã»ã¹ãã以äžã«ç€ºãããã« Blazor ã¢ããªã±ãŒã·ã§ã³ãåæ³šã顧客管çãååã«ã¿ãã°ã®ããŒãžãæ£ããã¬ã³ããªã³ã°ããããšã確èªããŸãã å³ 8 â è«æ±æžäœæããŒãž å³ 9 â æ³šæäœæããŒãž æ©èœãäžè¶³ããŠããå Žåã¯ãCLI ã«ãã£ãŒãããã¯ãè¿ããŠå€æçµæãç¹°ãè¿ãæ¹åããŸãã Transform ã³ãã³ãã®ããã©ãŒãã³ã¹ Transform custom ã³ãã³ãã¯ãå€æå¯Ÿè±¡ã®ã³ãŒãããŒã¹ã®ãµã€ãºã«å¿ããŠãå®äºãŸã§ã«æå€§ 60 åãããå ŽåããããŸããã³ãŒããã¡ã€ã«ãäŸåé¢ä¿ãå€ãå€§èŠæš¡ãªãããžã§ã¯ãã§ã¯ãåœç¶ãªããããå€ãã®åŠçæéãå¿
èŠã«ãªããŸãã 倿ã®å¶éäºé
ã«ã€ã㊠Transform custom ã®æ©èœã§ã¯ãVB6 ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®æ©èœãèªåçã«å€æã§ãããšã¯éããŸããã倿å®äºåŸããœãŒã¹ã® VB6 ã¢ããªã±ãŒã·ã§ã³ãšå€æå
ã® C# ã¢ããªã±ãŒã·ã§ã³éã®æ©èœãæ¯èŒã»æ€èšŒããå¿
èŠããããŸãã倿ãããªãã£ãäžè¶³æ©èœã«ã€ããŠã¯ã Kiro ã Amazon Q Developer ãªã©ã® AI æèŒããŒã«ã䜿çšããŠããœãŒã¹ãã倿å
ã®ã³ãŒãããŒã¹ãžã®å€æã»ç§»æ€ãæ¯æŽã§ããŸãã ãŠããããã¹ãã®éèŠæ§ ãŠããããã¹ãã¯ã倿ããã»ã¹å
šäœãéããŠæ©èœã®æ£åœæ§ãæ€èšŒããŸãã倿ãããã³ãŒããå
ã® VB6 ã¢ããªã±ãŒã·ã§ã³ãšåäžã®åäœãããããšã確èªãã倿äžã«å°å
¥ãããäžäžèŽããªã°ã¬ãã·ã§ã³ãè¿
éã«ç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã倿åã«äžé£ã®ãã¹ããæŽåããŠãã ãããããããªã°ã¬ãã·ã§ã³ãã¹ãã®åºæºãšãªãã倿åŸãåçã«åäœããããšãæ€èšŒã§ããŸãã ãŸãšã çµç¹åºæã®ãã¿ãŒã³ãããžãã¹ã«ãŒã«ãã¢ãã³ãª C# æ©èœã®èšå®ãå«ãã«ã¹ã¿ã 倿å®çŸ©ã䜿çšããããšã§ãçµç¹ã«èç©ãããç¥èŠãç¶æããªããæ°çŸã® VB6 ã¢ããªã±ãŒã·ã§ã³ãäœç³»çã«ã¢ããã€ãºã§ããããã«ãªããŸããã 倿ãäžåºŠå®çŸ©ããã°ãã¢ããªã±ãŒã·ã§ã³ããŒããã©ãªãªå
šäœã«é©çšã§ããŸããããã«ãããåå©çšå¯èœãªå€æå®çŸ©ã«çµç¹ã«èç©ãããç¥èŠãä¿åãããŸãããã£ãŒãããã¯ã«ãŒãã«ããç¶ç¶çãªæ¹åã«ãããå倿ã¯ããæŽç·Žãããã¬ã³ãŒãåããã©ã€ããªã³ã³ã¹ãã©ã¯ã¿ãŒããã¿ãŒã³ãããã³ã°ãªã©ã®ã¢ãã³ãª C# æ©èœãã³ãŒãããŒã¹ã«èªåçã«é©çšãããŸããã¢ããã€ãºãããã¢ããªã±ãŒã·ã§ã³ã¯ Linux ãš AWS Graviton äžã§åäœããã€ã³ãã©ã¹ãã©ã¯ãã£ã³ã¹ããåæžã§ããå¯èœæ§ããããŸãã AWS Transform custom ã䜿çšã㊠VB6 ã¢ããªã±ãŒã·ã§ã³ããŒããã©ãªãªã®ã¢ããã€ãŒãŒã·ã§ã³ãå§ããŸããããã»ããã¢ããæé ã«ã€ããŠã¯ã AWS Transform custom Getting Started Guide ãã芧ãã ããã 远å ãªãœãŒã¹ AWS Transform custom Getting Started Guide AWS Transform custom Product Page AWS Transform custom Documentation AWS Transform custom Command Reference AWS Transform for .NET .NET on AWS Developer Center 翻蚳ã¯ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã® Yoshinori Sawada ãæ
åœããŸãããåæã¯ ãã¡ã ã§ãã èè
ã«ã€ã㊠David Kilzer David Kilzer ã¯ãAWS ãšã³ã·ã¹ãã å
ã§ã® Microsoft ã¯ãŒã¯ããŒãã®æé©åãå°éãšãããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ããC#ãSQL Serverããã㊠AWS ãµãŒãã¹ãçšããææ°ã®ãœãããŠã§ã¢ãœãªã¥ãŒã·ã§ã³æ§ç¯ã«é¢ããå°éç¥èãæããŠããŸãã Ashish Bhatia Ashish Bhatia ã¯ãAWS ã®ã·ãã¢ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ããšã³ã¿ãŒãã©ã€ãºã®ã客æ§ã®ã¯ã©ãŠããžã£ãŒããŒã®ã¬ã€ãã«æ³šåããŠããŸããAWS ã®ã¯ã©ãŠããã€ãã£ããµãŒãã¹ã䜿çšããŠææ°ã®ãœãããŠã§ã¢ãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããã客æ§ãæ¯æŽããããšã«æ
ç±ã泚ãã§ããŸãããŸãã圌㯠Amazon Web Services ã®ã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ããæå
端ã®çæ AI ãœãªã¥ãŒã·ã§ã³ã®äœæã«åãçµã¿ãã客æ§äžå¿ã®ã¢ãããŒããåªå
ããŠããŸãã Ty Augustine Ty Augustine ã¯ã.NETãSQL Serverãã³ã³ãããå°éãšãã Microsoft ã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ãããã¥ãŒãšãŒã¯ãæ ç¹ã«ãæ§ã
ãªæ¥çã®äŒæ¥ãšç·å¯ã«é£æºããAWS ã¯ã©ãŠããžã®ç§»è¡ãšã¢ããã€ãŒãŒã·ã§ã³ãå éãããŠããŸããAWS ã«å
¥ç€Ÿããåã¯ã20 幎以äžã«ããã Microsoft ã¹ã¿ãã¯ã®ãœãããŠã§ã¢ã¢ãŒããã¯ããšããŠæŽ»èºããŠããŸããã
ã¯ããã« ããã«ã¡ã¯ãCheckout ReliabilityããŒã ã§ããã¯ãšã³ããšã³ãžãã¢ãããŠããããã®ïŒ @ykagano ïŒã§ãïŒ ãã¡ãã¯ããç¶ç¶çãªè² è·ãã¹ãç°å¢ãBASEã«æ§ç¯ããŸãããã®ç¬¬3åã®èšäºã§ãã å
ã«ç¬¬1åã第2åãèªãã§ããã ãã®ãããããããŸãã 継続的な負荷テスト環境をBASEに構築しました 〜 第1回: 負荷テストの全体像 - BASEプロダクトチームブログ 継続的な負荷テスト環境をBASEに構築しました 〜 第2回: 負荷生成ツールの構築と運用 - BASEプロダクトチームブログ ãã¡ãã¯ç¬¬1åãã玹ä»ããŠããBASEã®è² è·ãã¹ãç°å¢ã®æ§æå³ã§ãã è² è·ãã¹ãç°å¢ã®æ§æå³ æ¬èšäºã§ã¯ãã¢ãã¯ããŒã«ãšããŠæ¡çšããWireMockã®éžå®çç±ãããå®éã®æ§ç¯ã»éçšæ¹æ³ãŸã§ã玹ä»ããŸãã ã¢ãã¯ããŒã«ã®éžå® ã¢ãã¯ããŒã«ãèŠæ±äºé
ã¯è² è·çæããŒã«ãšåºæ¬çã«ã¯åãã§ããã 以äžã¯ç¬¬2åã®èšäºããã®èŠæ±äºé
ã®åŒçšã§ãã OSSã§ãã ã¯ã©ãŠãã¯ã³ã¹ããšã»ãã¥ãªãã£ã®äž¡é¢ã§ããŒãã«ãäžãããã 忣å®è¡ãå¯èœã§ãã ç¶ç¶çè² è·ãã¹ãç°å¢ãšããŠã¹ã±ãŒãªã³ã°ã¯å¿
èŠ Web UIããã ã¬ããŒãå質ãé«ã åŠç¿ã³ã¹ããäœã ã¡ã³ããŒã®èª°ããå©çšã§ããããã«ããã å®çžŸãè±å¯ã§ãã OSSãä»åŸãä¿å®ãããå¯èœæ§ãé«ã ãã¡ããOSSã®æ¯èŒè¡šãåèãšããŠæŽçããŸããã ããŒã« 忣å®è¡å¯èœ Web UI åŠç¿ã³ã¹ã å®çžŸãè±å¯ ç¹åŸŽ WireMock â³ïŒèªåã¹ã¯ãªãããå¿
èŠïŒ â³ïŒæšæºUIãªãïŒ âïŒæ©èœãè±å¯ïŒ â æ¥çæšæºãæ©èœã¯åŒ·ãããUIãšåæ£ã¯ç¬èªå®è£
ãå¿
èŠ MockServer â³ïŒç¶æ
ã¯å
±æã§ããªãïŒ â âïŒæ©èœãè±å¯ïŒ â UIããã»æ©èœãè±å¯ Smocker â³ïŒåæ£ã¯æ³å®ãããŠããªãïŒ â âïŒYAML/JSONå®çŸ©ãçŽæçïŒ â³ UIç¹åã»è»œéãå人/å°èŠæš¡ããŒã åã ã¢ãã¯ããŒã«ã¯ä»ã«ã倿°ããã®ã§ãããå®çžŸãä¿å®æ§ãWireMockãšMockServerãçªåºããŠããããã«æããããããŸããã®2ã€ãåè£ãšããŸããã ãããŠä»ã®ããŒã«ãWeb UIãããããå®éã«è§Šã£ãŠã¿ãçµæãSmockerã®UIã䜿ããããæããããåè£ã«å ãã圢ã§ãã ãããä¿å®æ§ãèãããšå®çžŸã®è±å¯ãªWireMockãè¯ããšæã£ãŠãããUIã®èª²é¡ãšåæ£å®è¡ã®éšåãã¯ãªã¢ã§ããªãããšèª¿æ»ãé²ããŸããã ç¶ç¶çãªè² è·ãã¹ãã宿œããããã«ã¯ãè€æ°ã®ã¢ãã¯ãµãŒããŒã«å¯ŸããŠãã¹ã¿ãã®èšå®ã容æãã€å³æã§å€æŽã§ããUIãå¿
èŠãšèããŠããããã§ãã WireMockã®ãµãŒãããŒãã£ã®UIãæ¢ããŸããããè€æ°ã®WireMockã€ã³ã¹ã¿ã³ã¹ã«å³æã§åæ ã§ãããããªUIã¯ãããŸããã§ããã ãã®ãããå人çã«WireMock HubãšããOSSãäœãããšã«ããŸããã ykagano.github.io ã¹ã¿ãã®ç·šéãUIããè¡ããè€æ°ã®WireMockã€ã³ã¹ã¿ã³ã¹ã«å³æã§åæ ã§ããæ©èœãã¡ã€ã³ã«å®è£
ããŠããŸãã WireMockãšçµã¿åãããããšã§ã䜿ãåæã®è¯ãè² è·ãã¹ãçšã®ã¢ãã¯ããŒã«ãšãªããŸãã wiremock.org WireMockã®æ§ç¯ ECSã«æ§ç¯ããŸããã äžå³ã§ã¯è² è·ãã¹ãçšã«WireMockã2å°èµ·åããŠããŸãã Nginxã¯å€éšAPIã®Rate-LimiterïŒæµéå¶éïŒãåçŸããããã«äœ¿çšããŠããŸãã ECSã§ã®WireMockã®æ§æ ãŸããã®åŸãã«WireMock Hubã®All-in-Oneçãèµ·åããŠããŸãã 1ã€ã®ã³ã³ããã®äžã«Nginx + WireMock Hub + WireMockãå
å
ããŠããŸãã è² è·ãã¹ãã®ããã«ãWeb UIãæã€WireMock Hubãã¹ã¿ãããŒã¿ã®ç®¡çãšWireMockãžã®åæãè¡ããŸãã è² è·ãã¹ãçšã®WireMockã¯è² è·ãã¹ãå©çšæã«ã ãèµ·åããŠããŸãããWireMock Hubã ããæ¥åžžçã«èµ·åããŠããããšãã§ããŸãã ããããããšã§è² è·ãã¹ã以å€ã®å Žé¢ã§ããå€éšAPIã®ç°åžžç³»ã®ãã¹ããªã©ã§WireMock Hubã®å
å
ããWireMockãUIä»ãã§æ¥åžžçã«äœ¿çšããããšãã§ããŸãã ä»åè² è·ãã¹ãç°å¢ãæ§ç¯ããŸããããå¯ç£ç©ãšããŠãæ¥åžžçã«WireMockã䜿çšã§ããããã«ãªã£ããã®ãšãªããŸãã WireMock Hubã®æ§æ WireMock Hubã¯SQLiteã®DBãæã£ãŠããŸãã ãããžã§ã¯ãã®é
äžã«WireMockã®ã€ã³ã¹ã¿ã³ã¹ãšã¹ã¿ããçŽä»ãæ§é ã«ããŠããŸãã ãã®ããããããžã§ã¯ãã®æã€ã¹ã¿ããã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠå
¥ãæ¿ããããšãå¯èœã«ãªã£ãŠããŸãã ãããžã§ã¯ã ââ ã€ã³ã¹ã¿ã³ã¹ ââ ã¹ã¿ããããã³ã° å®éã«WireMock Hubã«ç»é²ããŠãããããžã§ã¯ãã§ãã WireMock Hubã®ãããžã§ã¯ãç»é¢ 次ã¯ã€ã³ã¹ã¿ã³ã¹ã§ãã WireMock Hubã®ã€ã³ã¹ã¿ã³ã¹ç»é¢ äŸãã°ãéå»ã®ãããžã§ã¯ãã§äœ¿çšããã¹ã¿ããããäžåºŠäœ¿ããããšããæã«ããããžã§ã¯ãã®æã€ã¹ã¿ããåæãããŠå
¥ãæ¿ããããšãã远èšããŠä»ã®ãããžã§ã¯ãã§åæããã¹ã¿ããšåå±
ããããšãã§ããŸãã ãã®ããã«ãWireMock Hubã¯WireMockã1å°ã ãå©çšãããå Žåã«ã䟿å©ã«äœ¿ããããã«ãªã£ãŠããŸãã WireMock Hubããã®ã¹ã¿ãç»é² WireMock Hubããã®ã¹ã¿ãã®ç»é²æ¹æ³ã¯ä»¥äžã®3çš®é¡ããããŸãã UIã§ã®ã¹ã¿ãç·šéïŒäžå³ Create Newãã¿ã³ãç·šéã¢ã€ã³ã³ãã¿ã³ïŒ ã¹ã¿ããã¡ã€ã«ã®ã€ã³ããŒãæ©èœïŒäžå³ Importãã¿ã³ïŒ ãããã·æ©èœã䜿ã£ãã¬ã³ãŒãã£ã³ã°æ©èœïŒäžå³ãµã€ãã¡ãã¥ãŒã®RecordingïŒ WireMock Hubã®ã¹ã¿ããããã³ã°ç»é¢ ãã®ãã¡ãè² è·ãã¹ãç°å¢ã®æ§ç¯æã¯ãäž»ã«ã¬ã³ãŒãã£ã³ã°æ©èœãšã€ã³ããŒãæ©èœã䜿ã£ãŠããŸããã ã¬ã³ãŒãã£ã³ã°æ©èœ ã¬ã³ãŒãã£ã³ã°æ©èœã¯WireMockãæšæºæèŒããŠããæ©èœã§ãã ãŸã äœãã¹ã¿ãã«ç»é²ããŠããªãå Žåãã¬ã³ãŒãã£ã³ã°æ©èœã¯ãšãŠã圹ã«ç«ã¡ãŸãã WireMock Hubã®ã¬ã³ãŒãã£ã³ã°ç»é¢ ã¬ã³ãŒãã£ã³ã°ç»é¢ã§Target URLãæå®ããŠéå§ãããšãWireMockã察象ã®URLã«å¯Ÿãããããã·ïŒäžç¶ãµãŒãïŒã«ãªããŸãã ãã®ç¶æ
ã§BASEã·ã¹ãã ãšå€éšã·ã¹ãã ã®éã«WireMockãæãã§éåžžã®ãªã¯ãšã¹ããéãããšãã§ããŸãã å³ã«ãããšãã®ããã«å³äžããéåžžã®è³Œå
¥ãªã¯ãšã¹ããBASEã·ã¹ãã ã«å
¥ã£ãŠããŸããã BASEã·ã¹ãã ãå·Šã®WireMockã«å€éšãµãŒãã¹ãžã®ãªã¯ãšã¹ããæããŠãçµæãå€éšãµãŒãã¹ã«ãªã¯ãšã¹ããå°éããŸãã WireMockããããã·ãšããŠå€éšãµãŒãã¹ã«éä¿¡ããŠããå³ ããããããšã§ãWireMockã«å®ãªã¯ãšã¹ããèšé²ãããŸãã ã¬ã³ãŒãã£ã³ã°ã忢ãããšWireMockã«ã¯èšé²ãããå®ãªã¯ãšã¹ããã¹ã¿ããšããŠç»é²ãããŸãã WireMockã®ãªã¯ãšã¹ããã°ã«ãèšé²ãããŠããããããªã¯ãšã¹ããã°ããWireMock Hubã«ã¹ã¿ãç»é²ããããšãå¯èœã§ãã ãã®åŸãæ±çšçãªã¹ã¿ãã«ããããã®èª¿æŽã¯å¿
èŠã§ãããã¬ã³ãŒãã£ã³ã°æ©èœã䜿ãã°ãã¹ã¿ãããŒã¿ãæã§æžãããšãªãç»é²ã§ããŸãã ã€ã³ããŒãæ©èœ ã€ã³ããŒãæ©èœã¯WireMock HubããWireMockã®JSON圢åŒãšOpenAPI圢åŒã®äž¡æ¹ãã€ã³ããŒãã§ããŸãã WireMock圢åŒã®JSONäŸ { " mappings ": [ { " request ": { " method ": " GET ", " url ": " /test " } , " response ": { " status ": 200 , " headers ": { " Content-Type ": " application/json " } , " body ": " { \" message \" : \" success \" } ", " fixedDelayMilliseconds ": 2000 } , " priority ": 5 , " persistent ": true , " name ": " ãã¹ãã ã ", " scenarioName ": " test ", " requiredScenarioState ": " Started ", " newScenarioState ": " Step_2 ", " metadata ": { " hub_isActive ": true } } ] , " meta ": { " total ": 1 } } äŸãã°ã¬ã³ãŒãã£ã³ã°æ©èœã§èšé²ããã¹ã¿ãããWireMockã®JSON圢åŒã§ãšã¯ã¹ããŒãããŠããã°ã以éã¯Claude Codeã§ç·šéããããšãã§ããŸãã äŸãã°ã¢ãã¿ãªã³ã°ããŒã«ã«èšé²ãããå€éšAPIã®éä¿¡æéã®å¹³åãã¹ã¿ãã®é
å»¶æéïŒfixedDelayMillisecondsïŒã«äžåŸã§èšå®ãããšãã£ãããšãã§ããŸãããå®éã«ããããã¹ã¿ãã®èšå®èª¿æŽãClaude CodeãéããŠè¡ã£ãŠããŸãã WireMock HubããWireMockãžã®èªååæ WireMock Hubã¯WireMockãšã¯ççµåãªã¢ããªã±ãŒã·ã§ã³ãšããŠèšèšããŠããŸãã ãã®ãããECSã§WireMockãåãããã€ããå ŽåãWireMock Hubã«ç»é²ããŠããWireMockã€ã³ã¹ã¿ã³ã¹ã®IPã¢ãã¬ã¹ãå€ãã£ãŠããŸãããšã«ãªããŸãã æ¯åãWireMockã€ã³ã¹ã¿ã³ã¹ã®IPã¢ãã¬ã¹ã調ã¹ãŠåç»é²ããã«æžãããã«ãWireMock Hubã«ã¯ã€ã³ã¹ã¿ã³ã¹ã®åç»é²APIãçšæããŠããŸãã äžå³ãåæåŠçã®ã·ãŒã±ã³ã¹å³ãšãªããŸãã Lambdaã®APIçµç±ã§ã€ã³ã¹ã¿ã³ã¹IPãªã¹ããååŸããWireMock Hubã®APIã«æž¡ãããšã§ãã€ã³ã¹ã¿ã³ã¹IPã¢ãã¬ã¹ãæŽæ°ããWireMock Hubã®ãããžã§ã¯ãã«çŽä»ãã¹ã¿ããWireMockã«èªååæããŸãã import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs'; mermaid.initialize({ startOnLoad: true }); sequenceDiagram participant gha as GitHub Actions participant tf as Terraform participant ecs as ECS Fargate<br/>(WireMock Worker) participant sd as Service Discovery<br/>(Cloud Map) participant lambda as Lambda<br/>(wiremock-sync) participant hub as WireMock Hub %% Phase 1: Terraform ããã〠Note over gha, ecs: Phase 1: Terraform ããã〠gha ->> tf : wiremock-hub apply activate tf tf ->> hub : WireMock Hub ããã〠activate hub tf -->> gha : apply å®äº deactivate tf gha ->> tf : wiremock apply activate tf tf ->> ecs : WireMock Worker ããã〠activate ecs ecs ->> sd : ã¿ã¹ã¯IPèªåç»é²ïŒHEALTHYïŒ note right of sd : wiremock-worker.cart-load-test.local<br>â 172.20.10.x tf -->> gha : apply å®äº deactivate tf %% Phase 2: GitHub Actions ã«ãã Lambda invoke Note over gha, lambda: Phase 2: Lambda invoke gha ->> lambda : aws lambda invoke activate lambda %% Phase 3: Lambda åŠç Note over lambda, sd: Phase 3: Service Discovery ããã€ã³ã¹ã¿ã³ã¹ååŸ lambda ->> sd : discover_instancesïŒHEALTHY ã®ã¿ïŒ activate sd sd -->> lambda : ã€ã³ã¹ã¿ã³ã¹IPãªã¹ãè¿åŽ deactivate sd %% Phase 4: Hub API â ã¹ã¿ãé
ä¿¡ Note over lambda, hub: Phase 4: Hub API åŒã³åºã â ã¹ã¿ãé
ä¿¡ lambda ->> hub : POST /hub/api/projects/{id}/instances/bulk-update note right of hub : {"instances": [...], "syncStubs": true} hub ->> hub : ã€ã³ã¹ã¿ã³ã¹IPæŽæ° hub ->> hub : ãããžã§ã¯ãã®ã¹ã¿ãå®çŸ©ãååŸ hub ->> ecs : POST /__admin/mappingsïŒå WorkerïŒ ecs -->> hub : ã¹ã¿ãç»é²å®äº hub -->> lambda : åæçµæ lambda -->> gha : å®äº deactivate lambda deactivate ecs deactivate hub ãã®ä»çµã¿ã«ãã£ãŠãWireMockåŽã®åãããã€ãããŠããè² è·ãã¹ãã«å¿
èŠãªã¹ã¿ãã¯åžžã«æ
ä¿ãããŸãã ãããã« WireMockã¯ããŒã³ãŒãã§ã¹ã¿ããäœããŸãã®ã§ãéçºäžAPIã®ä»£æ¿ãç°åžžç³»ã®éä¿¡ãã¹ããªã©ã«ã䟿å©ã§ãã ä»åäœã£ãWireMockç°å¢ã¯ãã«ãŒãæ©èœã ãã§ãªãã瀟å
ã§èª°ã§ã䜿ããã¢ãã¯ããŒã«ãšããŠæ¥åžžçã«äœ¿ã£ãŠãããã°ãšæããŸãã å
š3åã®èšäºãæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããïŒ ã¢ãã¯ã䜿ã£ããã¹ãã«èå³ããããŸããããã²æ¡çšæ
å ±ãã芧ãã ããïŒ binc.jp
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã







