åããŠã®ã°ã«ãŒãã¯ãŒã¯ãæåããããã£ãäžã€ã®ç§èš£ è€æ°åã§äœã宿œããããããããã©ãåãã°ãããåãããªãâŠãããªèª²é¡ããæã¡ã§ããããïŒãã®èšäºã§ã¯ã°ã«ãŒãã¯ãŒã¯ã®æåçãäžããããã®èªåãè¡ã£ãããšã«ã€ããŠãŸãšããŸãããåãæ©ã¿ãæã€äººã®åèã«ãªãã°å¹žãã§ãã ããšã®å§ãŸã ããšã®ãã£ããã¯äºæ¥éšå
ã®æ¹éã圢ã«ããå¿
èŠããããéãŸã£ãŠé¡§å®¢çè§£ã«ã€ãªããæŽ»åãããã§ããã ãã®è©±ã«é¢ããŠã¯å¥èšäºã®ã æ¹éã圢ã«ããããŠãŒã¶ãŒçè§£Dayå§ããŸãã ããã確èªãã ããã èªå·±çŽ¹ä» ããžã¯ã©ã§ iOS ãšã³ãžãã¢æ
åœãããŠãå·äžã§ãããšã³ãžãã¢ã§ãããéšçœ²ã®ãã¡ã¡ã³ããŒãšããŠéšçœ²æŽ»åã®äŒç»ãéçšãçå
ããããµããŒãããŠããŸãã ãã³ãã£ãŒ ã®ãããªç€Ÿå¡æ°ã®å°ãªãäŒæ¥ã§ã¯ãæãæã¡ã¯ããããã§ããã åå宿œã«åããæºå ååã®ãŠãŒã¶ãŒçè§£Dayã«åããååã«ã€ããŠèª¬æããŸããããŒã å
ã§ã°ã«ãŒãã¯ãŒã¯ã宿œããããã©æºåãå¿é
ãªäººã®åèã«ãªãã°å¹žãã§ãã ã»ãŒå®ç§ãªã¿ã€ã ã¹ã±ãžã¥ãŒã«ã§å®æœ çµè«ãå
ã«è¿°ã¹ããªããçŽ8æéã®é·äžå Žãªãããã»ãŒäºå®éãã«é²ããããããšãã§ããŸããã ãã㯠ãšãŠãéèŠãªçµæ ã§ãã ãªããªããååã®ã°ã«ãŒãã¯ãŒã¯ã§è€æ°åã®æéã䜿ã£ãã®ã«æ³å®ããææãåºãªãã£ã ã å Žåã äžé·ããã®å°è±¡ã¯è¯ãæ¹åã«ã¯ãªãããã¡ã³ããŒããã®ã°ã«ãŒãã¯ãŒã¯ã«å¯Ÿããã¢ãããŒã·ã§ã³ãæåŸ
å€ãäžé ããŠããŸãããããã°ã«ãŒãã¯ãŒã¯ãããŒã ã«ãšã£ãŠãã¬ãã£ãã«åããŠããŸãããšãããããã§ãã 培åºããåããæåã®éµ ãã£ãããšããç®çã»èšç»ã§ã¯ãããã ãæå確çããã¬ãŠããŸããŸãã éè¯ãäºãé²ãããšãããã°ãäœãè¯ã广ãçãŸããçµãã£ãŠããŸããšããçµéšãããæ¹ãããã®ã§ã¯ãªãã§ãããã äºåã®æºåã培åºããããã°ãã°ã«ãŒãã¯ãŒã¯ã®æå確çãããªãäžããããšãã§ããŸãã ããã¯ååã€ãã³ãã«åããŠçšæããè£æ¹çšã®äžéšã¿ã¹ã¯ã«ãªããŸãã ãªãã£ã¹çµçšã«UberEatsãé Œãæéãããçµã¿èŸŒãã§ããŸããã ãŸã泚æèªäœã忥ã«åå è
ããåã£ãŠããŸãã ã°ã«ãŒãã¯ãŒã¯æºåè³æ 宿œç°å¢ ãªã¢ãŒãã¯ãŒã¯çµãšãªãã£ã¹ã¯ãŒã¯çµããã éäž2ããŒã ã«åãããæéããã 人æ°ã¯10å éçšã¯äºäºº æºåã®æµã æ¹åæ§ã®èªèåãã ããã°ã©ã ã®ãããå°ãäºäººã§äœæ ç§ã®æ¹ã§çްããéšåãŸã§èä»ã åœæ¥ã®æµããè³å
ã·ãã¥ã¬ãŒã·ã§ã³ãäžæç¹ãäžè¶³ç¹ããªãã åœæ¥èª¿ã¹ãªããšåãããªãåé¡ã¯ãä»£æ¿æ¡ãèããŠãã ã¿ã¹ã¯åºã 忥ãŸã§ã«æ±ºããŠããããš åœæ¥ã®éå§åã«å®æœããããš åœæ¥éå§åŸã«å®æœããããš åœæ¥åå è
çšã®è³æçšæ è£æ¹çšã®è³æãçšæ ãã€ããªããã¯ãŒã¯ãªãã§ã¯ã®åé¡ åŒç€Ÿã§ã¯æšæã®Weeklyãªãã£ã¹ãšãªã¢ãŒãã¯ãŒã¯ã掻çšãããã€ããªããã¯ãŒã¯ã§æ¥ã
å€åããŠããŸãã ãŠãŒã¶ãŒçè§£Dayã¯å
šå¡ãéãŸãæ³å®ã§ããããå¿
ãããå
šå¡ãéãŸãããšã¯éããŸããã ãã®ãããªã¢ãŒãçµãå°ããªãããã«èšåãéçšãèããå¿
èŠããããŸããã ãã®äžã§äžçªéèŠããç¹ã¯ãå
šå¡ãèŠããã ãã§ãªããé°å²æ°ãèŠããç°å¢ãäœãããšã§ãã åœæ¥ã®äŒå Žã§ã¯ iPhone ãããããªäŒè°ã«æ¥ç¶ãããããå
šäœã俯ç°ã§ããå Žæã«é
眮ããŸãããããããããšã§ãäŒè°ã®ããã°ã©ã ãšããã°ã©ã ã®éããäŒæ©ããã®åéæã«ãªããªãå§ãŸããªãå Žåã«ä»ã©ãããç¶æ³ïŒãšããçåã解決ã§ããç°å¢ãäœããŸããã âäžå³ã¯äºåã«èããŠããå¿
èŠèšåãšãã®é
眮ã§ããç§äžäººã«æ
å ±ãäŸåããŠããŸããšæºåäœæ¥ã«ãããŠç§ã ããã«ãã㯠ã«ãªãããããã®ããã«èª°ã§ãäœæ¥ãæäŒããããã«äœæ¥æ
å ±ãè£æ¹è³æã«æºåããŠãããŸããã ã°ã«ãŒãã¯ãŒã¯åœæ¥ã®ãã¹ã¯äžã®èšåé
çœ®å³ å€§ããçšçŽãšããã«å°å·ããæ¹æ³ ã¿ããªã§éãŸã£ãŠäœæ¥ã£ãŠãªããšãæ¹çŒçšçŽïŒA1ïŒãA2ã®ãããªå€§ããªçŽã«ã¿ããªã§ä»ç®ã貌ã£ããæžã蟌ãã§ããã€ã¡ãŒãžããããŸãã ãããå®éåé¡ãªãã£ã¹ã® è€åæ© ãªã©ã«A1ãA2ãšãã£ã倧ããçšçŽã¯ãããŸãããææ¿å
·åºãªã©ã«è¡ããªããšãããŸããããããçšçŽã«äºåã«å°å·ãªã©ãããã£ãŠãªããšA1ãå
¥ãããªã³ã¿ãå¿
èŠã§ããã§ã倧æµã®ãªãã£ã¹ã«ãããªå€§ããçŽãå
¥ãããªã³ã¿ã¯èšçœ®ããŠããªããšæããŸãã åŒç€Ÿã®åæ§ã§ãçŽãè²·ãã«ããŠããªãã£ã¹è¿ãã«ãããã£ãå Žæããªããããªã³ã¿ããããŸããã§ããã ãã®åé¡ã®æé©ãªè§£æ±ºæ¹æ³ã¯ãã¹ã¿ãŒå°å·ã䜿ãããšã§ãã ãã¹ã¿ãŒå°å·ãšã¯æ¡å€§åå²ããŠå°å·ããããšã§ãA4çšçŽãã€ãªãåããããšA1ã®å°å·ãã§ããæ¹æ³ã§ãããã®æ©èœã§ããã°ãªãã£ã¹ã«ãããŠãã倧äœã®ããªã³ã¿ãŒããµããŒãããŠããããšæããŸãã å°å·ããA4ã¯ããŒãã§ç¹ãåãããŸãã ããã°ã©ã æ¯ã«æ³å®æéãåºã äºå®ããæé垯ã§çµããããã«ã¯äºå®ããã°ã©ã ã«äœåãããããå¿
é æ
å ±ã§ãã çšæããããã°ã©ã ãåœæ¥ã¶ã£ã€ãæ¬çªã§å®æœããã®ã¯ããã¹ããããªãªãŒã¹ããã®ãšåãããšã§ããã³ãŒãã£ã³ã°åæ§ã«æ³å®éãããŸãããããã¹ãã¯å€§åã§ãã ãã®èŠç©ãã確床ãé«ããããã«å®éã«åãå
容ãçšæããããäžé£ã®æµããé ã®äžã§ã·ãã¥ã¬ãŒã·ã§ã³ãäœåºŠãç¹°ãè¿ããŸããã åœæ¥ãã©ãã£ãäº åœæ¥ã«æ³å®å€ã«èµ·ããåé¡ããããŸããã ããã¯ç§èªèº«ããã£ãã«ãªãã£ã¹ã«åºç€Ÿããããšããªãã£ãããã é倿éãèŠèª€ã£ãŠãäºå®ããŠãå°çæå»ã«é
ããŠæºåæéãã»ãšãã©åããªãã£ãããšã§ã⊠ð
ããããåœæ¥ã¯å¥ã®è£æ¹ã¡ã³ããŒãåœæ¥æäŒã£ãŠãããæ¹ãè£æ¹è³æãèŠãŠäœæ¥ãé²ããŠãããããšã§ãéå§ãŸã§ã«ã¯ç¡äºéã«åããŸããã ãŸãšãïŒã°ã«ãŒãã¯ãŒã¯ã¯æºåã倧å åããŠãã人ã§ãå
¥å¿µãªæºåãšå¯Ÿçãç·Žã£ãŠããããšã倧åã§ãã ãŸãååã«è±å¯ãªæºåè³æãçšæãããŠãããšã§æ¬¡åé嬿ã«ãã®è³æãããŒã¹ã«è©±ãé²ããããããæ¬¡åäœæ¥ãåæ»ã«ãªããŸãã æåŸã« ããžã¯ã©ã§ã¯é¡§å®¢ç®ç·ã«ç«ã¡äžç·ã«éçºããŠãããã¡ã³ããŒãåéããŠããŸãïŒ èå³ãããæ¹ã¯ãã² ãã¡ãã®åé ãã芧ãã ããïŒ
éšçœ²ã®è¡åæ¹éãæ²ããã ããã以éã¯æ¹éãèŠãæ©äŒããªããã°æãåºãæ©äŒããªããèãæ¹ã䟡å€èгãã¡ã³ããŒãåãããªããŸãŸã æ°ãã€ãã°åœ¢éªžå âŠãªããŠçµéšã¯ãªãã§ããããïŒ ãã®èšäºã§ã¯ãæ²ããæ¹éãè
ãããªãããã«å
·äœçãªåœ¢ãžäžæ©é²ãã話ã«ã€ããŠãŸãšããŸãããåãæ©ã¿ãæ±ããéšçœ²ãããŒãžã£ãŒã«ãšã£ãŠäžã€ã®åèã«ãªãã°å¹žãã§ãã èªå·±çŽ¹ä» ããžã¯ã©ã§ iOS ãšã³ãžãã¢æ
åœãããŠãå·äžã§ãããšã³ãžãã¢ã§ãããéšçœ²ã®ãã¡ã¡ã³ããŒãšããŠéšçœ²æŽ»åã®äŒç»ãéçšãçå
ããããµããŒãããŠããŸãã ãã³ãã£ãŒ ã®ãããªç€Ÿå¡æ°ã®å°ãªãäŒæ¥ã§ã¯ãæãæã¡ã¯ããããã§ããã æŽ»åã§äº€æµããããšã§æ¹éã®èªèããããã ããžã¯ã©ã®ãããã¯ãããŒã å
ã®é¡§å®¢çè§£ãé«ããããã«ããªãã£ã¹ã§äžž1æ¥äœ¿ã£ãŠé¡§å®¢çè§£ã«ç¹ããæŽ»åã宿œããŠããŸãã æ¹éãæ¹éã§çµããããªã掻åã®äžç° ããžã¯ã©ã®ãããã¯ãããŒã ã«ã¯ããããŒã æ¹éããšåŒã°ãããããŒã å
ã§å
±éã®èªèããããŸãã Respect Collaborate Go beyond customer Be a professional ãããæ¹éã®é¥ããããç¶æ³ãšããŠã æ¹éãæ¹éã§çµãã£ãŠãäžèº«ããªã ããšããããããŸãã äŒç€Ÿã§èŠãããããªã¥ãŒã瀟èšãããã·ã§ã³ãšãã£ãé¡ã§ã 宿
ãšæ Œå·®ãéããŠã äŒç€ŸãèŠãããããšããããšæããŸãã ããžã¯ã©ãäŸå€ãªãå®ç§ãšã¯èšããªãç¶æ
ã§ãã ãã®ãããªå
±éã®èªèã¯åãããåãã£ãŠã人ãšããã§ãªã人ã«åãããŸããããã§ãªã人ãäžèº«ããªããŸãŸã«ããªãããã«ãæ Œå·®ããªããæŽ»åãå¿
èŠã§ãã ä»åãã®äžã®ãGo beyond customerãã«ãã©ãŒã«ã¹ããæŽ»åãšããŠã顧客çè§£ããã°ã«ãŒãã¯ãŒã¯ãéå¬ã«é¢ãã話ã§ãã ããŒã å
ã§æ1宿œã®ãŠãŒã¶ãŒçè§£Day ãããã¯ãããŒã ã¯ããšã³ãžãã¢ãPMãQAããã¶ã€ã³ãšããžã¯ã©ãµãŒãã¹ãäœãã¡ã³ããŒã§æ§æãããŠããŸãã æã«1åãªãã£ã¹ã«éãŸãã11æãã18æãŸã§ã¡ã³ããŒå
šå¡ïŒç·æ¥å¯Ÿå¿è
é€ãïŒã§é¡§å®¢ãçè§£ããããã«çšæãããããã°ã©ã ã«æ²¿ã£ãп޻åãéå§ããŸãã ååã®å€§ããã°ã©ã ã¯æ¬¡ã®æµãã§å®æœããŸããã éåã»èª¬æ ã¢ã€ã¹ãã¬ã€ã¯ 察象ãšãªããŠãŒã¶ãŒã®èª¬æ ãã¢ãª ã³ã°ã¬ããŒãå
±æ ãæŒ å°å
¥äºäŸå匷 ã«ã¹ã¿ããŒãžã£ãŒããŒããã宿œåã®èª¬æ CJMã¯ãŒã¯ã·ã§ãã åããŒã CJMå
±æ ãã㯠ããŒãã£ã³ ã° ã¢ã³ã±ãŒã è«ç¬ ç®çã¯é¡§å®¢çè§£ã§ããã顧客ãç¥ãã ãã§ãªã顧客ã®ç«å Žã«ãªã£ãŠèããäºããã广çã«çè§£ãžç¹ãããšããèãã®ããšãã¡ã€ã³ãã£ãã·ã¥ãã«ã¹ã¿ããŒãžã£ãŒããŒãããã®äœæãšãããã®åæ®µã«æ
å ±åéãšããæµãã§å®æœããŸããã ã¢ã€ã¹ãã¬ã€ã¯ æ®æ®µãªã¢ãŒãã¯ãŒã¯ãäžå¿ã®äŒç€Ÿãªãããå®éã«é¡ãåãããæ©äŒãå°ãªããååæŽ»åãšããããšããã£ãŠãã¢ã€ã¹ãã¬ã€ã¯ã宿œããŸããã ã¢ã€ã¹ãã¬ã€ã¯ãã¿ã¯ãã¿æ¢ããŠãæã¡ããã©ãã Twitter ã§æµããŠããMiroã䜿ã£ããã£ã©äœæãåèã«ããŸããã https://twitter.com/tyasuma/status/1516228968625901569 ãªã¢ãŒãã¡ã³ããŒäº€ããã¢ã€ã¹ãã¬ã€ã¯ã®æ§å æ
å ±åé ä»åã¡ã€ã³ã®ã¿ãŒã²ããã«è¿ãã顧客㮠ãã¢ãª ã³ã°ã¬ããŒãå
±æãå°å
¥äºäŸå匷ã§ãã«ã¹ã¿ããŒãžã£ãŒããŒãããäœææã®ææãéããŸããã ãªã¢ãŒãã¡ã³ããŒäº€ã㊠ãã¢ãª ã³ã°ããæ
å ±ã®å
±æ 2ããŒã ã«åãããŠãã«ãœãå®çŸ©ãšãžã£ãŒããŒãããäœæ 倧å¢ã§ã¯ãŒã¯ã·ã§ããã«åãæãããšçºèšçã芳ç¹ãçãŸãçç±ãšãã¹ããŒã¹ã®é¢ä¿ã§2ã€ã®ããŒã ã«åãããŠã¯ãŒã¯ã·ã§ããã宿œããŸããã Team A Team Aã®ãã«ãœããšãžã£ãŒããŒããã Team B Team Bã®ãã«ãœããšãžã£ãŒããŒããã ææç©ãšããŠã¯äžå®å
šã§ãããç®çã¯ææç©ãäœãããšã§ã¯ãªããŠãŒã¶ãŒç®ç·ã§èããäºãªã®ã§OKã§ãïŒ ããŒã æ¯ã«äœã£ããžã£ãŒããŒãããããã«ãœããçºè¡š åããŒã ã§äœæããCJMããã«ãœããçºè¡šãã芳ç¹ãå
±æããŸããã äœæãããã«ãœããCJMãåããŒã çºè¡š ã«ã¹ã¿ããŒãžã£ãŒããŒãããã®ç®çãäœæã§ã¯ãªãäœæè¡çºã«éã¿ãçœ®ã æ¬æ¥ã§ããã°ã«ã¹ã¿ããŒãžã£ãŒããŒãããã¯ãã£ãšæ©ã段éã§äœæãããŠãããã宿çã«ã¡ã³ãã³ãã³ã¹ãããŠãåžžã«ãŠãŒã¶ãŒã®åããèŠèŠåãããŠããããšã§æ¬é çºæ®ããŸãã ä»åã¯äœæããããšãç®çã§ã¯ãªãã ãäœæããããã«èª¿ã¹ãã»è§Šãã»èããè¡çºã顧客ç®ç·ã«åãããã ã¬ãŒãã³ ã°ã ãšããããšã宿œåã«èª¬æããŸããã ã¢ã³ã±ãŒãçµæã¯äžã
ã€ãã³ãæåŸã«ã€ãã³ãã®ã¢ã³ã±ãŒããåå è
ã«æžããŠããããŸããã çµæã¯å¥œè©ã§ãè¯ãã¹ã¿ãŒããšãªããŸããã ã°ã«ãŒãã¯ãŒã¯ã®ã¢ã³ã±ãŒãçµæ ãŸãšãïŒæ¹éã®èœãšã蟌ã¿ã¯å€§å ä»åã¯ãGo beyond customerãã«é¢ãã話ã§ããããå¥ã®æ¹éã«ãæœçããŸã ãªãã£ããããŸãã ããŒã æ¹éãªã©ããŒã ã®å
±é䟡å€èгãèªèã¯ããã®ããŒã ã®ååšçç±ãè¡åã«åœ±é¿ãäžãããã®è¡åã®çµ±äžæ§ã«ããäžèŠãªè°è«ã®è¡çªãé¿ããããããã€ã³ã³ããã¹ããªè°è«ã«ã€ãªãããããããŠãçµæãšããŠããŒã ã®çç£æ§ãå®å®æ§ã«ç¹ãããŸãã æåŸã« ããžã¯ã©ã§ã¯é¡§å®¢ç®ç·ã«ç«ã¡äžç·ã«éçºããŠãããã¡ã³ããŒãåéããŠããŸãïŒ èå³ãããæ¹ã¯ãã² ãã¡ãã®åé ãã芧ãã ããïŒ
ã¯ããã« ã¯ãããŸããŠïŒæ ªåŒäŒç€Ÿããžã¯ã©ã§ãšã³ãžãã¢ãããŠããç²æãšç³ããŸãã ä»åã¯åŒç€Ÿã§ãšã³ãžãã¢ãåãå·»ãéçºç°å¢ãæœçã®äžã§ãä»ã§ãç¶ããŠããããŒã å
šäœã®åãçµã¿ãäžéšç޹ä»ããããšæããŸãã æ©ããã®ã§ãããšãã³ã®ã€ããã§ããŠãã¹ã¿ãŒãã¢ããã§2幎åšç±ãããšçžå¯Ÿçã«å€æ ªã«ãªã£ãŠããŸãããã§ãããææ¥ã®çµéãšããã®ã¯æããããã®ã§ãããåšç±ããŠããéã«ãã©ãã©ããšä»çµã¿ãå€ãã£ãŠãã£ãŠä»æ¯ãè¿ããšæããããæããŸãã 1. ããã©ãŒãã³ã¹æ¹åã¢ããã åŒç€Ÿã§ã¯ãããžã§ã¯ãã®é²è¡ã«é¢ããŠã¯ ã¹ã¯ã©ã ããŒã¹ã§issueäœæã ã¹ã¯ã©ã éçšã«ã¯PMãšé£æºããŠå®æœããŸãããã€ã³ãã©ãããã©ãŒãã³ã¹åšãã§ã¯ãšã³ãžãã¢ãäž»äœãšãªã£ãŠããŸãã æ¯é±æéãåã£ãŠãšã³ãžãã¢ã§éãŸããDatadogãBugsnagãšã«ããã£ãããŠã¹ããŒã¯ãšãªæ¢ãããN+1ãæ¢ããããã±ã¢ã§ããŠããªããšã©ãŒãããã¯ã¢ãããããããŠãã®å Žã§ã³ãŒããå
±æããªããä¿®æ£ããããæããããããªå Žåã¯issueåããŠã¹ããªã³ãã«è¿œå ããããã«ããŠããŸãã ãã®æœçã«ãã£ãŠæ°ã
ã®N+1ã¯ãšãªãåãé€ãããšãã§ããã»ããåæããšã³ãžãã¢å
šå¡ã§å
±æããããšã«ãã£ãŠäºåã«N+1ãåé¿ãããããªå¯Ÿçãè¡ãããããã«ãªããŸããã PMãäºæ¥ã䌞ã°ãæœçãèãããšã³ãžãã¢ãã¢ããªã±ãŒã·ã§ã³ã®å¥å
šãªéçšãèããããã®äž¡èŒªã§ãããã¯ãããŒã ã¯æãç«ã£ãŠããŸãã 2. ããã«ãœã³ éåžžæ¥åããé¢ããŠããŒããå®ããŠ1æ¥ã¬ãããªå®è£
ããæ¥ã§ããçŸç¶ã¯ããžã¯ã©ã«çŽæ¥é¢ä¿ããŠãããã©æ®æ®µãªããªãé¢ãããªãã£ãããæè¡çã«ã¡ãã£ãšãã£ã¬ã³ãžãããã¢ãããŒãã®æ€èšŒã®å ŽãšããŠäœ¿çšããããšãå€ãã§ãã ç§ã¯ããŒã¿åæã®æºåçšã«ããŒã¿ã®äœãã調æ»ãããã å
šææ€çŽ¢ çšã«ã€ã³ããã¯ã¹ãæ¹åããããšãã£ãããŒãã«æè¿ã¯æ³šåããŠããŸããæ ã®æéããã¿ã®å¢å ã«è¿œãã€ããªããªã£ãŠããŠèŽ
æ²¢ãªæ©ã¿ãåºãŠããŸããã åå㯠iOS ã§ ããŒã³ãŒããªãŒã ãŒãå®è£
ããããã¯ãŒã¯ãããŒã®æ¹åãè¡ã£ãããæ®æ®µåŸåãã«ãªããã¡ãªå®è£
ãããããæ©äŒãªã®ã§ã©ãã©ãããžã¯ã©ã«ææããã£ãŒãããã¯ããŠããããã§ããã 3. DBååŒ·äŒ ããžã¯ã©ã®å®è£
ã«æ¥ã
æºãã£ãŠå®æããã®ãããšã³ãžãã¢ãšPMã®ç¥èã«é察称æ§ãéåžžã«åŒ·ãããšã§ãã PMã®èŠç¹ããèŠãã°äºæ¥ã¬ãã«ã®è©±ãã©ããŸã§äŒãããããšããæ©ã¿ããããŸããããããšåæã«ãšã³ãžãã¢ããèŠããšã©ã®ãããã·ã¹ãã ã®æ§æãèšèšãäŒããã¹ããããšããããšãæ©ãŸããã®ã§ãã ãšã¯ããããããŸã ãã©ãã¯ããã¯ã¹ åãããšPMãäœã仿§ãéçºã®å®æ
ãã倧ããä¹é¢ããŠèª¿æŽã倧å€ã«ãªãããšããããå°ãã§ãæ Œå·®ãåããããšããããšã§å
éšã®ããŒã¿ã«ã€ããŠç¥èãå
±æããæ©äŒããã°ãã°èšããŠããŸãã ç¹ã«PMã«å¯Ÿããç¥èã®å
±æãšããç®çã¯æºããããŠããã以åã«æ¯ã¹ãŠå
éšããŒã¿ã«é¢ãã話é¡ã§ã®éœéœ¬ãå°ãªããªã£ãŠããŠããã®ã宿ããŠããŸãã CSã¡ã³ããŒãªã©ã«ãåå ããŠããã£ãŠããŸããå°æ¥çã«ã¯é¡§å®¢ããŒã¿ã®å®æ
調æ»ã¿ã¹ã¯ãæé¢ããããããšã¯æã£ãŠãã®ã§ãããã¬ãã«æãåãããããã«çœ®ããŠããŒãã«ããŠããŸã£ããšããåçããããæ©èœé¢ã§ããã¬ããžé¢ã§ãããŸã ãŸã éã¯é ããªãšå®æãããããŠããŸãã 4. ãæ«é²ç®äŒ çŽè¿ã«ãªãªãŒã¹ãããæ©èœã®ç޹ä»ãšãé¢ä¿è
ã«ãç²ãããŸã§ãããèšãäŒã§ãã å瀟å¡ã®åå¿ã£ãŠæ§ã
ã§ãåºãããŒã ããŸããã£ãŠäžæºåããŠããæ©èœãããã°ä»æ§ãæå¿«ã§æ°äººã§ãã£ãšäœããŠããŸãæ©èœããããŸããã話ã¯èããŠããŠãå®éã«åããŠãããšãããèŠãããšã§è§£å床ãäžããããšãããã®ã§ã掻åã®å
±æãšããŠéèŠã ãšæã£ãŠããŸãã éçºè
ã®äžã§çŽæ¥ã瀌ãèšãããããšãã¢ãããŒã·ã§ã³ã«ããŠãããã©ãããšããã®ã¯å人差ãããå
容ã§ãããããããå Žãäœãããšã«ããããŒã ã®äžäœæéžæãªã©ã®æå³ã§ãæçŸ©ã®ããå Žã§ãã ãããã« æœçé¢ã§ã¯ããããªãã詊è¡é¯èª€ãç¹°ãè¿ããŠããŸããè²ã
ãããããçµææ¬æ¥ã®ã¿ã¹ã¯ãå§è¿«ããããã¹ãªã ã«ããŠã¿ãããªãã ã飿ºãããã¡ãªããªã£ãããããã§ããªãããã§ããªããšçæ³ãšçŸå®ã®éã§æºãç¶ããæ¯æ¥ã§ãã æ ªåŒäŒç€Ÿããžã¯ã©ã§ã¯ãããªæã
ãšäžç·ã«ç©æµæ¥çã®æªæ¥ãåãéããšã³ãžãã¢ãåéããŠããŸãïŒ èå³ãããæ¹ã¯ãã² ãã¡ã ãã芧ãã ããïŒ
èªå·±çŽ¹ä» å®¶ã§ã¯åäŸ3人ã®ç¶èŠªã§ãããžã¯ã©ã§ iOS ãšã³ãžãã¢æ
åœãããŠãå·äžã§ãã 2021幎3æããå
¥ç€Ÿãã iOS ãå
šè¬çã«æ
åœããŠããŸãã ããžã¯ã©ç€Ÿå¡ã«ããè·å Žãã¬ãè©äŸ¡ ä»åã¯ç§ãããžã¯ã©ã«å
¥ç€ŸããŠ1幎çµéããããã ããžã¯ã©ã«èå³ãæã£ãæ¹ã«åã㊠ãåããŠåãã£ã ãšã³ãžãã¢ç®ç·ã«ãããšã³ãžãã¢ç°å¢ã«ã€ããŠå
éšè©äŸ¡ ããŠã¿ãŸãã ãã®èšäºãæžãããšæã£ãçç± è»¢è·æŽ»åãçµéšãã人ã¯åãããšæããŸããã ããã³ãã®ãšããããèŠãã«ããäŒç€Ÿãå€ã ã§ãã åéèŠé
ã®ã¿ã§ãã以å€ã®æè¡ããã°ãæ¥åå
容ãèŠããªãã£ãããšãæ
å ±ã«é®®åºŠããªã ãã£ãšç¥ãããããã©ãä»ã«ãèŠãäŒæ¥ã¯å€ããã諊ãããåŸãªã ãšãã£ãçµéšã¯å€ããšæããŸãã ãæ³šæãåäººã®æèŠã§ã ãªã äžå人ãšããŠç¬æãšåèŠã®æ··ãã£ãè©äŸ¡ ãšãªããŸãã äŒç€ŸãšããŠã®æ£åŒã§ã¯ãããŸããã è¯ãç¹ æä»£å
åãïŒïŒ æç€Ÿã¯ãã€ããªããã¯ãŒã¯ ã³ãŒãã£ã³ã°ã«éäžã§ãã Slack(ããã¹ãã³ãã¥)ã®æ¬ ç¹ãoVice(é³å£°ã³ãã¥)ã§è£ã£ãŠãã ããŒã å
ã®åé¡è§£æ±ºã«æ¬æ°ã§åãçµãã§ãã ãŠãŒã¶ãŒãã¡ãŒã¹ããåœããåïŒ ãµãŒãã¹ã«å¯ŸããŠã¿ããªæèŠã§ããé°å²æ° å€ã ãšæãããå€ã ãšèšã£ãŠãå¥ã£æªãªç®ã§èŠãããªã äžããã®èšããªãã§ã¯ãªããããŒã ã®æ¹éãèªåãã¡ã§è©±ãåãææ¡ã§ãã 瀟é·ãè¶
話ãèããŠããã æç€Ÿã¯ãã€ããªããã¯ãŒã¯ã«ãã£ã¬ã³ãž ç§å人ã¯ãªã¢ãŒãã¯ãŒã¯æŽã¯5幎ç®ã«ãªãããªã¢ãŒãã¯ãŒã¯ã®å©ç¹ã𿬠ç¹ãå³ãã£ãŠããŸããã ããžã¯ã©ã§ã¯å
ã
ã¯ãªãã£ã¹ã¯ãŒã¯äžå¿ã§ããããçŽ2幎ã»ã©åã«ãªã¢ãŒãã¯ãŒã¯ã«åãæ¿ããŸããããã®åŸãªãã£ã¹ã¯ãŒã¯ã®å©ç¹ãåãå
¥ããããã€ããªããã¯ãŒã¯ãç®æããŠåãæ¹ãæ¹åãç¶ç¶ããŠããŸãã ãªãã£ã¹ã§ä»äºããã人ã¯åºç€Ÿããããã§ãªã人ã¯èªå®
ãè¿ãã® ããã ãªã©ã§ãªã¢ãŒãã¯ãŒã¯ãéžæã§ããããã«ãªã£ãŠããŸãã ç§èªèº«ã¯ä»å·çæç¹ã§æ°åã³ããïŒãªãã¯ãã³ïŒãæµè¡ã£ãŠãã®ã§9å²è¿ãèªå®
äœæ¥ã§ãã æè¿ã§ã¯åããŠãããªãã£ã¹ãåŒãæããæå®ã®1ææ¥ã ãåããããªãã£ã¹ã«ç§»ããŸããã ãã¡ããæµè¡ãã ããã§ã¯ãªããã³ã¹ãé¢ãèããçµæãšãªããŸãã ã³ãŒãã£ã³ã°ã«éäžã§ãã ããžã¯ã©ã¯ä»ç€Ÿãšæ¯ã¹ããšããããäŒè°äœã®å°ãªãäŒç€Ÿã§ãã 1ã¹ããªã³ã2é±éã®ã¿ã€ã ããã¯ã¹ã®äžã§ç§ãåå ããŠããå®äŸãšåŒã¹ãäŒè°äœã¯ åèš7.5æé ã«ãªããŸãã ç§å人ã§ã¯ããã«å°ãªãè·å Žã§å¥å
šã«åã£ãŠãçµéšãããã®ã§ãŸã æ¹åäœå°ã¯ãããŸãããããã§ã倧æã瞊å²ãçµç¹ããèŠããšå°ãªãæ¹ãããããŸããã Slack(ããã¹ãã³ãã¥)ã®æ¬ ç¹ãoVice(é³å£°ã³ãã¥)ã§è£ã£ãŠãã ãªã¢ãŒãã¯ãŒã¯ã«ãšã£ãŠSlackãªã©ããã¹ãã³ãã¥ã¯å¿
é ãã€éèŠç°å¢ã§ãã ããããªããã ããã¹ãã³ã㥠ã¯äººã«ãã£ãŠ åŸæïŒäžåŸæ ããããå¿
ããã æé©è§£ã§ã¯ãããŸããã ããã¹ãã«æžãèµ·ãããïŒèªåã§æ
å ±ãæŽçã»æ§ç¯ã§ããŠããç¶æ
ã§ããã ãã以å€ã®äŸãã° äœããªãã ãåãããç¶æ
å®çµããã«ã¯äžè¶³ç¹ãå€ãç¶æ
æ
å ±ãããæ
ç·ã»ææ
ã»ç±éãäŒãããç¶æ
ãªã©ã¯é³å£°ã³ãã¥ãçŽæ¥è©±ãããšã§æ
å ±éœéœ¬ã¯èµ·ãã«ãã广çã«ã³ãã¥ãã±ãŒã·ã§ã³ã§ããŸãã ããžã¯ã©ã§ã¯Slackã«å ããŠoViceã䜿ã£ãŠãããããããäžæã«æŽ»çšããŠããŸãã äŒè°äœã§ã¯meetãzoomã䜿ã£ãŠããŸãã ãŸãoViceã«æããä»ã«ãé¡äŒŒããŒã«ã§è¯ããããªãã®ãããã°ããšãããã詊ããŠã¿ããå§¿å¢ãšããã蚱容ãããã€ã³ããããã æè¿ã ãšææ«ã®TGIFã§ã¯ SpatialChat ã䜿ã£ãŠããããŸãã ãããã£ã ææŠããæåãæŽã£ãŠããã®ã¯æé·ä¿é²ããè¯ãå§¿å¢ ã ãšæããŸãã ããŒã å
ã®åé¡è§£æ±ºã«æ¬æ°ã§åãçµãã§ãã ç§ãå
¥ç€ŸããŠãã€ã³ãå
±æãšããæ¹ãææ¡ããçµç·¯ããããŸããã äžèŠãªäŒè°äœãæžãããŠããäžæ¹ã§ã ããŒã ãæ±ããŠããåé¡ãæ·±å ãããæéã2é±éã«1å2æéå 䜿ãåé¡ã®æ·±å ããšè§£æ±ºçãåºããŠãã£ãŠããŸãã ããã«ãã åé¡ã«åãåãç¶ããåãçµã¿ãç¶æã§ããŠãã ã®ã§äŒæ¥æé·ããŠåé¡ãå€ãã£ãŠããåæ§ã«è§£æ±ºããŠãããèªå·±çµç¹åããã 匷ãããŒã ã«ãªã ãšæã£ãŠããŸãã ãŠãŒã¶ãŒãã¡ãŒã¹ããåœããåïŒ äŒæ¥ã§ãã以äžå©ç远æ±ã¯çŸ©åã ãšæããŸãã ããããªããå©çã«ã¯å¯ŸäŸ¡ãæã£ãŠãè¯ããšæã£ãŠããããŠãŒã¶ãååšããããšã§æãç«ã¡ãŸãã ããžã¯ã©ã®ãããã¯ãéçºã§ã¯ ãŠãŒã¶ãŒã®æèŠã軜èŠããããŠãŒã¶ãŒç®ç·ã®æèŠãåºããŠãåä»è
æ±ãããªã ããšã¯ãåžžã«ãã¡ã³ãç²åŸãç¶ããè¯ãå§¿å¢ã ãšè©äŸ¡ã§ããŸãã ãŸããšã³ãžãã¢ã§ãåžæè
㯠ãŠãŒã¶ãŒã®å庫ãžèšªå ãã§ããçŸå Žã®ãªãã¬ãŒã·ã§ã³ãæããŠããã£ããã æ±ããŠã課é¡ãèŠæ©ã»èŠçãæããŠãããã ããšã§ ãŠãŒã¶ãŒã®æ°æã¡ãçè§£ãããã ç¹ã¯ãŠãŒã¶ãŒç®ç·ã倧äºã«ããŠããè¡åã ãšæããŸãã 蚪åæã¯äžäººãšã³ãžãã¢ãåºåãã®ã§ã¯ãªããPMãCSãšäžç·ã«èšªåããåºæ¬çãªããåããæ
ã£ãŠãããŠãéšåçã«è³ªåã§ãããããã®ã§ã蚪åæ
£ããŠããªããšã³ãžãã¢ã§ãå®å¿ã§ãã ãµãŒãã¹ã«å¯ŸããŠã¿ããªæèŠã§ããé°å²æ° ãšã³ãžãã¢ã§ãæ¥åç¥èãèŠãã課é¡ãç¥ãã°æ¹åæ¡ãæãæµ®ãã³ãŸãã ããã倧æãªã©ã§ã¯è·çš®åèŠãªã©ã«ãããšã³ãžãã¢ã®ææ¡ã¯è»œèŠãããçµç¹ããããŸãã ããžã¯ã©ã¯ 誰ã§ãã£ãŠãææ¡ã§ãã é°å²æ°ãšãªã£ãŠããŸãã ãã¡ããææ¡ã®ããã«æ¡ãæŽçãããè«ç¹ããã£ãŠãããããžãã¯ãæŽã£ãŠãå¿
èŠã¯ãããŸãã å®éç§ãäœåãæ°æ©èœãæ¹åãææ¡ããŠããŸãããã¿ããªå¿«ã話ãèããŠãããŸãã ãšãã«ã¯ç§°è³ããŠãããã»ã©å¿å°ããé°å²æ°ãšãªã£ãŠããŸãã å€ã ãšæãããå€ã ãšèšã£ãŠãå¥ã£æªãªç®ã§èŠãããªã éå»çµéšããçµç¹ãšã¯éå¹çãªããæ¹ãããžã¯ã©ããã£ãŠããŠãäžæè°ãªããšã§ã¯ãããŸããã ãã®æã«å
šäœã«å¯Ÿã㊠ãåºæ¬çãªè³ªåã ã ãåæèŠãæ¬è³ªã€ãã質åãæèŠã ãæããããŠã¯ãããªãã¿ãããªæé»ã®äºè§£ã¯ãªãã ãããããžã¯ã©ã§ã¯æåã«è³ªåããããšã«æè¬ãããããšãããããŸãã äžããã®èšããªãã§ã¯ãªããããŒã ã®æ¹éãèªåãã¡ã§è©±ãåãææ¡ã§ãã çµç¹ã«ãã£ãŠã¯ãããŒãžã£ãŒãäžé·ã»çµå¶å±€ããã®æç€ºã絶察ãªäŒç€Ÿã¯åœç¶ãããŸãã çç±ãèããŠããäžãèšã£ãããããšè¿ã£ãŠããããçŽæ¥èããšããã©ãããããªé¡ãããããšã«èŸæããŠãã人ã¯ãããžã¯ã©ã¯è¯ããšæããŸãã ãªããªãäžãžçŽæ¥èãããšãåºæ¥ãã°ãåºãçµç¹æ¹éã èªåãã§è©±ãåãã©ãé²ããææ¡ ããããšãèš±ãããŠããŸãã åœç¶äžæ¹ãããã匷ããšãã£ãåãã§ã¯ãªããåæ¹ã®æèŠã亀æã§ããããšãåœããåãšãªã£ãŠããŸãã 瀟é·ãè¶
話ãèããŠããã äŒç€Ÿã«ãã£ãŠã¯ç€Ÿé·ãšè©±ãã«ã¯é²ã®äžã®ååšã§ã³ããå¿
èŠã ã£ããã人ã®è©±ãå
šãèããæè«ã°ãããæŒãä»ãã瀟é·ã ã£ãããšãé¢ããã ãç¡é§ãªç€Ÿé·ã¯æ®å¿µãªããååšããŸãã ããžã¯ã©ã®ç€Ÿé·ã§ã¯åŠçèµ·æ¥ã§å³ãå·Šãåãããªããªããã倱æãç¹°ãè¿ãä»ãŸã§ãããå®çžŸãããããã® ææŠããæåããããéèŠèŠ ããŠããŸãã ãŸã ãã®èŠæš¡ãªãã§ã¯ãããããŸãããããããããç¶ç¶ã§ãããããããŸãããã 瀟å¡ãå人ãšããŠç€Ÿé·ãšè©±ãæ©äŒãããã瀟é·ãåžžã«ãŠã§ã«ã«ã ã«ãªã£ãŠããã瀟å
ããã®æ
å ±ãåžžã«æ¬²ããŠããç¶æ
ã§ãã ããžã¯ã©ã«å¿
èŠãªæ¹è¯ç¹ äžæ¹ã§åœç¶ãªããè¯ãç¹ãšã¯èšãããæé·ãã£ã³ã¹ãé ãæã£ãæ¹è¯ç¹ããããŸãã è³æããŸã ãŸãšãŸã£ãŠããªã çºèšãã人ãåã£ãŠã ïŒå人çã«ïŒãŸã äžå¿
èŠãªäŒè°äœãå€ã æ
å ±ã®äº€éæŽçãéšçœ²æ¯ã§çšŒåããŠããªã è³æããŸã ãŸãšãŸã£ãŠããªã ã¹ã¿ãŒãã¢ããããããã§ãã åæã¹ã¿ãŒãã¢ããæã¯æ¬åœã«ãªãœãŒã¹ãè¶³ããªãããäŸ¡å€æäŸããé¢ããäœæ¥ã¯åªå
é äœãäžãããŸãã ããã¥ã¡ã³ããåãã§ãã ããããåŒç€Ÿã¯ãã®ãã§ã€ãºã¯æããšã³ãžãã¢ã®æ°ãåœåãããå以äžã«å¢ããŸããã ããã§ãåŸ
ã¡ããã®è³æäžè¶³ãšãªããŸãã ãã㯠ããªãè³æããªããã ïŒããšããææ
çãªãã®ã§ã¯ãªããã ã® ééå瀌 çãªãã® ã ãšæã£ãŠããŸãã éžæãšéäž ã«ãã ãã¬ãŒããªã ãããçµæã§ããããã®çµæãä»ãäŒç€Ÿãç¶ç¶ããŠãããšåãã£ãŠããããã§ãã ãã¡ãããå
šç¶ãªããã£ãŠããšã¯ãªãããæã¯ãã£ãããšæŽåãããè³æã¯ãããŸãã ãããã人ãå¢ããŠã¹ã±ãŒã«ã¢ããããããšã«å¯ŸããäŒéæ¹æ³ãå£é ã ã£ãéšåã«é¢ããŠã¯è³æäžè¶³ãåºãŠããŠããç¶æ
ã§ãã ããã«å¯ŸããŠåè¿°ããåé¡è§£æ±ºã«å
šåã®äŒè°ã§ãåé¡ãšãªã£ãŠããéšåæ¯ã«å¯Ÿå¿ãæœãåãã§è§£æ±ºãžé²ãã§ããŸãã çºèšãã人ãåã£ãŠã ããã¯åé¡ã倧ãã3ã€ãããšæã£ãŠããŸãã çºèšãäžæ
£ããªæ§æ Œã話é¡ãã€ããŠããã®ã§ç²Ÿäžæ¯ã®ããçºèšãåºæ¥ãªã人 話é¡ã«èå³ãèããçºèšåã«åããæããŠããããçºèšãããªã人 çºèšããããŠãäœããã®èŠå ã§çºèšã§ããªã人 ãããã¯åå ç¹å®ãŸã§ã¯åºæ¥ãŠããŸããããããŸã§çµéšããããä»®å®ã§ãã ãã2ãš3ãç¹ã«3ã§ããå Žåã¯è§£æ±ºå¿
é ã§ãã ããã¯åã
ã®åé¡ã§é£æåºŠãé«ãã§æéãããã£ãŠãŸãããã¡ã³ããŒã«äŸé ŒããŠå人æ¯ã«è©±ãèããŠããã£ãŠãŸãã¯ç¹å®ãããŠããæ®µéã§ãã ïŒå人çã«ïŒãŸã äžå¿
èŠãªäŒè°äœãå€ã ç§ãå
¥ç€ŸããŠãã€ã³ãå
±æãšåæã«äŒè°äœãæžãããçµç·¯ããããŸããã é¡ãåãããå¿
èŠããã åæçã§ãªããã°ãªããªã 察話æ§ã®é«ãè°è«ãšãªã äžèšã«åœãŠã¯ãŸããªããªãäŒè°äœã§ããå¿
èŠã¯ãªããšæã£ãŠããŸãã äŸãã°ãè°è«ãæèŠäº€æã¯ããããè³æãäŒè°äœã§èªãã ãã®å
±æçšåºŠã®äŒè°äœã¯éãŸãå¿
èŠã¯ãªããåèªéåæã«å
±æã確èªã質åã¯SlackãoViceçã§ããã°è¯ããšæã£ãŠãŸãã ãã®è³ªåã»è°è«ãé·åŒãã®ã§ããã°ãã㯠æ
å ±äžè¶³ ã 察話æ§äžè¶³ ã é¢ä¿è
äžè¶³ ãšããããšã§åŸæ¥ãããã解決ããããã ãã®äŒè°äœãéãã»ããäŒè°ã³ã¹ããæããããŸãã æææ±ºå®ã®ãªãäŒè°äœã¯æ£å³äœæ¥ã§ã¯ãªãä»åž¯äœæ¥ã§ããããã®æéãé·ãã»ã©ãŠãŒã¶ãŒãžã®äŸ¡å€æäŸæéãé
ããªããŸãã ããã«é¢ããŠã¯åŒãç¶ã圢骞åããŠãªãããªã© äŒè°äœã®å質åäžã«åªããŠããããã§ãã æ
å ±ã®äº€éæŽçãéšçœ²éã§å¥å
šãã€å®å®ããŠçšŒåããŠããªã ãœãããŠã§ã¢éçºããããã¯ãéçºããµãŒãã¹éçºãçµç¹éå¶ãšã©ã®ç²åºŠã§èŠãŠãæ
å ±ã¯æµãããã®ã§ãããåããåãããã°ããŒã (å€)ããããŒã (å€)ããããŸãã ãããã®æ
å ±ã®äžèº«ã¯ä»éšçœ²ãžã®è³ªåã»äŸé Œã§ãã£ãããå
±æã ã£ããããŸãã 質åã§ããã°FAQãå
±æäžè¶³ã®æ¹åã§è³ªåãæžãããã äŸé Œã§ããã°å®æçã«æ¥ããã®ã¯æ©èœåïŒèªååããµãŒãã¹åïŒã§äŸé Œãèªå·±å®çµïŒé«éåããã å
±æã§ããã°æé©ãªã¿ã€ãã³ã°ã§ãæäœéã®éã§ãå¿
èŠãšãã人ãžäŒéãç¶ããªããã°ãã€ãºæ··ããã®æ
å ±ã¯èŠãŠããããªããªããŸãã ãããŠãããã® æ
å ±ã®çºçæºã¯ãŠãŒã¶ãŒèµ·å ã ã£ãã圱é¿ãããã®ãå€ããæçµçã«ã¯ ãŠãŒã¶ãŒãžã®äŸ¡å€æäŸé床ãCXã«åœ±é¿ ããŸãã ãããã¯ãŸã ãŸã æ¹åäœå°ããããšæã£ãŠãããæéãäœã£ãŠçŸå°çŸç©ããããšã§äžç·ã«æ¹åããŠããããã§ãã ããŸãšããããžã¯ã©ã¯äžæ
£ããªãããé åŒµãææã¯åŒ·ããäºããå°æ¬ãããããšãåœããåã«ããŠããäŒç€Ÿ ã©ã¡ãããŸã ãŸã æžããé
ç®ã¯ãããŸãããéãå€ããªãã®ã§ãã®èŸºã§ãŸãšããŸãã è¯ãç¹ã¯ç¶ç¶ãã¹ããã€ã³ããè¡åã§ãããæ¹è¯ç¹ã¯çŽ çŽã«åãæ¢ãããããã©ããããèããæé·ãã€ã³ãã ãšèããŠããŸãã 以äžã1幎åããŠã¿ãŠåãã£ãããžã¯ã©ã®éçºäºæ
ã§ãã ããžã¯ã©ã«èå³ãæã£ãŠãæ¹ã«ãšã£ãŠå°ãã§ãã€ã¡ãŒãžã§ããæ
å ±ãšãªãã°ãšæããŸãã çµæ§ã¶ã£ã¡ãããå
容ã ãšæããŸãããããã®èšäºãæçš¿ãããã°ããããè¯ããšããäŒæ¥äœè³ªã ãšèšãããšã«ãªããŸãã æåŸã« ããžã¯ã©ã§ã¯äžç·ã«éçºããŠãããã¡ã³ããŒãåéããŠããŸãïŒ èå³ãããæ¹ã¯ãã² ãã¡ã ãã芧ãã ããïŒ
ããžã¯ã©ã§ãšã³ãžãã¢ãããŠãã髿¢šã§ãïŒ ååã®stagingDevç°å¢æ§ç¯ã«åŒãç¶ããDevOpsåšãã®æ¹åã玹ä»ããŸãïŒ æ®æ®µéçºãé²ããŠãããšãæ¬çªã®ããŒã¿ãå©çšããããšæãããšããããã£ããããŸãããïŒ äŸãã°ããžã¯ã©ã§ã¯ 顧客ããã®äžå
·ååãåããã®æ€èšŒ æ°æ©èœã®ä»æ§æ€èšŒ æ°æ©èœã®ããã©ãŒãã³ã¹æ€èšŒ ...etc ãªã©ãªã©ãè²ã
ãªã¿ã€ãã³ã°ã§æ¬çªããŒã¿ãå©çšããããšæãã¿ã€ãã³ã°ããããŸãã ãã ãæåã§ããããšãããšãæ¬çªç°å¢ã®ããŒã¿ããŒã¹åšããè§Šãããšã«ãªãã®ã§ã»ãã¥ãªãã£äžã®ãªã¹ã¯ã誀æäœã®ãªã¹ã¯ãããªãé«ãããªããªãæ°è»œã«ã§ããŸããã ããžã¯ã©ã§ã¯ãããã£ã課é¡ãã¯ãªã¢ãã誰ã§ãæ¬çªããŒã¿ãå©çšã§ãããããªä»çµã¿ãäœã£ãã®ã§ä»åã¯ãã¡ãã玹ä»ããŸãïŒ ä»çµã¿ã®æŠèŠ åé ã«ãã£ããããªãã»ãã¥ãªãã£äžã®ãªã¹ã¯ã誀æäœã®ãªã¹ã¯ãåé¿ããæè»œã«æ¬çªããŒã¿ãå©çšã§ããããã«ãããããéçºè
ãç°¡åãªã¢ã¯ã·ã§ã³ãããã ãã§æ¬çªããŒã¿ããã¹ãã³ã°ããããŒã¿ãå
¥ã£ãããŒã¿ããŒã¹ ( 瀟å
ã§ã¯ cloneDB ãšåŒãã§ããŸã) ãç«ã¡äžããstagingDevç°å¢ããããã確èªã§ããããã«ããããšããœãªã¥ãŒã·ã§ã³ãšããŸããã åŠçã®å®è¡ã«ã¯ããã€ãã®ããã« github actoins ãå©çšããŠããŸãã github actionsã§ã¯ä»¥äžã®ãã㪠ã¹ã¯ãªãã ãå©ããŠããŸãã DBã®è€è£œ #!/bin/sh export AWS_PAGER="" usage () { echo "Usage : $0 -c <CLONE_DB_CLUSTER_IDENTIFIER> -i <CLONE_DB_INSTANCE_IDENTIFIER> -P <MASTER_USER_PASSWORD>" ; } while getopts c:i:p : OPT do case $OPT in c) CLONE_DB_CLUSTER_IDENTIFIER=$OPTARG ;; i) CLONE_DB_INSTANCE_IDENTIFIER=$OPTARG ;; p) MASTER_USER_PASSWORD=$OPTARG ;; esac done if [ ! "$CLONE_DB_CLUSTER_IDENTIFIER" ] || [ ! "$CLONE_DB_INSTANCE_IDENTIFIER" ] || [ ! "$MASTER_USER_PASSWORD" ] then usage exit 1 fi DB_SUBNET_GROUP_NAME=logikura-xxx VPS_SECURITY_GROUP_ID=sg-xxx SOURCE_DB_CLUSTER_IDENTIFIER=logikura-xxx # DBClusterã®clone echo "cloning database..." aws rds restore-db-cluster-to-point-in-time \ --source-db-cluster-identifier $SOURCE_DB_CLUSTER_IDENTIFIER \ --db-cluster-identifier $CLONE_DB_CLUSTER_IDENTIFIER \ --restore-type copy-on-write \ --use-latest-restorable-time \ --db-subnet-group-name $DB_SUBNET_GROUP_NAME \ --vpc-security-group-ids $VPS_SECURITY_GROUP_ID ## DBClusterã«DBInstanceãäœæ echo "creating database instance..." aws rds create-db-instance \ --db-instance-identifier $CLONE_DB_INSTANCE_IDENTIFIER \ --db-cluster-identifier $CLONE_DB_CLUSTER_IDENTIFIER \ --db-instance-class db.t3.medium \ --engine aurora-postgresql aws rds wait db-instance-available --db-instance-identifier $CLONE_DB_INSTANCE_IDENTIFIER aws rds modify-db-cluster \ --db-cluster-identifier $CLONE_DB_CLUSTER_IDENTIFIER \ --master-user-password "${MASTER_USER_PASSWORD}" \ --apply-immediately ãã§ã«ããDBããªã¹ãã¢ããŠããŸããã³ãã³ãã®è©³çްã¯å
¬åŒã® ããã¥ã¡ã³ã ãã芧ãã ããïŒ ãã ããã®ãŸãŸã§ã¯æ¬çªã®ããŒã¿ããã®ãŸãŸå©çšã§ããŠããŸãã®ã§ã»ãã¥ã¢ã§ã¯ãããŸãããåé¡ã«å¯Ÿå¿ãããããé ããŠããããããŒã¿ããã¹ãã³ã°ããåŠçãå®è¡ããŠããŸãã ãã¹ãã³ã° #!/usr/bin/env ruby require 'optparse' require 'securerandom' clone_db_host = nil opt = OptionParser.new OptionParser.new do |opt| opt.on('--clone-db-host VALUE', 'clone db host name') { |v| clone_db_host = v } opt.parse(ARGV) end raise "required clone_db_host" if clone_db_host.blank? settings = YAML.load_file("config/settings/masking.yml") raise "saftiy" if Rails.env.production? raise "saftiy" unless clone_db_host.match(/clone/) ActiveRecord::Base.establish_connection( ActiveRecord::Base.connection_config.merge(host: clone_db_host, database: "logikura_production"), ) settings["tables"].each do |table_name, column_names| sql = "UPDATE #{table_name} SET" update_terms = column_names.map do |column_name| "#{column_name} = uuid_generate_v4()" end ActiveRecord::Base.connection.execute("UPDATE #{table_name} SET #{update_terms.join(', ')}") end ymlã«tableãšcolumnã®å®çŸ©ãè²·ããŠuuidã§åããŠãã·ã³ãã«ãªå®è£
ã§ãã 以äžãå®è¡ãããšãã§ãæ¬çªçžåœã®ããŒã¿ãå®å
šã«å©çšããããšãã§ããŸãïŒ æåŸã« github actionã§dbã®ãšã³ããã€ã³ããã³ã¡ã³ãããããã«ããŠããã®ã§ããã®ãšã³ããã€ã³ããå©çšããŠæ€èšŒãªã©ãé²ããŠããŸã ð ãšã³ãžãã¢ä»¥å€ã§ã®å©çš ååã®èšäº ã§æ€èšŒç°å¢( éç§°stagingDevç°å¢ )ãbranchããšã«æè»œã«äœãä»çµã¿ã玹ä»ãããŠé ããŸããããstaginDevã®ç«ã¡äžãåŠçã«ã¯ ç°å¢å€æ° ãèšå®ã§ããããã¯ãã€ã³ãããããŸãã test -f staging_dev.env && export $(cat staging_dev.env) if [ -e "./deploy/staging_dev_env/${STAGING_DEV_BRANCH}.env" ]; then export $(cat ./deploy/staging_dev_env/${STAGING_DEV_BRANCH}.env | grep -v ^# | xargs); fi ãããå©çšããŠã branch_name.env ã« DB_HOST=xxx ã®ããã«æžããŠãããšãç«ã¡äžããç°å¢ãæ¥ç¶ããDBãã¹ãã®å€ãoverrideããŠå€æŽããããšãã§ããŸãã æ€èšŒç°å¢ã§æè»œã«æ¬çªããŒã¿ãæ±ãããšãã§ããã®ã§ãéçºè
ã ãã§ã¯ãªãã«ã¹ã¿ããŒãµã¯ã»ã¹ã®ã¡ã³ããŒãã»ãŒã«ã¹ã®ã¡ã³ããŒãããã¹ãã³ã°ãããå®å
šãªããŒã¿ãåãåããã®å¯Ÿå¿ãæ©èœæ€èšŒã®éã«æ°æ¥œã«äœ¿ãããšãã§ããŸãïŒ ãŸãšã æ¬çªãšã»ãŒåãããŒã¿ããã€ã§ãå©çšã§ããããã«ããããšã§ãããæ£ç¢ºãªæ€èšŒãè¡ãããšãã§ãã顧客ãžã®å¯Ÿå¿ãæ©èœãªãªãŒã¹ã¹ããŒããæ¹åããŸãã ð ããŒã«ã«ãstagingã ãšã¬ã³ãŒãæ°ãå°ãªãã®ã§åžžã«é«éã«åããŠãæãã«ãªããŸãããå®éã«ã客ããã®ç°å¢ãåçŸããããšã§ ããã«ããã¯ ã«æ°ã¥ããããšããããŸãã ãŸããããžã¯ã©ã®éçºããŒã ã§ã¯é±ã«1床ããã©ãŒãã³ã¹æ¹åã®åãçµã¿ãããŒã ã§è¡ã£ãŠããã®ã§ããããã®éã®æ€èšŒç°å¢ãšããŠãæ¬çªç°å¢ã®ããŒã¿ãcloneããããŒã¿ããŒã¹ãæœçã®æ€èšŒã®ããã«åœ¹ç«ã£ãŠããŸãïŒ ã¹ã¿ãŒãã¢ããã®ãã§ãŒãºã§ã¯æ©èœéçºã«è¿œãããã¡ã§ããããã®ãããªåºç€ã®æ¹åãé²ããããšã§ããã«éçºã¹ããŒãããããŠãããããè¯ããµãŒãã¹ã®æäŸãé²ããŠãã£ãŠããŸã ð æåŸã« ããžã¯ã©ã§ã¯äžç·ã«éçºããŠãããã¡ã³ããŒãåéããŠããŸãïŒ ãã¹ãã³ã° ã¹ã¯ãªãã å®è¡ã«æéããããã®ã§ããã£ãšè¯ããœãªã¥ãŒã·ã§ã³ããæ¹ & ããžã¯ã©ã«èå³ããæ¹ã¯ãã² ãã¡ã ãã芧ãã ããïŒ
èªå·±çŽ¹ä» ããžã¯ã©ã§ãšã³ãžãã¢ãããŠãã髿¢šã§ãïŒ ååããžã¯ã©ã®ã€ã³ãã©æ§æãçŽ¹ä» ããã®ã«ç¶ããä»åãããžã¯ã©ã®éçºãæ¯ããŠããç°å¢åšãã«é¢ããŠããªãªãŒã¹ã¹ããŒããæ°åã«ããäŸã玹ä»ããŠãããŸãïŒ ä»¥åããžã¯ã©ã§ã¯ããŒã éçºãé²ããŠããäžã§ãæ©èœæ€èšŒãã¹ã¿ãã¯ããããšã«ãã£ãŠéçºã®ã¹ããŒããåæ»ãããšãã課é¡ãçºçããŠããŸããã å
·äœçãªåé¡ãšããŠã¯ãæ€èšŒç°å¢ãstagingããååšããŠããããè€æ°ã®æ©èœéçºãåæã«é²ãã§ããå Žåã«ãPMãªã©ã«ä»æ§ãæºãããŠããã確èªããŠãããé çªåŸ
ã¡ãçºçããããæçŽãããã£ãéã«å·»ãæ»ãã³ã¹ããããããªãªãŒã¹ãé
ãããšããããšããããŸãã çµæãšããŠã倧ããã®æ©èœãå
¥ã£ãŠãããšãªãªãŒã¹é »åºŠãé±ã«1床ã»ã©ã«ãªã£ãŠããŸãããšããããããŸããã ä»çµã¿ã®æŠèŠ äžèšã®åé¡ãè§£æ¶ããããã倿Žããæ©èœããšã«éçºè
以å€ãç°¡åã«æ€èšŒããããšãã§ãã stagingDev ãšããç°å¢ãçšæããããšããœãªã¥ãŒã·ã§ã³ãšããŸããã branchããšã« ãµããã¡ã€ã³ ã®å²ãæ¯ããšECSã®ã¿ã¹ã¯ãç«ã¡äžããä»ãŸã§éãstagingã®DBã«ã¢ã¯ã»ã¹ã§ããããã«ããŠç€Ÿå
ã¡ã³ããŒãªã誰ã§ãæ€èšŒã§ãããšãããã®ã§ãã åŠçã®å®è¡ã«ã¯ github actoins ãå©çšããŠããŸãã 以äžã«å®éã®èšå®ã貌ããŸãã name : StagingDeväœæå on : pull_request : types : [ opened, synchronize ] env : ... jobs : build : if : contains(github.event.pull_request.labels.*.name, 'StagingDev' ) runs-on : ubuntu-latest steps : - uses : actions/checkout@v2 - uses : kayac/ecspresso@v1 with : version : latest - name : Configure AWS credentials uses : aws-actions/configure-aws-credentials@v1 with : ... - name : Login to Amazon ECR id : login-ecr uses : aws-actions/amazon-ecr-login@v1 - name : Setup Environment run : ... # å¿
èŠãªç°å¢å€æ°ã®æºå - name : Build Image run : | ./deploy/docker_build.sh staging ${{ secrets.IMAGE_REPOSITORY_URI }} $BRANCH_NAME ${{ secrets.SIDEKIQ_CREDENTIAL }} $BRANCH_NAME docker push ${{ secrets.IMAGE_REPOSITORY_URI }}:$BRANCH_NAME - name : Setup if : env.SETUP_COMPLETED == 'false' run : | # priorityãéè€ãããšãšã©ãŒã«ãªãã®ã§æå€§å€ãååŸããŠéè€ããªãããã«ãã PRIORITY=$(aws elbv2 describe-rules --listener-arn ${arn} | jq -r '.Rules | map(select(.Priority == "default" | not) | .Priority | tonumber) | max + 1' ) # cloudformationã§ã¿ãŒã²ããã°ã«ãŒã, ãªã¹ããŒã«ãŒã«, ã¬ã³ãŒãã»ããã®äœæ aws cloudformation create-stack \ --stack-name $STACK_NAME \ --template-body file://$(pwd)/deploy/cloudformation/staging_dev.yml \ --parameters ParameterKey=BranchName,ParameterValue=$BRANCH_NAME ParameterKey=ListenerPriority,ParameterValue=$PRIORITY # å®äºãããŸã§åŸ
〠aws cloudformation wait stack-create-complete --stack-name $STACK_NAME TG_NAME=$STACK_NAME export TARGET_GROUP_ARN=$(aws elbv2 describe-target-groups --query "TargetGroups[?TargetGroupName == '$TG_NAME'] | [0]" | jq -r .TargetGroupArn) export BRANCH_NAME=$BRANCH_NAME export IMAGE_TAG=$BRANCH_NAME export ENTRY_POINT='"./deploy/init.sh"' # ECS Serviceã®äœæ ecspresso create --config ./deploy/ecs/logikura-web-staging-dev/logikura-web-staging-dev.yml ecspresso create --config ./deploy/ecs/logikura-worker-staging-dev/logikura-worker-staging-dev.yml - name : Deploy if : env.SETUP_COMPLETED == 'true' run : | TG_NAME=$STACK_NAME export TARGET_GROUP_ARN=$(aws elbv2 describe-target-groups --query "TargetGroups[?TargetGroupName == '$TG_NAME'] | [0]" | jq -r .TargetGroupArn) export BRANCH_NAME=$BRANCH_NAME export IMAGE_TAG=$BRANCH_NAME export ENTRY_POINT='"./deploy/init.sh"' ecspresso deploy --config ./deploy/ecs/logikura-web-staging-dev/logikura-web-staging-dev.yml ecspresso deploy --config ./deploy/ecs/logikura-worker-staging-dev/logikura-worker-staging-dev.yml - ... # issueãžã®ã³ã¡ã³ããslackéç¥åŠç äžèšã®åŠçã®æµããç°¡åã«èª¬æããŸãïŒ PRã« StagingDev ã©ãã«ã貌ãããã®PRã«å€æŽãããã·ã¥ããããšã«ãã£ãŠActionãããªã¬ 該åœãã©ã³ãã§å©çšãã ç°å¢å€æ° ãã»ãã 該åœãã©ã³ãã®ã€ã¡ãŒãžãçæ çšæããŠããcloudformationã®èšå®ãå©çšãããªãœãŒã¹ãæ§ç¯ Route53 LB (target groupã®èšå®ãªã©) ã¿ã¹ã¯ã®ããã〠å®äºãããurlãPRã«ã³ã¡ã³ã æåŸã«slackéç¥ãè¡ããŸãð ã¡ãªã¿ã«èšå®ã¯ç޹ä»ããŸããããPRãã¯ããŒãºãããšç°å¢ãæ¶ãããactionãçšæããŠãããç°å¢ãäœããã£ã±ãªãã«ãªãããšãå
容ã«ãªã£ãŠããŸã ð ãªãœãŒã¹ã®æ§ç¯ã«ã€ã㊠ãã£ãããšããç°å¢æ§ç¯ãŸã§ã®æµãã¯çè§£ããã ããããªãšæãã®ã§ãããããããã«stagingDevç°å¢ãå
·äœçã«ã©ãæ§ç¯ããŠããããèšèŒããŸãã ååã®èšäºã§ã玹ä»ããããã«ããžã¯ã©ã¯ AWS äžã§ECSãå©çšããŠéçšãããŠããŸãã å®éã«æ€èšŒã§ããç°å¢ãäœãããã«ã¯ãbranchããšã®å€æŽãdeployãããECSã®æ°ããã¿ã¹ã¯ã«å¯ŸããŠç¬èªã®urlããã¢ã¯ã»ã¹ã§ããããã«ãªãœãŒã¹ãäœããªããšãããŸããã CFã§TGãšRecordSetã®äœæ ãŸãèšå®ããèšèŒããŸãã AWSTemplateFormatVersion : "2010-09-09" Description : "" Parameters : BranchName : Type : String VpcId : Type : String Default : AlbArn : Type : String Default : Listener443Arn : Type : String Default : ListenerPriority : Type : Number Resources : TargetGroup : Type : AWS::ElasticLoadBalancingV2::TargetGroup Properties : HealthCheckIntervalSeconds : 10 HealthCheckPath : "/" Port : 80 Protocol : "HTTP" HealthCheckPort : "traffic-port" HealthCheckProtocol : "HTTP" HealthCheckTimeoutSeconds : 5 UnhealthyThresholdCount : 2 TargetType : "ip" Matcher : HttpCode : "200" HealthyThresholdCount : 5 VpcId : Fn::ImportValue : !Sub "${VPCStack}-VPC" Name : !Sub "logikura-tg-ecs-${Environment}" HealthCheckEnabled : true Name : !Sub "staging-dev-${BranchName}" Port : 443 Protocol : HTTP TargetType : ip VpcId : !Ref VpcId ListenerRule : Type : AWS::ElasticLoadBalancingV2::ListenerRule Properties : Actions : - Type : forward TargetGroupArn : !Ref TargetGroup Conditions : - Field : host-header HostHeaderConfig : Values : - !Sub "dev-${BranchName}.com" ListenerArn : !Ref Listener443Arn Priority : !Ref ListenerPriority RecordSet : Type : AWS::Route53::RecordSetGroup Properties : HostedZoneName : logikura.com. RecordSets : - Name : !Sub "dev-${BranchName}.com" Type : CNAME TTL : '60' ResourceRecords : - ***.elb.amazonaws.com awscliã§äœã£ãŠãè¯ãã®ã§ãããåé€ãç°¡åã«ã§ããããã«CFãæ¡çšããŠããŸãã terraformãå©çšããŠããäŒç€Ÿã§ã¯terraformã§æžãæããŠããã£ãŠãããããšæããŸãïŒ æçµçã«branchæ¯ã«å²ãæ¯ãããurlã«ã¢ã¯ã»ã¹ãããšã以äžã®ããã«branchæ¯ã®å€æŽãåæ ããããªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããŸãïŒ ãªãœãŒã¹ã®åé€ã«ã€ã㊠åé€ã¯CFã§äœã£ãŠãã®ã§ç°¡åã§ãã githubactionsã§PRãéããéã«ECSãšELBçããŸãšããŠæ¶ããŠãŸãã ecspresso delete --config ./deploy/ecs/logikura-web-staging-dev/logikura-web-staging-dev.yml --force ecspresso delete --config ./deploy/ecs/logikura-worker-staging-dev/logikura-worker-staging-dev.yml --force aws cloudformation delete-stack --stack-name $STACK_NAME aws cloudformation wait stack-delete-complete --stack-name $STACK_NAME äžã€æ³šæãšããŠã¯PRã®åé€ã®ãã³ã«å®è¡ãããšãšã©ãŒã«ãªãã®ã§ãstackãååšããããã§ãã¯ããå¿
èŠããããŸãã aws cloudformation describe-stacks --stack-name $STACK_NAME 泚æäºé
cloudformationã®stackNameã®å¶çŽã§ã [a-zA-Z][-a-zA-Z0-9] ã«branchåãéå®ããªããšãªãœãŒã¹ã®äœæã倱æããŠããŸããšããåé¡ããããŸãã branchåã®ã«ãŒã«ã決ãŸã£ãŠããã°åé¡ãªãã®ã§ãããŠè§£æ±ºããŠããŸãããããã åœå ã«ç°ãªãã«ãŒã«ãããããŒã ã®å Žåã¯æ³šæããŠãã ããïŒ ãŸãšã ãã©ã³ãããšã«éçºè
以å€ãåäœæ€èšŒã§ããç°å¢ãäœã£ãããšã§ãããããã®ç°å¢ã§ä»æ§ç¢ºèªãåæäžŠè¡ã§è¡ãããšãã§ãããªãªãŒã¹ãã¹ã¿ãã¯ããããšããªããªããŸãã ð çµæçã«éçºãããŠãŒã¶ãŒã«å©çšããŠããããŸã§ã®ã¹ããŒããæ°åæ©ããªãã顧客ãžã®æäŸã¹ããŒããäžãã£ãã ãã§ã¯ãªãã誰ã§ãèªç±ã«æ€èšŒã§ããç°å¢ãããããšã§äºåã®ç€Ÿå
åšç¥ãã¬ã€ãäœæãªã©äŒç€Ÿå
šäœãšãæ¥åã¹ããŒãããããããšã«ãæåããŸããïŒ ä»åŸãéçºãã¹ã±ãŒã«ããä»çµã¿ãäœã£ãŠãããããã«é¡§å®¢ãžäŸ¡å€ãå±ããããšãã§ããããã«ããŠããããã§ã ð æåŸã« 匷åŒã«ã·ã§ã«èžã§è§£æ±ºããŠãéšåãããã®ã§ããããã£ãšã¹ããŒãã«ããŠããããã®ã§ã ããžã¯ã©ã§ã¯äžç·ã«éçºããŠãããã¡ã³ããŒãåéããŠããŸãïŒ èå³ãããæ¹ã¯ãã² ãã¡ã ãã芧ãã ããïŒ
çŸç¶ã®ã€ã³ãã©æ§æãšã¯ãŒã«ãŒã®ãªãŒãã¹ã±ãŒã« ããžã¯ã©ã§ãã ã¯ãªãŒã ãããŠãã髿¢šã§ãïŒ ãµãŒãã¹ãå
Œ΋nj
¬éãããåããæè¡éžå®ã ã£ãããå®éã«ã³ãŒãæžããããã€ã³ãã©ãSREçãªããšãŸã§è²ã
ãã£ãŠãŸãã æè¿ã¯æç¬ãšéã¶ã®ã«ã¯ãŸã£ãŠãŸãã æŠèŠ ããžã¯ã©ã¯ä»å¹ŽãAzureãã AWS ãžãšã€ã³ãã©ã®ç§»è¡ãè¡ããŸãã ð åœåããžã¯ã©ã¯Azureãå©çšããŠããŸãããå©çšããŠããAppServiceã¯ååèŠä»¶ãæºããããšãã§ãã Microsoft ããããã®ãµããŒããæåãã£ãããšãäž»ãªçç±ã§å©çšããŠããã®ã§ãããäŒç€Ÿã®ãã§ãŒãºãé²ã¿ãä»åŸããã«äºæ¥æ¡å€§ãéçºçµç¹ã倧ããããããšèãããšãããªãã¡ã¬ã³ã¹ãå
å®ããŠãããçµéšè
ãå€ã AWS ã«ç§»è¡ããŠæ¡çšã«ã€ãªããããšãäž»ãªç®çã«ã€ã³ãã©ç§»è¡ã決å®ããŸããã ããã§ã¯çŸç¶ã®ããžã¯ã©ã®ã€ã³ãã©æ§æãšãç§»è¡æã«å·¥å€«ããç¹ãªã©ã玹ä»ããŠãããŸãïŒ ä»åç§»è¡ãããã®ã¯ã¡ã€ã³ãµãŒãã¹ã§ããåšåº«ç®¡çã® SaaS ã®ããžã¯ã©ã§ãã å¿
èŠãªä»çµã¿ãšããŠå€§ãŸãã«èª¬æãããšã ã¡ã€ã³ã®ãµãŒãã¹ãä¹ããŠãããµãŒããŒã»DB éåæåŠçãè¡ãããã®ãµãŒã㌠éåæåŠçãè¡ããããã¥ãŒã貯ããRedis ãšããã·ã³ãã«ãªæ§æã«ãªã£ãŠããŸãã 管çãã¹ã±ãŒã«ã®å®¹æãããä»åã¡ã€ã³ã®ãµãŒãã¹ãèŒãããµãŒããŒã«ã€ããŠã¯ãECSã»Fargateãå©çšããããšã«ããŸããã æ§æçŽ¹ä» èŒããããªãéšåãããã®ã§ããã倧ãŸããªæ§æãšããŠã¯ä»¥äžã®ãããªã·ã³ãã«ãªæ§æã«ãªã£ãŠããŸãã æ¬¡ã«ãã®æ§æãäœã£ãŠãã£ãäžã§ãç¹ã«å·¥å€«ããŠãã£ãç¹ã玹ä»ããŠãããŸãã ãããã€ã«ã€ã㊠ãããã€ã«é¢ããŠã¯ github actionãããªã¬ãŒã«ããŠããŸããstagingãšproductionã§ããªã¬ãŒã¯ç°ãªãã®ã§ãããdeployåŠçã«é¢ããŠã¯ä»¥äžã® github actionã®èšå®ãã¡ã€ã«(äžèŠãªéšåã¯ã«ããããŠããŸã)ã®ããã«ãbuildããimageãäžåºŠECRã«çœ®ãããã®imageãå©çšããŠdbã®migrationãè¡ã£ãåŸã«deployããæµããšãªããŸãã ... jobs : ... build_image : runs-on : ubuntu-latest steps : - uses : nelonoel/branch-name@v1.0.1 - name : Check out code id : checkout uses : actions/checkout@v2 - name : Configure AWS credentials uses : aws-actions/configure-aws-credentials@v1 with : aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region : ${{ secrets.AWS_REGION }} - name : Set environment id : set_environment run : {{ ç°å¢å€æ°ãèšå®ããåŠç }} - name : Login to Amazon ECR id : login-ecr uses : aws-actions/amazon-ecr-login@v1 - name : Build Image run : {{ deployããimageãbuild }} deploy : needs : [ build_image ] runs-on : ubuntu-latest env : IMAGE_TAG : ${{ needs.build_image.outputs.image_tag }} steps : - uses : kayac/ecspresso@v1 with : version : latest - name : Check out code id : checkout uses : actions/checkout@v2 - name : Configure AWS credentials uses : aws-actions/configure-aws-credentials@v1 with : aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region : ${{ secrets.AWS_REGION }} - name : Database Migration run : {{ DBã®migrateåŠç }} - name : Quiet Sidekiq Process run : {{ Sidekiqããã»ã¹ã®åæ¢ }} - name : deploy run : | ./deploy/ecs_deploy.sh -t web -e staging -i $IMAGE_TAG ./deploy/ecs_deploy.sh -t worker -e staging -i $IMAGE_TAG å®éã®dpeloyã«äœããŠã¯ã ã«ã€ã㯠補ã®ecspressoãå©çšããŠããã以äžã³ãã³ãã§ $SERVICE_NAME ããšã®èšå®(productionãstagingãªã©ãå
¥ããŠããŸã)ãèªã¿èŸŒãã§ããŸãã ecspresso deploy --config ./deploy/ecs/ ${SERVICE_NAME} / ${SERVICE_NAME} .yml --rollback-events DEPLOYMENT_FAILURE ecspresso wait --config ./deploy/ecs/ ${SERVICE_NAME} / ${SERVICE_NAME} .yml 詳ããã¯ecspressoã® ã¬ããžã㪠ãã芧ãã ããïŒ ã¿ã¹ã¯ã«é¢ããŠã github actionããå®è¡ãããã³ãã³ããšç°å¢ãæå®ããŠå®è¡ããããèšå®ããŠããŸãã 以äžãecspressoã§ã®å®è¡ã³ãã³ãã«ãªããŸãã ecspresso --config ./deploy/ecs/ ${SERVICE_NAME} / ${SERVICE_NAME} .yml run --overrides= " { \" containerOverrides \" :[{ \" name \" : \" logikura-ecs-container-web- ${APP_ENV} \" , \" command \" :[ \" ./deploy/run_command.sh ${COMMAND} \" ]}]} " æåŸã«deployãšã¿ã¹ã¯å®è¡ãšãã«ãå®äºãããšslackéç¥ãæµããŠããŸãã 以äžãåºæ¬çãªdeployåšãã®èšå®ãšãªããŸã! ãªãŒãã¹ã±ãŒã«ã«ã€ããŠ æ§æã®äžã§å·¥å€«ããç¹ãšããŠã¯ãworkerã®ãªãŒãã¹ã±ãŒã«ã®ä»çµã¿ãå°å
¥ããããšã§ãã ããžã¯ã©ã¯ãå©çšè
ã®æ§è³ªäžãäŸãã°ååç»é²ãåºè·ããŒã¿ã®ç»é²ãªã©ã倧éã®ããŒã¿ãäžåºŠã«åŠçããããšèšãèŠæãå€ããéåæåŠçãè¡ãããšãå¿
èŠã«ãªã£ãŠããŸãã ãã ãåŠçãéäžããå Žåjobãè©°ãŸã£ãŠããŸããšèšãããšãçºçãåŸãŸãã顧客ãå¢ããŠãã â å®å®çã«å
šãŠã®ã客ããã«ã·ã¹ãã ã䜿ã£ãŠãããããã«ãjobæ°ã«å¿ããŠãªãŒãã¹ã±ãŒã«ããä»çµã¿ãåãå
¥ããŠããŸãã credentials = Aws :: Credentials .new( ENV [ " AWS_ACCESS_KEY_ID " ], ENV [ " AWS_SECRET_KEY " ]) client = Aws :: CloudWatch :: Client .new( region : EMV [ " AWS_REGION " ], credentials : credentials) client.put_metric_data({ namespace : " SidekiqJobCount " , metric_data : [ { metric_name : " job_count " , dimensions : [ { name : " app_env " , value : ENV [ " RAILS_ENV " ], }, ], value : Sidekiq :: Stats .new.enqueued, unit : " Count " , }, ], }) èœã¡çãããã¹ã±ãŒã«ã€ã³ããããªããŸãããåŠçã®éäžã§èœãšããŠããŸããšèšèšã«ãã£ãŠã¯åé¡ãçããå ŽåãããããšæããŸãã https://github.com/mperham/sidekiq/wiki/Signals#tstp Sidekiqã¯TSTPã·ã°ãã«ãéããšæ°ãããžã§ãã®ååŸã忢ããåŠçãçµãããšåæ¢ããŸãã ãã®ä»çµãå©çšããŠãTERMãtrapããŠSidekiqãå®å
šã«åæ¢ããããã«ããŸããã function trap_term() { SIDEKIQ_PID = `ps -ef | grep -v grep | grep sidekiq | awk ' { print $2 } ' ` kill -TSTP $SIDEKIQ_PID while : do SIDEKIQ_STATUS = `ps axu | grep -v grep | grep sidekiq` echo $SIDEKIQ_STATUS if [[ $SIDEKIQ_STATUS =~ stopping ]] ; then echo " stopped sidekiq " exit else sleep 1 fi done } trap trap_term TERM ããã§è§£æ±ºããããã«æããã®ã§ãããåŠçã«æéã®ãããjobã®å ŽåstopTimeout(æå€§120ç§)ãè¶
ãããšKILLãããŠããŸãåé¡ãèµ·ãããŸããã stopTimeoutã¯Fargateç°å¢ã§ã¯çŸç¶ãã以äžäŒžã°ããªãã®ã§ãçµå±ã¹ã±ãŒã«ã€ã³ã¯ã§ããŠããŸããã äœãè¯ãæ¹æ³ããã°æããŠäžãã ð åè https://aws.amazon.com/jp/blogs/news/graceful-shutdowns-with-ecs/ https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html ãŸãšã toB ã®ãµãŒãã¹ã ãšåããããªèª²é¡ãæ±ããŠããäŒç€Ÿã¯å€ããšæããŸãããã²åèã«ããŠã¿ãŠãã ããïŒ ããžã¯ã©ã§ã¯ãã®ä»ã«ãã€ã³ãã©é¢ã§å·¥å€«ããŠããç¹ãããã€ãããã®ã§ããŸãå¥ã®èšäºã§ã玹ä»ããŠãããŸãïŒ æåŸã« ããžã¯ã©ã§ã¯äžç·ã«éçºããŠãããã¡ã³ããŒãåéããŠããŸãïŒ èå³ãããæ¹ã¯ãã² ãã¡ã ãã芧ãã ããïŒ
ããã«ã¡ã¯ïŒããžã¯ã©ã§ãããã¯ãããŒã ã®çµ±æ¬ãããŠããæŠéã§ãã åèšäºãªã®ã§ãŸãã¯äŒç€Ÿç޹ä»ãããã åãæå±ããŠããæ ªåŒäŒç€Ÿããžã¯ã©ã¯ Saas ã®åšåº«ç®¡çã¢ããªãããžã¯ã©ããæäŸããŠãããã¢ããæ±ãå
šãŠã®äŒæ¥ãæã€åšåº«åé¡ã®è§£æ±ºãéããŠãã客æ§ã®äºæ¥ã®åºç€ã»ã€ã³ãã©ãšãªãååšã«ãªãããã«äºæ¥ãå±éããŠããŸã!  äŒç€Ÿçµç¹ãšããŠã¯æ¡å€§äžã§ãåãå
¥ã£ãåœåã®æ°äººããããªãã£ãææãã仲éãå¢ããäŒç€Ÿããããªã£ãŠãããªãšãããµãã«æããŠãŸãç¬ ãããªããžã¯ã©ã§ãããå€éšã§æäŒã£ãŠããã ããŠããæ¹ãå«ãããšéçºããŒã ã¯çŸåš7åã§ãäž»ã«ããžã¯ã©ã® iOS ã¢ããªãšWEBã¢ããªãéçºããŠããŸã(åã¡ã³ããŒã®ç޹ä»ã¯ ãã¡ã )  éåžžãã®ãããã®èŠæš¡ã«ãªããšãããŒãžã£ãŒå±€ãäœã£ãŠçµç¹ãããžã¡ã³ãã®æºåãèããäŒç€Ÿãå€ããšæããŸãããããžã¯ã©ã®éçºããŒã ã§ã¯ãããŠãããžã¡ã³ãå±€ã眮ããªããšãã倿ãããŸããã ãã®èšäºã§ã¯ãã®èæ¯ãšéçšã«é¢ããŠç޹ä»ããŸãïŒ Â èæ¯ ãŸããããããããžã¡ã³ãããªãå¿
èŠãèããæãçç±ã®äžéšãæãããšä»¥äžã«ãªããŸã ããŒã ã®ç®æšãšæ¹åæ§æ±ºããå
šç€Ÿç®æšãšã®ããåãã ã¡ã³ããŒã®ç®¡ç ã¡ã³ããŒã®è©äŸ¡ ...ãªã©ãªã©(ä»ã«ããããããã)  ãããžã¡ã³ãè·ãæ
ã圹å²ã¯å€å²ã«æž¡ãããã®æ©èœã¯äŒç€ŸãåãããŠããäžã§ã©ããå¿
èŠã§ãã ãã ãæ©èœã¯å¿
èŠã ãšããŠããããå人ãæ
ãå¿
èŠã¯ããã§ããããã  äŒç€Ÿã®æé·ã® ããã«ãã㯠ã«ãªã ãããžã¡ã³ãå±€ãã€ãããã¡ãªãããšããŠãæææ±ºå®ããããŒãžã£ãŒã«éäžããŸãããã¡ããã¡ã³ããŒã«è£éæãããŠããŒã ãããŸãåãããããŒãžã£ãŒã§ããã°åé¡ãªãã§ãããå人ã®ã¹ãã«ã«äŸåããã®ã§ãæ§é çã«æææ±ºå®ã®éäžãèªçºããããã§ãã å
šãŠã®æææ±ºå®ã®ãã³ã«èš±å¯ãå¿
èŠã«ãªããšã倿°ã®æææ±ºå®ãè¡ããªããã°ãªããªãã¹ã¿ãŒãã¢ããã§ã¯ ããã«ãã㯠ã«ãªãããšããããŸãã Â äž»äœæ§ã®æå¶ æææ±ºå®ã®éäžã«ããã ãããŒãžã£ãŒåäººã§æ¹éãåããªããšåŽäžããã倿§ãªæèŠãåãå
¥ãã«ãããªã ã¡ã³ããŒãæææ±ºå®ã«é¢ããå Žãèšããããªã ãšãã£ãçŸè±¡ãèµ·ãããŸãã ãã®çµæãã¡ã³ããŒãããããæææ±ºå®ãé¢ãã㢠ã€ã㢠ãèããããè¡åãããããèµ·ãããããããŒãžã£ãŒããäžãããã圹å²ãããªãããšã«åæããäž»äœæ§ã®æå¶ãèµ·ããŠããŸããŸãã  æ¥åç°å¢ã®å€åã«ãããããžã¡ã³ããããã«é£ãããªã£ã ã³ããã®åœ±é¿ã§ããžã¯ã©ãå
šç€Ÿå¡ãã«ãªã¢ãŒãã«ãªããŸããã åãæ©ã¿ãæã£ãŠããäŒç€Ÿãå€ããšæããŸãããããããã®ã¡ã³ããŒãšã³ãã¥ãã±ãŒã·ã§ã³ããšã£ãããããã©ãŒãã³ã¹ã管çãããšããããšèªäœã以åããé£ãããªã£ãã®æããŠããŸãã ãã®ãããªç¶æ³äžã«ãããŠããããŠé£æåºŠã®é«ããããžã¡ã³ããããããã¯ãã¡ã³ããŒãããããããçš®ã»ã«ããããžã¡ã³ããã§ãããããªç°å¢ãäœã£ãŠããããšãéèŠã ãšèããŠããŸãã  çµç¹ã®æ¹éãæ±ºããããã£ãã å®éãã®ãããªæ¹éã«è»¢æã§ããã®ã¯ãããšããšããéçºã¡ã³ããŒãã»ã«ããããžã¡ã³ããè¡ããŠãããšããéšåã倧ããã§ãã äŒç€ŸãšããŠããããžã¯ã©ã§ã¯å
šç€Ÿã®æ°å€ãæ¹éãå
¬éã»èª¬æãããŠããã®ã§ãå
šå¡ãå
±éèªèãæã¡ããããäŒç€Ÿã®ç®æšéæã®ããã«å人ãããŒã ã§ã©ã®ãããªæææ±ºå®ãè¡ãã¹ããèããæ©äŒãå€ãæåããããŸããã æ¡çšæŽ»åã«ãããŠãã»ã«ããããžã¡ã³ãã®éšåã¯åŒ·èª¿ããŠãããå®é以åã®äŒç€Ÿã§ãããžã¡ã³ãè·ãè¡ã£ãŠããæ¹ãå
±æããŠå
¥ç€Ÿã決æããŠãã ãããªã©ãåæ§ã®èª²é¡æãæ±ããŠããéçºè
ã¯å€ãã®ãæããŠããŸãã  éçšäžã®åé¡ç¹ãšãã®è§£æ±ºç ãããŒãžã£ãŒãæ
ãã¯ãã®æ©èœã¯èª°ãããã®ïŒ ãŸãè©äŸ¡å¶åºŠæ§ç¯ãçµç¹ äºå管ç ãæè¡æ¯æŽãªã©ãããŒã ã§å¿
èŠã ãæ¬æ¥ãããžã£ãŒãæ
ããããªæ©èœãæŽãåºããããããã®æ©èœã«æ
åœè
ãèšå®ããŸããã ããããããšã§æææ±ºå®ã®ã¹ããŒããæ
ä¿ãã€ã€ãæææ±ºå®ã®æ©èœãå人ã«éäžããã®ãé²ãããšãã§ããŸãã ãã ãåæ©èœãæ¬åœã«å¿
èŠããããŸãã¯ãŒã¯ããŠãããªã©ã¯ç¢ºèªãå¿
èŠã§ãããŒã ãšããŠã¬ããã³ã¹ããŒãã£ã³ã°ãšãããã®ãèšå®ãã圹å²äº€ä»£ãå«ã宿çã«èŠçŽããã¯ãã£ãŠããŸãã ã¬ããã³ã¹ããŒãã£ã³ã°ãšã¯ 圹å²ãæ°ãã«ã€ãã£ãããä¿®æ£ãããããªããããããå¿
èŠããããšæããŠãã人ïŒãææ¡è
ããšåŒã°ããïŒã¯ãã ãã§ãè°é¡ã«èªåã®æ¡ãå ããããšãã§ããããã®ãããªããŒã ã®ã¬ããã³ã¹ã«é¢ããåé¡ãé ã«äžã€ãã€åãäžããããæ¬¡ã®ããã»ã¹ã«åŸã£ãŠæ¡æ±ºã«è³ãã ïŒææ¡ãçºè¡šããã ïŒåé¡ç¹ã®æç¢ºå ïŒåå¿ã©ãŠã³ã ïŒä¿®æ£ãšæç¢ºå ïŒç°è°ç³ãç«ãŠã©ãŠã³ã ïŒçµ±åã©ãŠã³ã *1 ã¿ããªå¹³çãšããããšïŒ éããŸããåã¡ã³ããŒãæ
ãæ©èœã®éã¿ãéãªã©ã¯ãã©ãã©ãªã®ã§ãè©äŸ¡ãããã«åãããŠå€ããŠããŸãã ãããŸã§äž»äœæ§ã®æå¶ãããªãããšãç®çãªã®ã§ãå
šå¡åçã®è©äŸ¡ããããšããããšã§ã¯ãããŸããã Â æææ±ºå®ãé
ããªãã®ã§ã¯ïŒÂ ãã®åãçµã¿ãã¡ã³ããŒã®æš©éãå®å
šã«å¹³çã«ããããšã ãšæãããšæææ±ºå®ã®ãã³ã«å
šå¡ã®æ¿èªãå¿
èŠãªã®ã§ã¯ãªãããšããçºæ³ã«ãªããæææ±ºå®ã®ã¹ããŒããäžãããšæãããæ¹ããããšæããŸãã ãã ããããŸã§æææ±ºå®ã¯åæ©èœã®æ
åœè
ãè¡ããå¿
èŠãªã®ã¯é¢ä¿è
ã«å¯Ÿããäºåã®å
±æãšçžè«ã®ã¿ã§ãã çŸç¶ã¯äººæ°ãå°ãªããéçºããŒã ã«é¢ããæ±ºå®ã¯ãã€ãªãŒ ã¹ã¯ã©ã ãªã©ã§å
šäœã«å
±æã§ããã®ã§ãããèŠæš¡ã倧ãããªã£ãå Žå㯠ãã£ãŒ ã«çµç¹ã«ããå©èšããã»ã¹ãå°å
¥ããããšèšç»äžã§ãã(å©èšããã»ã¹ã«ã€ããŠã¯è©³ãã説æããŸãããã ãã£ãŒ ã«çµç¹ãã²èªãã§ã¿ãŠãã ããïŒ)  ä»åŸãèªå·±æé·ãç¶ç¶ 以äžãä»ããžã¯ã©ã®éçºããŒã ã§è¡ã£ãŠããåãçµã¿ã§ãã ããŒã ã®èŠæš¡ã«ãã£ãŠåé¡ãå€ãã£ãŠãããšæããŸãããä»åŸããŸããã£ãã»ãããªãã£ãããšãéæå
¬éããŠãããã°ãšæã£ãŠãŸãïŒ Â æåŸã«ãã ããžã¯ã©ã§ã¯äžç·ã«éçºãçµç¹ã¥ããæäŒã£ãŠããã人ãåéããŠãŸãïŒ ãã²ã«ãžã¥ã¢ã«ã«çµç¹ã»æè¡ã®ããšã話ããŸããã! => å¿å㯠ãã¡ã  *1 : åŒçš: ãã¬ããªã㯠ã»ã©ã«ãŒ  ãã£ãŒ ã«çµç¹ - ãããžã¡ã³ãã®åžžèãèŠã次äžä»£åçµç¹ã®åºçŸ