ãã®èšäºã¯BASE Advent Calendar 2020ã®7æ¥ç®ã®èšäºã§ãã devblog.thebase.in ããã«ã¡ã¯ãBASEã®Corporate Engineering CSEã°ã«ãŒãã®å°æã§ãã æšå¹ŽãŸã§ã¯Product Devã®Shopã°ã«ãŒãã«æå±ããInstagram販売 Appã顧客管ç Appãã¡ãŒã«ãã¬ãžã³ Appãæã«ã¯Androidã¢ããªã®éçºãŸã§ãå¹
åºããBASEãã®æ©èœéçºã«æºãã£ãŠãããŸããã ä»ãŸã§ã®éçºçµéšãããšã«ãæ°èšãããã°ã«ãŒãã«ç°åããŸããã®ã§ãã©ã®ãããªã°ã«ãŒããªã®ãã玹ä»ãããŠããã ããŸãã CSEãšã¯ Corporate Solutions Engineering (ç¥CSE) ãBASEãã®ã·ã§ããéèšã¯120äžåºèãçªç Žããç»é²ãããååæ°ãååŒé¡ãå¢ããäžã瀟å
æ¥åã®å¹çåãšè²¡åã®ä¿¡é Œæ§æ
ä¿ããããšãå°éãšããããŒã ãšããŠã1幎ã»ã©åã«Product Devã®Corporate Engineeringã«CSEã°ã«ãŒããçºè¶³ããŸããã ããã·ã§ã³ ã³ãŒãã¬ãŒããšã³ãžãã¢ã®ããã·ã§ã³ã¯ãã·ã§ãããªãŒããŒã«å®å¿ããŠãµãŒãã¹ã䜿ãç¶ããŠããã ãããã«ãæ¥åã®æå¹æ§åã³å¹çæ§ã»è²¡åå ±åã®ä¿¡é Œæ§ã»äºæ¥æŽ»åã«é¢ããæ³ä»€ãªã©ã®éµå®äžŠã³ã«è³ç£ã®ä¿å
šãšãã£ãå
éšçµ±å¶ã®ç°å¢æŽåãšãDX(Developer ExperienceïŒéçºè
äœéš)ã®äž¡ç«ãèãç¶ããæ¹åãç¶ããŠããããšã§ãã äžèšã®ããã·ã§ã³ã§ãç§ã奜ããªã®ã¯ ã ã·ã§ãããªãŒããŒã«å®å¿ããŠãµãŒãã¹ã䜿ãç¶ããŠããã ããã ãããã倧äºã«ããŠããäºã§ãã 瀟å
ã§ã¯ãããããããã®æ¥åãæ¥ã
çºçããŠããŸãããã®äžã«ã¯å±äººåããŠããæ¥åãªã©ããé©åã«äœæ¥åæ
ã»èªååãªã©ã§ããã°ãçŽ æ©ã察å¿ãã§ããããã«ãªããçµæçã«ã·ã§ãããªãŒããŒã®ããã«ãªããŸãã ããã·ã§ã³éæã®ããã«ã倧ãã2ã€ã®æ¥åããã 瀟å
æ¥åæ¹å ãµãŒãã¹æé·ã«äŒŽããå¢ãç¶ãã瀟å
æ¥åãèŠçŽãããµãŒãã¹ãå®å®çã«æäŸããããã®æ¥åæ¹å 瀟å
ã§å©çšããŠãã管çç»é¢ã®éçºãéè¡ãå€éšã®äŒèšãµãŒãã¹ãšã®é£æºããäœæ¥ã®å¹çå å±äººåããŠããäœæ¥ãé©åã«åæ
ã§ããããã«ãã·ã¹ãã ã®æ¹å å
éšçµ±å¶ã®æŽå ã·ã§ãããBASEãååŒå
äŒæ¥ãæ ªäž»ã®è³ç£ãå®ãããã«ãäžæ£ãããããªãããä»çµã¿ãæŽåïŒã«ãŒã«ã¥ãã æ¥åãé©åãªæ¿èªã»é©åãªéšéã§æ¥åãéè¡ããããããæ¥åã®ããã»ã¹ãæŽçãäœç³»åãã 以äžã¯èª€ã£ãèªèãCSEã¯ãããããç®çã®ããŒã ã§ã¯ãªã æ°ããã§ããããŒã ã ã£ããã瀟å
ã§ãCSEã®æå³ãäŒããããCSEã¯äœãããããŒã ãªã®ãææ§ã§ãä»ã®ããŒã ã®äººã«æ£ããçè§£ããŠããããã«ããŸãããç®çãšããã·ã§ã³ãæ£ããç¥ã£ãŠãããããã«ãééã£ãèªèäŸããããŠå®çŸ©ãããŸããã以äžã®å
容ã¯ãã©ããæ·±ãCSEã®æ¥åã«æ·±ãä¿ãå
容ã§ããããããç®çã®ããŒã ã§ã¯ãªããšããäºã§ãã 瀟å
çšã®ç®¡çç»é¢ã®éçºãããããŒã æ¥åæ¹åã§ç€Ÿå
ã®ç®¡çç»é¢ã®éçºãèµ·ç¹ãšãªãäºã¯ããããéçºæ
åœã§ã¯ãããŸããããBASEãã«æ°ããæ©èœããªãªãŒã¹ããã瀟å
ã®ç®¡çç»é¢ã«ãéçºãå¿
èŠããã°ãæ©èœéçºããããããžã§ã¯ãã¡ã³ããŒã§ç€Ÿå
ããŒã«ãå®è£
ããŸãã ITå
šè¬çµ±å¶ã«å¿
èŠãªéçºãããããŒã ITå
šè¬çµ±å¶ã§æŽåãå¿
èŠãªé
ç®ã¯ãå
éšçµ±å¶ã«é¢ããã¡ã³ããŒã§è°è«ããçµ±å¶ãå¿
èŠã«ãªãé
ç®ã¯åºããŠãããŸãããããæŽåé
ç®ã¯éçºã ãã§ãªãããããã¯ãŒã¯ãDBãªã©å€å²ã«ããããããå¿
èŠãªéçºãªã©ã¯ä»ã®ããŒã ãªã©ã«ãé¡ãããŠããŸãããã¡ãããå
šãå®è£
ããªãæ¹éã§ã¯ãããŸããã æ±ºæžã»å£²äžã«é¢ããéçºãããããŒã CSEãšããŠçµçéšéãªã©ãšé£æºããäºãå€ããã·ã§ããã®å£²äžåšãããŒã¿ãåžžã«æèããŠããŸããçµçéšéãšã®ããŒã¿é£æºãçªãåããäœæ¥ã®ããéçºã¯ããŸãããæ±ºæžåšãã®å®è£
ãæ
åœããäºã¯ã»ãŒãããŸããã å
éšçµ±å¶ã®ç®çã§ãäžæ£ãã§ããªããããªéçºïŒæŽåïŒã¯ãããããBASEãã®æ°èŠæ©èœãªã©ã®éçºã®èšèšãªã©ã«ã¯é¢ããäºã¯ãã»ãŒãããŸããã ãBASEãã®æ©èœéçºã ããªã ããŒã å®ã¯ãããéããŸããæ¥åæ¹åã®äžç°ã§ããBASEãã«ã¡ãã£ãšããæ©èœã远å ããã°ã解決ããé
ç®ãå€ããããŸããä»å¹Žã®11æã«ã¯ãã¡ã³ããŒã®1人ã売äžããŒã¿ããŠã³ããŒã Appãšããæ©èœã®éçºã«æºãã£ãŠããŸããã éçºèšèšã»å®è£
ã¯å¥ã®ããŒã ã«ãé¡ããã圢ãšãªããŸãããã売äžã«ã€ããŠã®ç¥èãã·ã§ãããªãŒããŒã®ããŒãºãªã©ãæ·±ãçè§£ã§ããŠããããããããBASEãã®æ©èœéçºã«é¢ãã£ãŠãããè¯ãäŸã§ããã ã©ã®ãããªæ¥åããã£ãŠããã CSEã¯ãå®éã«ã©ã®ãããªæ¥åãè¡ãªã£ãŠããã®ããããå°ã詳ãã説æããããšæããŸãã 瀟å
æ¥åæ¹å 瀟å
ã§å€ãã®äœæ¥ãæ¯æ¥çºçããŠããŸãããèª²é¡æããã£ãŠè©³ããèŠãŠã¿ããšã倧äœãã®ãã¿ãŒã³ã«åé¡ã§ããŸãã äœæ¥ã®å±äººåã§ãã¹ã±ãŒã«ããŠãªãæ¥å ã·ã¹ãã èµ·å ã§ãã¹ã±ãŒã«ããŠãªãæ¥å 察å¿ã§ããŠããããèªååã§ããæ¥å æ¿èªããã»ã¹ãªã©ã§ãäœæ¥å¹çãæªããªãæ¥å äœæ¥ã®å±äººåã§ãã¹ã±ãŒã«ããŠãªãæ¥å 1ã€ã®æ¥åã§ããè€æ°ã®ã·ã¹ãã ã§æäœãããå¿
èŠããããªããæ¡ä»¶ã«ãã£ãŠæäœãéããªã©å Žåãªã©ãå±äººåããŠãã£ãŠããŸããŸãã ãŸãã1æ¥ã§äœæ¥ãå®äºããªãã¿ã¹ã¯ãªã©ããã©ããŸã§äœæ¥ããã®ãããšã¯ã»ã«ã§ç®¡çããŠããŸããªã©ãããããããšæããŸãã è§£æ±ºæ¹æ³ãšããŠã¯ã1ã€ã®ã¿ã¹ã¯ãšããŠæ£ããå®çŸ©ãããŠããããªããŠã¯ãªããªãäœæ¥ãããŒãæ§ç¯ããŠãããŸãããã¹ãªãäœæ¥ãå®äºã§ããããã瀟å
ã®ç®¡çç»é¢ãŸãã¯å€éšã®ã·ã¹ãã ãšã®é£æºã§ã誰ã§ãäœæ¥ã§ããããã«èšèšã»æ§ç¯ããŠãããŸãã ã·ã¹ãã èµ·å ã§ãã¹ã±ãŒã«ããŠãªãæ¥å è€æ°äººã§ã®äœæ¥åæ
ãèæ
®ããŠããªã管çç»é¢ã®èŠå ã§ãåæ
ã§ããªãæ¥åãªã©ããããŸãã 管çç»é¢ã«ãã¿ã¹ã¯äžèЧãªã©ããŒãžãããã®ã§ããã1人ã§äœæ¥ããŠããå Žåã¯äžããé ã«äœæ¥ã§åé¡ãªãã£ãã®ã§ããã2人ã§äœæ¥åæ
ã«ããããšãããšé£ãããªã£ãŠãããŸããäžããäœæ¥ãã人ãšäžããäœæ¥ãã人ã«åãããŠäœæ¥ãããªã©å·¥å€«ããŠéçšããŠããŸããã åæã«åãã¿ã¹ã¯ããããªã©ã®äœæ¥ãã¹ãçºçãããããããã·ã¹ãã åŽã§é©åã«äœæ¥ãåããŠããå¿
èŠããããŸãã 察å¿ã§ããŠããããèªååã§ããæ¥å ã·ã¹ãã ã§ã®éçšãã§ããŠããããèªååãã§ããŠãªãæ¥åããŸãã¯ãæ©æ¢°åŠç¿ãªã©ãå©çšããããšã§æ¥åã®è² æ
ãæžããããšãã§ããŸãã 瀟å
ã®æ¥åããã€ãªã³ã°ããŠãããšèªååã§ããŠããããæäœæ¥ã«ãã£ãŠå¯Ÿå¿ããŠããå
容ãå€ãããããšã«æ°ã¥ããŸãããBASEãã®éçºããŠãããšã³ãžãã¢ã¯ããBASEãã®ã·ã¹ãã ã«ã€ããŠã¯ãšãŠã詳ããã®ã§ããã瀟å
ã§å©çšããŠããæ¥åããŒã«ã»å€éšã·ã¹ãã ã®çè§£ãæµ
ããããæ¥åããŒã«ã®é£æºã匱ããçµæçã«æäœæ¥ãçºçããŠããŸãã æ¯æ¥éèšãããã·ã§ãããç»é²ãããååãæ¯ã蟌ã¿ç³è«ãªã©å€ãã®æ
å ±ãããæ©æ¢°åŠç¿ã§èªååã«è²¢ç®ã§ããæ¥åããããData StrategyããŒã ãšååãèªååãããŠãããŸãã æ¿èªããã»ã¹ãªã©ã§ãäœæ¥å¹çãæªããªãæ¥å äžäººã§å®çµã§ããªãæ¥åãªã©ã¯ãä»éšçœ²ã»äžé·ãžäœæ¥ãäŸé ŒããŸãã¯çšè°ãäžé·ã®æ¿èªããã»ã¹ãåŸãªããšå®æœã§ããªãæ¥åãªã©ã人ãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãå¿
èŠãªæ¥åã§ããäžèšã®é
ç®ãªã©ãéèŠã«ãªã£ãŠããŸãã æ¿èªããã»ã¹ãäœæ¥äŸé Œã®ãããã¯ãŒã¯ãããŒããŒã«ã®å°å
¥ å·®ãæ»ãåå ãšãªãå
¥åäžåãããªããã管çç»é¢ã®æ¹ä¿® Slackéç¥ãªã©ãå©çšããŠãã³ãã¥ãã±ãŒã·ã§ã³ãã¹ãæžãã å
éšçµ±å¶ã®æŽå BASEæ ªåŒäŒç€Ÿã¯ã2019幎10æ25æ¥ã«æ±èšŒãã¶ãŒãºã«äžå ŽããŸããããäžå ŽäŒæ¥ã¯ãããããJ-SOXæ³ã®éµå®ãæ±ããããŸãããã®ããã2021幎床æ«ãŸã§ã«ITçµ±å¶ãšããŠäžååãªé
ç®ã®æ¯æ£ã»å¿
èŠæžé¡ã®äœæãªã©ãå¿
èŠãšãªã£ãŠããŸãã CSEã¡ã³ããŒã«ã¯ãITçµ±å¶ãå
éšçµ±å¶ã«ã€ããŠæ·±ãçè§£ããŠããã¡ã³ããŒãããªãã£ãããããããžã§ã¯ããéå§ããåã«ã¡ã³ããŒå
šå¡ã§ITçµ±å¶ã«ã€ããŠã®èªæžäŒã宿œããŸããã Amazon: ITãšã³ãžãã¢ã®ããã®å
éšçµ±å¶å¯Ÿå¿ããã¥ã¢ã« é±1åã®èªæžäŒãéããŠãITçµ±å¶ã®èŠç¹ãçšèªãæžé¡ãªã©ã¯çè§£ããäºãã§ããããã«ãªããŸãããããããITçµ±å¶ã«ã€ããŠæžãããŠããæ¬ã®å€ãããJ-SOXãæœè¡ããã2008幎ååŸã«åºçãããæ¬ãå€ãã§ãããã®ãããããããWebç³»ã®äŒæ¥ãæ³å®ãããŠããæ¬ãå°ãªãããŠã©ãŒã¿ãŒãã©ãŒã«éçºããªã³ãã¬ãã¹ã®éçšã®èšèŒãããŠããäºãå€ããBASEã«ã¯ãã®ãŸãŸé©çšã§ããŸããã ãŸããITçµ±å¶ã«ã€ããŠã¯å瀟ã«ãã£ãŠäºæ
ãç°ãªãäºãå€ãããããã«ãæçãªæ
å ±ãããŸããããŸããã BASEã§ã¯ãGithubã®PullRequestã§ã®éçºãããŒïŒæ¿èªããã»ã¹ïŒãAWSãåæãšããå
容ã«èªã¿ãããªãããç£æ»æ³äººãšè°è«ãéããŠããŸãã ãªããæšå¹Žã®Advent Calendarã§ãGithubãæŽ»çšããäºäŸããããŠããŸãã devblog.thebase.in ITå
šè¬çµ±å¶ 財åã«é¢ããäžæ£ãèµ·ããªãããã«ã瀟å
ã®ã«ãŒã«ã®çå®ã»ã·ã¹ãã ã®æ¹ä¿® çµ±å¶ããšããéçºãã§ããããã«ãã·ã¹ãã èŠä»¶ã®å®çŸ© ITå
šè¬çµ±å¶ã§æŽåãå¿
èŠãªé
ç®ãåºãŠãããšãéçºããããã¯ãŒã¯ãDBã«é¢ãã倿Žãªã©ãçºçããŸããå
šãŠãCSEã¡ã³ããŒã§ã¯å¯Ÿå¿ã§ããªããããèŠä»¶ããŸãšããåéšçœ²ãšæŽåã宿œããŠè¡ãäºãèå¿ãšãªã£ãŠããŸãã ITæ¥ååŠççµ±å¶ è²¡åã«é¢ããã·ã¹ãã ã»æ¥åæé ãããã«ãŸã€ãããªã¹ã¯ã®ææ¡ æ°ããAppãæ°ããªåãçµã¿ãªã©ãã·ã¹ãã ã»æ¥åæé ã®æŽå ãããã3ç¹ã»ããïŒæ¥åãããŒå³ãæ¥åèšè¿°æžããªã¹ã¯ã»ã³ã³ãããŒã«ãããªã¯ã¹ïŒã®äœæ ã¡ã³ããŒå
šå¡ããšã³ãžãã¢åºèº«ãªäºããããæ¥åãããŒå³ãšæ¥åèšè¿°æžã«ã€ããŠã¯ãPlantUMLãçšããŠèšè¿°ããŠããŸãã ãšã¯ã»ã«ã§å³ãäœæããŠããŸããšãããŒãžã§ã³ç®¡çãã§ããä¿®æ£ãçºçããéã«ãä¿®æ£ç®æã®ææ¡ãé£ãããªããŸããPlantUMLãå©çšããã°ããã¹ãã§ç®¡çã§ãããããgithubã§ããŒãžã§ã³ç®¡çããPullRequestã§å€æŽç®æãæ¿èªãªã©ãææ¡ãããããªããŸãã å人æ
å ±ã®åãæ±ãã®æ¹éå®çŸ©ãªã© J-SOXãšã¯çŽæ¥é¢ä¿ãããŸããããå人æ
å ±ã®åãæ±ãæ¹éã®å®çŸ©ãªã©ãããŠããŸãã ã·ã§ãããªãŒããŒãå®å¿ããŠãå©çšããã ãã«ã¯ãå人æ
å ±ã®åãæ±ãã«ã€ããŠãéèŠãªèŠçŽ ãšãªã£ãŠãããããæéãªã©ãçå®ããé©åã«ç®¡çã§ããããæŽåãè¡ã£ãŠãããŸãã ç£æ»æ³äººãžå
éšç£æ»ç¶æ³ã®å ±å ç£æ»æ³äººãžå
éšçµ±å¶ã®ç¶æ³ãå ±åããŠããŸãã æ°ããæ©èœãªã©æ¥ã
ãªãªãŒã¹ãããŠããŸããã·ã¹ãã ã®å€æŽå
容ãã·ã¹ãã ã®æ§æãæã«ã¯ããŒãã«æ§é ã説æãã財åå ±åã®å
容ãã·ã§ããã®å£²äžãæ£ããäºã確èªãå ±åããŸãã ãŸãšã BASEã®æé·ãæ¯ããŠããè¡åæéã®ã²ãšã€ã«ãMove FastãããããŸããå
éšçµ±å¶ã«ã€ããŠã¯ãçµ±å¶å
容ã«ãã£ãŠã¯éçºã¹ããŒããèœãšããŠããŸãèŠå ã«ãªããããŸãããå
šå¡ãéèŠèŠããŠããæéã ãããããã©ããã£ãçµ±å¶å
容ãªãBASEã®æåã«åãããªããã€çµ±å¶ãšããŠä¿¡é Œã§ããããéèŠã«ãªããŸããã¡ã³ããŒã§çµ±å¶å
å®¹ãæ±ºããéã«ãäžçªæ°ãã€ããŠããå
容ã§ãã æ¥åæ¹åã§ã¯ãç§èªèº«ããã¹ãŠã®æ¥åãææ¡ããŠããªãã®ã§ããäžåºŠã¯æ¥åããã£ãŠã¿ããããšãå¿ãããŠããŸããã¢ã«ãŠã³ãæš©éãªã©ã§ã§ããªãæ¥åããããŸãããããã§ãäžåºŠã¯äžç·ã«ç»é¢ãèŠãªããæäœããããšã§å
å®¹ãææ¡ããŠããããã«ããŠããŸããäžçªã®çç±ã¯ãæ
åœè
ããæ¥åãèããã ãã§ã¯æ¥åå
šäœãææ¡ãã¥ãããæ¥åæ¹åãéšåæé©ã«ãªã£ãŠããŸããšæããŠããããã§ãã CSEã®ããŒã ã¡ã³ããŒã瀟å
æ¥åã«ã€ããŠæ·±ãç¥ãããšã§ãä»ã®éšçœ²ãšã®ããŒãã£ã³ã°ã§ãââãããªäºã§ããŸããïŒããšãã質åãã©ãã©ãåºãŠããããã«ãªããŸãããå°ããªåé¡ãæ¹åèŠæãªã©ãæ°è»œã«çžè«ããŠããããç°å¢ã«ãªã£ãŠããŠãããšæããŸãã ææ¥ã¯Shopã°ã«ãŒãã®æ ç°ããã§ãã ãæ¥œãã¿ã«ã
ãã®èšäºã¯BASE Advent Calendar 2020ã®6æ¥ç®ã®èšäºã§ãã devblog.thebase.in ããã«ã¡ã¯ãBASE BANK æ ªåŒäŒç€Ÿ Dev Divisionæå±ãSoftware Developer ã®æŸéªïŒ @applepine1125 ïŒã§ãã çŸåšãBASE BANKæ ªåŒäŒç€Ÿ(以äžBASE BANK)å
ã§äºæ¥ã«å¯Ÿããèªèãæãå¹çè¯ããããã¯ãéçºãè¡ãããã«è¡ã£ãŠãããã¡ã€ã³ã¢ããªã³ã°ã«ã€ããŠã玹ä»ããŸãã BASE, BASE BANKã®ãã¡ã€ã³ãšã¯ BASE BANKã§ã®ãã¡ã€ã³ã¢ããªã³ã°ã®è©±ãããåã«ããŸãã¯BASEæ ªåŒäŒç€Ÿ(以äžBASE)ãBASE BANKã®äºæ¥é åã«ã€ããŠå°ãã話ããŸãããã BASEã§ã¯ã誰ã§ãç°¡åã«ãããã·ã§ãããäœæã§ãããµãŒãã¹ã BASE ã ãéå¶ããŠãããã·ã§ããç»é¢ã®ã«ã¹ã¿ãã€ãºãååã®ç®¡çãæ±ºæžãçºéã売äžç®¡çãªã©ããªãŒããŒãºããBASEãäžã§ã·ã§ããéå¶ãè¡ãããã®æ§ã
ãªæ©èœãæäŸããŠããŸãã BASE BANKã§ã¯ããªãŒããŒãºã®ãã£ãã·ã¥ãããŒãå éãããããã«ãè³é調éãµãŒãã¹ YELL BANK ã売äžéãæçç¿æ¥ã«æ¯ã蟌ãããšãã§ãã ãæ¥ãæ¯ãèŸŒã¿æ©èœ ãªã©ããªãŒããŒãºãBASEã§äœæããã·ã§ãããéããŠåŸã売äžã«ãŸã€ããæ§ã
ãªãµãŒãã¹ãæ©èœã®éçºãéçšãè¡ã£ãŠããŸãã ãããã®ããšãããããããã«ãBASE BANKã®äºæ¥ã¯BASEããå®å
šã«ç¬ç«ããŠããããã§ã¯ãªãããããBASEãšäºæ¥é¢ã§ãã·ã¹ãã é¢ã§ã坿¥ã«çµã³ã€ããŠããŸãã ãã®ãããäºæ¥éå¶ã®ããã®ãã¡ã€ã³ç¥èãå
±éã®æŠå¿µãå€ãããµãŒãã¹ãæ©èœã®èšèšãéçºã§ã¯BASEåŽã®ã¡ã³ããŒãšã³ãã¥ãã±ãŒã·ã§ã³ãåããªããé²ããããšãã»ãšãã©ã§ãã ãã¡ã€ã³ã¢ããªã³ã°ãå§ããããã«ã± BASE BANKãèšç«ãããŠããæè¿ãŸã§ããå°æ°ã®ã¡ã³ããŒã§éçºéçšãè¡ãããŠããããšããããäºæ¥ãã·ã¹ãã ã«ç»å ŽããæŠå¿µãšãã®é¢ä¿ãäœããç®ã«èŠãã圢ã§ç¶ç¶ããŠæŽçããç¶ãããšããããšã¯ãããŸããã§ããã ãããBASE BANKãšããŠã·ã§ããã®å£²äžãšããããªãéèŠãªé åã«æºãã£ãŠãããããBASE BANKã®ã¡ã³ããŒã¯ãã¡ã€ã³ã«å¯Ÿããçè§£ãåžžã«æ·±ããŠããã¹ãã§ããããŸãããŒã ã«äººãå¢ããŠããã¿ã€ãã³ã°ãªã®ã§ãã¡ã€ã³ã¢ããªã³ã°ãéããŠãã¡ã€ã³ç¥èã®ã€ã³ããããè¡ãããšå¹çãããã®ã§ã¯ããšãã声ããããBASE BANKã®ã¡ã³ããŒã§ãã¡ã€ã³ã¢ããªã³ã°äŒãéå¬ãããããã«ãªããŸããã èªåãå
¥ç€ŸããŠæ¥ãæµ
ãé ã«åºããPRã®äžã§ããããããªéã®èªåœãããžãã¯ã®èªèåãããçºçããäžèšã®ããã«ãã¡ã€ã³ã¢ããªã³ã°ã®æ©éãé«ãŸã£ãã®ãããã«ã±ã§ããã ãããããã¡ã€ã³ã¢ããªã³ã°ãšã¯ ãããããã¡ã€ã³ã¢ããªã³ã°ãšã¯äžäœäœãªã®ã§ãããããããã§äžæŠããããããŠãããŸãããã Domain Driven Designã®èè
ã§ããEric Evansã¯ããŸããã¡ã€ã³ã¢ãã«ã«ã€ã㊠ãã¡ã€ã³ã¢ãã«ãšã¯ç¹å®ã®å³ã§ã¯ãªããå³ãäŒããããšããŠããèãæ¹ã§ããã ããã¯ãã¡ã€ã³ãšãã¹ããŒãã®é ã®äžã«ããåãªãç¥èã§ã¯ãªãããã®ç¥èãå³å¯ã«æ§æãããéžã³æãããŠæœè±¡åããããã®ãªã®ã ã ãšè¿°ã¹ãŠããŸãã ãããŠãã¡ã€ã³ã¢ãã«ã®åºæ¬ççšæ³ãã€ãŸãã·ã¹ãã ãäºæ¥ã«å¯Ÿãã©ã®ããã«äœçšããããšããŠã 1. ã¢ãã«ãšèšèšã®æ žå¿ãçžäºã«åœ¢æãåã 2. ã¢ãã«ã¯ãããŒã ã¡ã³ãå
šå¡ã䜿çšããèšèªã®åºç€ã§ãã 3. ã¢ãã«ãšã¯ãèžçãããç¥èã§ãã ã®3ã€ãæããŠããŸãã ã¢ãã«ãšèšèšã®æ žå¿ãçžäºã«åœ¢æãåã ãšã¯ãã€ãŸãã¢ãã«ãšããã«åºã¥ããèšèšãå®è£
ã坿¥ã«çµã³ã€ãããšã§ã¢ãã«ã«äŸ¡å€ãçãŸãããœãããŠã§ã¢ãæ£ç¢ºã§ãããšèšããããšã瀺ããŠããŸãã ã¢ãã«ã¯ãããŒã ã¡ã³ãå
šå¡ã䜿çšããèšèªã®åºç€ã§ãã ããšã§ãã¢ãã«ãããŒã å
ã®å
±éèšèªãšãããšã³ãžãã¢ã®ã¿ãªããåãããŒã ã§ãããã¶ã€ããŒãããžãã¹ã®ã¡ã³ããŒãšãå
±éèšèªãçšããŠã³ãã¥ãã±ãŒã·ã§ã³ãåãããšã§ãã³ãã¥ãã±ãŒã·ã§ã³ãšãœãããŠã§ã¢ã®å®è£
ãšãæ·±ãçŽ æ©ãçµã³ä»ããããããã«ãªããŸãã æåŸã® ã¢ãã«ãšã¯ãèžçãããç¥èã§ãã ãæã瀺ããŠããã®ã¯ãå
ã«åŒçšãã ç¥èãå³å¯ã«æ§æãããéžã³æãããŠæœè±¡åããããã® ãšå矩ãšèããŠããã§ãããã ã¢ãã«ã "å³å¯ã«æ§æãããéžã³æãã" ãŠããããšã§ãç¡é§ãªèªåœã®ãã¬ãèªèã®ãºã¬ã®çºçãæããããšãã§ããããå¹ççã«ã¡ã³ããŒãäœæ¥ãè¡ããããã«ãªããŸãã ãããã£ããã¡ã€ã³ã¢ãã«ã圢æããéãå¹ççãªã¢ããªã³ã°ã®èŠçŽ ãšã㊠1. ã¢ãã«ãšå®è£
ãçµã³ã€ãã 2. ã¢ãã«ã«åºã¥ããŠèšèªãæŽç·Žããã 3. ç¥èè±å¯ãªã¢ãã«ãéçºãã 4. ã¢ãã«ãèžçãã 5. ãã¬ã€ã³ã¹ããŒãã³ã°ãšå®éšãè¡ã ã®5ã€ãEric Evansã¯èªèº«ã®çµéšãåºã«å°ãåºããŠããŸãã 1,2,4ã¯ãã¡ã€ã³ã¢ãã«ã®åºæ¬ççšæ³ã«çµã³ã€ããããªã®ã§ããã3ãš5ã¯ã©ããã£ãæå³ãªã®ã§ããããã ã¢ãã«ã®ååãé¢ä¿ã ãã§ãªãããã®æ¯ãèããå¶çŽãå«ããŠã¢ããªã³ã°ããããšã§ãæ¥åã«å¿
èŠãªæ§ã
ãªç¥èãã¢ãã«ãéããŠæããäºãã§ããããããã£ãããšã ç¥èè±å¯ãªã¢ãã«ãéçºãã ãšè¡šçŸããŠããŸãã ãã¬ã€ã³ã¹ããŒãã³ã°ãšå®éšãè¡ã ããšã¯ãæèå®éšçšã«æ§ã
ãªã¢ãã«ãç»å Žãããæ§ã
ãªãŠãŒã¹ã±ãŒã¹ã«é©çšã䜿ãããã©ãããæºäžã§è©Šãããšã§ã衚çŸãæ¯ãèããç確ãã©ããã®ãã£ãŒãããã¯ãçŽ æ©ãç²åŸã§ãããšããããšãæããŠããŸãã ã¢ããªã³ã°ã«ãããŠãã¡ã°ãéèŠãªã®ã¯ã以äžã®å³ã®ããã«ã¢ããªã³ã°ã®ææç©ãèšèšãå®è£
ã«èœãšã蟌ãã§éçšããŠã¿ãŠåŸãæ°ããªç¥èŠãã¢ãã«ã«åæ ããã ãã£ãŒãããã¯ã«ãŒã(ç¶ç¶çãªåŠç¿) ãæ§ç¯ããããšã§ãã ãã¡ã€ã³ãšãã¹ããŒããå«ããäºæ¥ãã·ã¹ãã ã«ã€ããŠå§ããã"å®å
šã«"çè§£ããŠããããšã¯æ®ã©ç¡ãã§ããããäºæ¥ãéå¶ãããã·ã¹ãã ãæ§ç¯ãéçšããŠããäžã§æ§ã
ãªçºèŠãããã¯ãã§ãã"ããããªãããšãããã(ç¡ç¥ã®ç¥ãäžç¢ºå®æ§ã«æ°ã¥ãããšèšãããããããªãã§ãã)"ãšããããšãããã§ãããã ãããã£ãçºèŠãç¡ç¢ã«æ±ãã®ã§ã¯ãªããæèçã«ã¢ãã«ã«åã蟌ã¿ãè²ãŠãå
±æããæ¬¡ã®èšèšãéçºã«æŽ»ããããšã§ãã¡ã€ã³ã¢ãã«ã®ç䟡ãçºæ®ãããŸãã 俺ãã¡ã®ãã¡ã€ã³âãªâã¢ããªã³ã°ãšã¯ ãããŸã§åæãšãªãBASE, BASE BANKã®ãã¡ã€ã³ã«ã€ããŠãããã¡ã€ã³ã¢ããªã³ã°ã®èãæ¹ã«ã€ããŠèª¬æããŠããŸããããããããBASE BANKã§è¡ã£ãŠãããã¡ã€ã³"ãª"ã¢ããªã³ã°ã«ã€ããŠã説æããŸãã ã¡ãªã¿ã«ã¿ã€ãã«ããã®ç¯ã®ååããã¡ã€ã³ã¢ããªã³ã°ã§ã¯ãªã ãã¡ã€ã³"ãª"ã¢ããªã³ã° ãšãªã£ãŠããããšã«ãæ°ã¥ãã§ããããã ãã¡ã€ã³ã¢ããªã³ã°ãå§ããããã«ã± ã®ç¯ã§è¿°ã¹ãããã«ããããŸã§äœç³»ç«ãŠãŠç¶ç¶çã«ãã¡ã€ã³ã®æŽçãè¡ã£ãŠããªãã£ãã®ã§ãã¡ã³ããŒåã
ã®é ã®äžã«ååšãããµãã£ãšããã¢ãã«ãäžåºŠè§£äœããåæ§ç¯ããããšããæå³åãã蟌ã ãã¡ã€ã³"ãª"ã¢ããªã³ã° ãšåŒã³ãŸããã å
·äœçã«ããã¡ã€ã³"ãª"ã¢ããªã³ã°ã§ã¯ã - çŸåšéå¶ãéçºããŠãããµãŒãã¹ã®æŠå¿µããã¯ã€ãããŒãããŒã« miro ã䜿ã£ãŠãŸãçŸ
åãããã¡ã€ã³ãšãã¹ããŒã(BASE BANKç«ã¡äžãæããé¢ãã£ãŠããPMããšã³ãžãã¢ãªã©)ã«åæŠå¿µãé¢ä¿ã®èª¬æãããŠããã - ãã®äžã§ä»ã®ã¡ã³ããŒãå«ã質åãè°è«ãããªãããåå(ã¯ã©ã¹åå«ã)ã®ãã¬ãä¿®æ£ããåæŠå¿µã®é¢ä¿ã忀èšãåæ§ç¯ããŠãã ãšãã£ãããšãã²ãããç¹°ãè¿ããŠãããŸãã äŸãæãããšãæ¯èŸŒç³è«ãšããæ©èœã«ã€ããŠãã¡ã€ã³ã¢ããªã³ã°ãè¡ã£ãéã¯ä»¥äžã®ãããªææç©ãšãªããŸããã ã¢ã¶ã€ã¯ã ããã§ç³ãèš³ãããŸãããæŠå¿µã倿°ç»å ŽããŠè²ã
ãªæŽçãè¡ã£ãŠãããã ãª?ãšããã®ãäŒããã°ãšã»ã»ã» ãã¡ã€ã³"ãª"ã¢ããªã³ã°ã§ã¯ã¢ãã«ã®è±æ§ç¯ãç®çãšããŠããã®ã§ããã§ã«æ§ç¯ãããŠããã·ã¹ãã ã®å®è£
(åã¢ãžã¥ãŒã«ãããŒãã«å®çŸ©ãªã©)ã«åŒã£åŒµãããªãããšãéèŠã§ããããŒã å
ã®è°è«ã§ããæ²¹æãããšçŸåšã®ã·ã¹ãã ã§ã¯ãããªã£ãŠãããã~ãšããè«ãæ¹ã«ãªã£ãŠããŸãããæ³šææ·±ãé²ããŸããã ããæ·±ãã¢ããªã³ã°ãè¡ãã®ã§ããã°ããªã¬ãŒã·ã§ã³ã·ããé§åèŠä»¶åæ(RDRA)ãICONIXãªã©ã®åæãã¬ãŒã ã¯ãŒã¯ãããã»ã¹ãæ¡çšãã¹ãããšæããŸãããBASE BANKã®ãã¡ã€ã³ã¢ããªã³ã°ã§ã¯RDRAã§èšããšããã®æŠå¿µã¢ãã«ã®ã¿ãäœæããŠããæ®µéã§ãã çç±ã¯ãBASE BANKãè€æ°ãµãŒãã¹ãæ©èœãåãæã£ãŠããããããŸãã¯ããããã®æŠå¿µã«ã€ããŠåºãæŽçããããšãç®çãšããããã§ãã ãããã©ã€ããŠã§ã€ããªãã¡ã€ã³ã¢ããªã³ã°ã ãã§çµããããæ°ã¯ãªããéçšããŠããäžã§ããã«ãã¡ã€ã³ã«é¢ããç¥èŠãåŸããããã£ãŒãããã¯ã«ãŒãã®ã€ãã¬ãŒã·ã§ã³ãããçŽ æ©ãåããããã«ãªã£ãããããæ·±ãã¢ããªã³ã°ãè¡ã£ãŠããã€ããã§ãã ãã¡ã€ã³"ãª"ã¢ããªã³ã°ã®ãããã ãããããã¡ã€ã³ã¢ããªã³ã°ãšã¯ ã§è¿°ã¹ãããã«ãã¢ãã«ã¯å®è£
ãšçµã³ã€ããŠäŸ¡å€ãçãŸããŸãããããâãªâã¢ããªã³ã°ãå§ããŠãããŸã æ¥ãæµ
ãããã§ã«æ§ç¯ãããã·ã¹ãã ã«å¯ŸããŠ"ãª"ã¢ããªã³ã°ããã¢ãã«ãé©çšããããšãããšå€§ãã倿Žãå¿
èŠãšãªãç®æãããã€ããããããçŸç¶ã¢ãã«ãšå®è£
ã坿¥ã«çµã³ã€ããããŠãããšã¯èšãé£ãç¶æ³ã§ãããšããã®ã課é¡ãšããŠãããŸãã ããããã¡ã€ã³"ãª"ã¢ããªã³ã°ããã£ããã«ãè¿œå æ©èœã®èšèšãããã«äŒŽããªãã¡ã¯ã¿ãªã³ã°ã«ãããŠãããŒã å
ã§äœæããã¢ãã«ãåºã«æŽ»çºã«è°è«ã亀ããããããã«ãžã¥ã¢ã«ã«ãã¡ã€ã³ã¢ããªã³ã°äŒãéå¬ããèšèšãå®è£
ãè¡ãããŠããæ§ãèŠåããããŸãã ãŸãçŸåšæ°èŠéçºããŠãããµãŒãã¹ã«ãããŠããæŠå¿µããã®é¢ä¿ã®æŽçãäžå¯§ã«è¡ããªããéçºãé²ããããŠããã®ã§ããã¡ã€ã³"ãª"ã¢ããªã³ã°ã¯ãã ã®ã ãŒãã¡ã³ãã«çµãããBASE BANKããŒã ã«å®çããŠããã ãããªããããªãããã«ä»åŸãç¶ç¶ããŠæ¢åã®å®è£
ã«å¯ŸããŠãã¢ãããŒãã§ããããã«ããŠãããªããã°ãšæããŠããŸãã ããäžã€ã®èª²é¡ãšããŠã BASE,BASE BANKã®ãã¡ã€ã³ãšã¯ ã®ç¯ã§ BASEåŽã®ã¡ã³ããŒãšã³ãã¥ãã±ãŒã·ã§ã³ãåããªããé²ããããšãã»ãšãã© ãšè¿°ã¹ãŸããããBASEåŽã®ã¡ã³ããŒãå«ããŠãã¡ã€ã³ã¢ããªã³ã°äŒãããããšãããšå€§æåž¯ã«ãªãæ©ååãèœã¡ãŠããŸãã®ã§ãBASE BANKã®ã¡ã³ããŒã®ã¿ã§ã¢ããªã³ã°ãè¡ã£ãŠãããšããã®ãçŸç¶ã§ãã ã€ãŸãæ¥åäžã®é¢ä¿è
å
šå¡ãšã¯ã¢ãã«ãå
±æã§ããŠããªããšããããšã«ãªãã®ã§ãEric Evansã®èšã "ã¢ãã«ã¯ãããŒã ã¡ã³ãå
šå¡ã䜿çšããèšèªã®åºç€ã§ãã" ãšãããã¡ã€ã³ã¢ãã«ã®åºæ¬çšæ³ãšéžè±ããŠããŸã£ãŠããŸãã ããã«é¢ããŠã¯ãä»åŸæ¥åå
ã§é¢ä¿è
ãšã³ãã¥ãã±ãŒã·ã§ã³ãåãéã«å°ãã¥ã€æµžéãããŠãã£ããããã¡ã€ã³ã¢ããªã³ã°ãšããæŽ»åèªäœã瀟å
ã«åºããŠãããããã³ãã¥ãã±ãŒã·ã§ã³ãåããããã§ããã°ãªãšæã£ãŠããŸãã ããã㫠以äžã俺ãã¡ã®ãã¡ã€ã³"ãª"ã¢ããªã³ã°ã®ç޹ä»ã§ããã äœè«ã§ããããã¡ã€ã³ã¢ããªã³ã°ãè¡ãéçšã§åäºæ¥ã®ãã¡ã€ã³ãæŽçãããã ãã§ãªããBASEã®äžã§ã®BASE BANKãšããäŒç€Ÿã®ç«ã¡äœçœ®ãããæç¢ºã«ãªã£ãã®ããšãŠãå°è±¡çã§ããã after baseãšã¯ããªãŒããŒãºãã·ã§ããã§å£²äžãç«ãŠãŠããå
ã®ãéã®æµããšããã«é¢é£ããæ©èœããµãŒãã¹(YELL BANKããæ¥ãæ¯èŸŒãªã©)ãæã瀟å
çšèªã§ãã ãã¡ã€ã³"ãª"ã¢ããªã³ã°ãéããŠãåäºæ¥ãžã®çè§£ãæ·±ãŸãã ãã§ãªããããããéå¶ããŠããäŒç€Ÿãã®ãã®ã®ã¹ã¿ã³ã¹ãæããã«ãªãããšã¯ä»åæ°ããªçºèŠã§ããã ææ¥ã¯ BASE æ ªåŒäŒç€Ÿ CSEããŒã ã®å°æããã§ã! ã§ã¯ãŸãã åèæç® Eric Evans, ãšãªãã¯ã»ãšãŽã¡ã³ã¹ã®ãã¡ã€ã³é§åèšèš( https://www.shoeisha.co.jp/book/detail/9784798126708 ) Vaughn Vernon, å®è·µãã¡ã€ã³é§åèšèš( https://www.shoeisha.co.jp/book/detail/9784798131610 )
ãã®èšäºã¯BASE Advent Calendar 2020ã®5æ¥ç®ã®èšäºã§ãã SRE Groupã®ngswã§ãã Eã³ããŒã¹ãã©ãããã©ãŒã ãBASEãã«ãããé害çºçæã«ã瀟å
é¢ä¿è
ã«é£çµ¡ç¶²ã«åºã¥ããŠé»è©±çºä¿¡ããã·ã¹ãã ãæ§ç¯ããŸããã ãã®ãšã³ããªã§ã¯ããã®å°å
¥ãŸã§ã®çµç·¯ãšå
·äœçãªåœè©²ã·ã¹ãã ã®èª¬æãããŸãã TL;DR ãBASEãã§åé¡ãçºçããéã«æææ±ºå®è
ã«é»è©±çºä¿¡ããåšç¥ã·ã¹ãã ãæ§ç¯ãã ãå°å
¥åã«èããããšãããŸãäž»é¡ãšããŠæžãã åèURLèšäºã®ãŸãŸæé ã§ããããããã§ãå°å
¥æã«è©°ãŸã£ãäºæãªã©èœã¡ç©æŸãçã«è¿œèšãã è¬èŸ Twilio FunctionsãšStudioã䜿ã£ãŠé£ç¶æ¶é»ãè¡ã - Qiita 倧å€ããããããèšäºã§ãããã»ãŒãã¹ãŠãåèã«ãããŠããã ããããã®Qiitaèšäºããªããã°çæéã§å®çŸããããšã¯äžå¯èœã§ãã£ããšèãã å°å
¥ã«è³ãçµç·¯ 07æææ¥ : ãµã€ãé²èЧé
å»¶é害ãèµ·ããããšã§ãçºçãšããããŠç€Ÿå
é¢ä¿è
ã«æ©æ¢°çã«äžæåšç¥ããæ¹æ³ãå¿
èŠãªã®ã§ã¯ãªããããšããè°è«ããã£ã 09æææ¥ : 07æãšå¥èµ·å ã§ã¯ãããåæ§ã®ãµã€ãé²èЧé
å»¶ãçºçããåœæã®è°è«ãå床浮äžãã å人çãªææ³ : äºåºŠè°è«ãããããšã¯å¯Ÿå¿ãã䟡å€ãããã®ã§ã¯ãªãããå°ãªããšãæ€èšŒãã䟡å€ã¯ããã®ã§ã¯ãªãããšèãã å°å
¥åã«èããããš ãŸãã¯ããã«ã解決ãã¹ã課é¡ããªã«ãããèããªããŠã¯ãªããªãã ãããããŠç€Ÿå
é¢ä¿è
ã«æ©æ¢°çã«äžæåšç¥ããæ¹æ³ãå¿
èŠãªã®ã§ã¯ãªããããšããè°è«ããèããããã®ã¯ãè°è«çºæ¡åŽã®åœ¹å²(ãšããã«èª²ãããã責å)ãé¢ä¿ããŠããããããã¯ããæ£åžžåäœããŠããªãããšãå©çšè
ã§ããã·ã§ãããªãŒããŒæ§ã«éç¥ãã責任ãããããŸãã¯ãã®ç¶æ³ãèªèããŠæ¬¡ãªãæææ±ºå®ã«åããå¿
èŠããããšãããããããã®ç«å Žããããããããã«ç¶ãã¹ãéç¥ãã§ããã ãæ©ããã ããããšãã衚æã«ã»ããªããªãã ãã®äžæ¹ã§ãããããªãæ±ããããç¶æ
ã«ãªã£ãã®ããããã¯ãã·ã¹ãã éå®³å¯Ÿå¿æã«å¯Ÿå¿ãšã³ãžãã¢ãåšç¥ããæéãããŸãåããªãå Žåãããããšããããšã®èšŒå·Šã§ããããã·ã¹ãã ã«å¯Ÿããæ¢è¡å¯Ÿå¿ãšããããã¯ãã«å¯Ÿããã€ã³ãã¯ã床åããå«ããç¶æ³èª¬æããããã¢ã©ãŒãã«æ©æã«åå¿ã§ãã察å¿ãšã³ãžãã¢ã«äžæã«ããã£ãŠããŠããŸã£ãŠããŠãçµå±ãã®å¯Ÿå¿ãšã³ãžãã¢ãé害察å¿å
šè¬ãå«ããããã«ããã¯ã«ãªã£ãŠãããšããããšã§ãããããã®ç¹ãæ©æ¢°çã«ã¹ã ãŒãºã«è§£æ±ºããæ¹æ³ãæ±ããããŠããã®ã ããã ãªãã»ã©ãè£ãè¿ãã°Webãšã³ãžãã¢ã¯æææ±ºå®è
ãå«ãã瀟å
é¢ä¿è
ã«ãé¢ä¿è
ã¯ãŠãŒã¶ã§ããã·ã§ãããªãŒããŒæ§ã«å¯ŸããŠã説æè²¬ä»»ãããããšããããšã§ããã仿ãã°ä»äºãšãããã®ã®ã»ãšãã©ã¯ãã®ã説æè²¬ä»»ãæããããšã«çµå§ããã®ã§ã¯ãªããããšãŸã§èããããã«ãªã£ãã ã§ããã°ããã¯åãªãé害éç¥ã·ã¹ãã ã®è£å©æ©èœã§ã¯ãªãããããã¯å€§çŸ©ãæã«å
¥ãããããã§ã¯ã¯ããããã 仿§ BASEã·ã§ããããŒãžã®å¿çé床äœäžã®æ€ç¥ã¯ãæ¢åã®mackerelç£èŠèšå®ãå©çšãã çºå ±ã¯mackerel ã«ãŠ Twilioæ¶é»éç¥ ãå©çšããã°ããããã§ãã ãã ãäžèšæ©èœã ãã§ã¯æ¶é»å
ã1ã€ã®çªå·ã«éãããŠããŸããšããå¶çŽããã ãã®ããmackereläžã®èšå®ã§ã¯ dummy call ãšãã(ãã®æåŠã¯ã©ãã§ãããã®ã§ ngsw ã®çªå·ãèšå®ãã) mackerelã¯äžèšåŠçã®æåŠãStatus Callback URL(Twilio) ã«ãªã¯ãšã¹ããã äžèšã®ãªã¯ãšã¹ãã奿©ã«åŸè¿°ãã Twilio Functions ã«èšå®ããjsãé»è©±çªå·ã®Dictãæã€ã®ã§foræã§äžäººãã€é»è©±çºä¿¡ é³å£°ã察å¿å¯èœãªã1ãç¡çãªã0ãã«å¯ŸããŠãããŒ1æŒäžãªãããã§ã«ãŒãçµäºãããŒ0ãªã次ã®äºº(ç¡èŠãé話äžãå³åããåã) é
åæåŸãŸã§ãã£ããæå®æå€§åæ°ãŸã§ã«ãŒããã æ§æèŠçŽ / ç»å Žäººç© å
šäœ Name Role Memo ãBASEã ç£èŠå¯Ÿè±¡ äž»ã«é²èЧã«é¢ããå¿çéåºŠã«æ³šç® Mackerel ç£èŠã·ã¹ãã ãBASEãã·ã¹ãã ãç£èŠããŠTwilioã«éç¥ Twilio é»è©±çºä¿¡ã·ã¹ãã ãšããŠå©çš Twilioå
ã®çްåå Name Role Memo Twilio Functions FlowãåŒã³åºãããã®ã¹ã¯ãªãã URLãã〠Twilio Studio Flowãå®çŸ©ãã é³å£°èªèãããã·ã¥çªå·èªèãã§ããæ¡ä»¶åå²ãã§ãã 賌å
¥çªå· çºä¿¡çªå· 賌å
¥ããªããšçºä¿¡è¡çºã«å¶çŽããã åèURL Twilio FunctionsãšStudioã䜿ã£ãŠé£ç¶æ¶é»ãè¡ã - Qiita ãåèã«ãã 倧äºãªããšãªã®ã§äœåºŠã§ã Twilio Functions Functionsã®ã³ãŒãã¯äžåºŠãããã€ããŠç»é¢ãéããå Žåãæ¹ããŠFunctionsç»é¢ããã¹ã¯ãªããå
容ãåååŸããããšãããšå€±æãç¹°ãè¿ããç·šéã§ããªãäºè±¡ã確èªããŠãã(éè¯ãåãããšãããã / Rate Limit ?) 以äžã§URLã確å®ãã https://${DOMAIN}/$(ãã¹å) Functionsäœææã« Environments DOMAIN ãæãåºããã ãã¹åãèªåã§æ±ºãã Functions /function-name Assets (ç¡èŠ) Settings - Environment Variables - FLOW_SID https://jp.twilio.com/console/studio/dashboard ã§é²èЧå¯èœãª FW ããå§ãŸãSIDã®ããš FROM_NUMBER +{賌å
¥çªå·} // https://qiita.com/mobilebiz/items/8757eec854f37ce0cb2d /** * Studioã飿ºãããé£ç¶æ¶é» - serialCallStudio * * @param idx ãªã¹ãã€ã³ããã¯ã¹ * @param loop ã«ãŒãåæ° */ // æ¶é»å
ãªã¹ãïŒçºä¿¡ãããé»è©±çªå·ã®ãªã¹ããE.164圢åŒã§èšè¿°ããŸãïŒ const callList = { "æºåž¯1": "+8150yyyyyyy0", "æºåž¯2": "+8180yyyyyyy1", }; // ã«ãŒãåæ°ïŒ1以äžã®æŽæ°ã1ãªãã«ãŒãããªãïŒ const maxLoop = 2; exports.handler = function(context, event, callback) { // ã«ãŠã³ã¿ãŒé¢é£ let idx = event.idx || 0; // ã€ã³ããã¯ã¹ãã©ã¡ãŒã¿ãååŸ let loop = event.loop || 1; // ã«ãŒããã©ã¡ãŒã¿ãååŸ if (idx >= Object.keys(callList).length) { // ãªã¹ãã®æåŸãŸã§å°é idx = 0; // ã€ã³ããã¯ã¹ã¯0ã«æ»ã if (loop >= maxLoop) { // ã«ãŒãåæ°ãæå€§å€ãè¶
ããã®ã§çµäº callback(null, "Call count was expired."); } else { loop++; // ã«ãŒãåæ°ãã€ã³ã¯ãªã¡ã³ã } } // æ¶é»å
é»è©±çªå· let number = callList[Object.keys(callList)[idx]]; idx++; // ã€ã³ããã¯ã¹ãã€ã³ã¯ãªã¡ã³ã // æ¶é»ããStudioãããŒãåŒã³åºã const client = context.getTwilioClient(); client.studio.v1.flows(context.FLOW_SID).executions.create({ to: number, from: context.FROM_NUMBER, parameters: JSON.stringify({ idx: idx, loop: loop, }) }) .then((call) => { callback(null, "OK"); }) .catch((error) => { callback(error); }); }; Twilio Studio æé çãªããããã㯠Functions ãå
ã«ã§ããªããš Twilio Studio ã§ Flow ã宿ããªã ãããFunctions宿ã«ã¯ FLOW_SID ãå¿
èŠ è§£æ±ºçã¯ä»¥äžã®æé ã®äžã§ Run Function ã ãããšãããã眮ããšããŠPublishãªãã㊠Flow SID ã確å®ããŠããããš FLOW CONFIGURATION Flow å®è¡ã®ããªã¬ãŒ Config FLOW NAME SerialCallStudio REST API URL https://studio.twilio.com/v1/Flows/FWxxxxxxxxxxxxxxxxxxx/Executions WEBHOOK URL https://webhooks.twilio.com/v1/Accounts/ACxxxxxxxxxxxxxxxx/Flows/FWxxxxxxxxxxxxxxxxxxx TEST USERS (空) Transitions IF INCOMING MESSAGE (空) IF INCOMING CALL (空) IF REST API call MAKE OUTGOING CALL V2 æ¶é»æã«åé»åŽã®ã¹ããŒã¿ã¹ã§åå² Config WIDGET NAME call NUMBER TO CALL {{contact.channel.address}} RECORD CALL OFF DETECT ANSWERING MACHINE OFF SEND DIGITS (空) TIMEOUT 60 SECONDS SIP USER NAME (空) SIP PASSWORD (空) Transitions IF ANSWERD Gather IF BUSY LoopFunction IF NO ANSWER LoopFunction IF CALL FAILED LoopFunction GATHER INPUT ON CALL é話äžã®ã¡ãã»ãŒãžãšããã®ã¡ãã»ãŒãžã«å¯Ÿããåçã®ä¿æ ã¡ãã»ãŒãžã¯ããã¹ãã ãã§ãªãèšå®æ¬¡ç¬¬ã§é³å£°ãã¡ã€ã«ã§ãå¯èœ åé»è
ã®ä»¥äžã®ã¢ã¯ã·ã§ã³ãçè§£ã§ãã ã©ã®ããã·ã¥ãã¿ã³ãæŒäžããã é³å£°èªèã«ããåçå
容(ã¯ã or ãããã¿ãããªãã®) ããã¯ããŸãåããªãã£ã Config WIDGET NAME Gather SAY OR PLAY MESSAGE TEXT TO SAY {ããã«çºé³ãããã1 or 0ã§åå²ãããããªããã¹ãæãæžã} LANGUAGE Japanese MESSAGE VOICE Alice NUMBER OF LOOPS 1 STOP GATHERING AFTER 5 SECONDS STOP GTHERING ON KEY PRESS? YES / # STOP GATHERING AFTER (空)DIGITS SPEECH RECOGNITION LANGUAGE Default SPEECH RECOGNITION HINTS (空) PROFANITY FILTER True ADVANCED SPEECH SETTINGS - SPEECH TIMEOUT (IN SECONDS) auto SPEECH MODEL Numbers & Commands Transitions IF USER PRESSED KEYS YesOrNo IF USER SAID SOMETHING (空) IF NO INPUT LoopFunction Split Based On⊠æ¡ä»¶åå²ãšãã®å€å® Config WIDGET NAME YesOrNo VARIABLE TO TEST widgests.Gather.Digits Transitions COMPARING WITH {{Gather.Digits}} IF NO CONDITION MATCHES LoopFunction YES == 1 Equal To / 1 / SayYes NO == 0 Equal To / 0 / LoopFunction Say/Play Push 1 ã ã£ãéã®åŸåŠç Config WIDGET NAME SayYes SAY OR PLAY MESSAGE OR DIGITS Say a Message TEXT TO SAY {ããã«çºé³ããããããã¹ãæãæžã} LANGUAGE Japanese MESSAGE VOICE Alice NUMBER OF LOOPS 1 Transitions IF AUDIO COMPLETE (空) Run Function Push 0 ãªãã㯠1 以å€ã ã£ãéã®åå®è¡ ãŸãã¯é話äžããªãããã®çç±ã§é話äžå¯ã ã£ãå Žå Config WIDGET NAME LoopFunction SERVICE SerialCallStudio ENVIRONMENT ui FUNCTION /function-name 1 FUNCTION URL (èªåä»äž) Function Parameters ãããã¯jså
ã§åŒãåããŠå©çšããã idx {{flow.data.idx}} loop {{flow.data.loop}} Transitions IF SUCCESS (空) IF FAIL (空) çµã³ ååã§ã¯å°å
¥ã®çµç·¯ããåŸåã§ã¯ã·ã¹ãã ã®è©³çŽ°ãæžãããç¹°ãè¿ãã«ãªããæŠãã®äž»é¡ã¯ååéšã§ããããããèªãããããšã®ãã¹ãŠã§ãã£ããåŸåéšã®ææç©è§£èª¬ã¯ãã®æ®æ»ã§ãããªãããããã§ãåæ§ã«å°å
¥ãèããæ¹ãããå Žåã«ãäœãããã®åèã«ãªãã°ãšå€§å
ã®Qiitaèšäºãããã«è£å®ã§ãããããªèšè¿°ãå¿ãããã å°å
¥åŸã¯ããã¶ãé 調ã§ç¹ã«ã¯ã¬ãŒã ããªããæåŸ
éãã®çšŒåãããŠãã圹å²ã¯æããããšèããŠããããã®ãããªã·ã¹ãã ãããŒã«ãçšããŠèª¬æè²¬ä»»ãæãããŠããã®ãSRE(ã ãã§ãªããšã³ãžãã¢)ãªã®ã ãšæãããšããç¹ã匷ã匷調ããçµã³ãšãããã ææ¥ã¯ BASE BANK æ ªåŒäŒç€Ÿã®æŸéªãã (@applepine1125) ã®èšäºã§ãã åŒãç¶ããããããé¡ãããããŸãã
ãã®èšäºã¯BASE Advent Calendar 2020ã®4æ¥ç®ã®èšäºã§ãã devblog.thebase.in ããã«ã¡ã¯ãBASEã®ããŒã¿ã¹ãã©ããžãŒããŒã ãæ
åœããŠããéŽæšïŒ id:rmarl ïŒã§ãã æ®æ®µã¯ãæ©æ¢°åŠç¿ãšã³ãžãã¢ãããŒã¿ãšã³ãžãã¢ã¡ã³ããŒãšäžç·ã«ããŒã¿æŽ»çšã®æšé²ãè¡ã£ãŠãããŸãã æšå¹Žã®ã¢ããã³ãã«ã¬ã³ã㌠ã§ãDSããŒã ã®åãçµã¿ã«ã€ããŠæžãããŠããã ããŸããããä»å¹Žã¯ããéçºå¯Ÿè±¡ãæ¡å€§ãã以äžã®ãããªé åã«ã€ããŠéçºãé²ããŠãããŸãã ãããã·ã§ããäœæãµãŒãã¹ãBASEãããå©çšã®ã·ã§ãããªãŒããŒæ§ãžã®èªåã¢ããã€ã¹ãã·ã§ããã³ã°ã¢ããªãBASEãã®ãŠãŒã¶ãŒãžããããååã®ã¬ã³ã¡ã³ã æç³»ååæããããæŽ»çšããã¢ãã«ã®æ§ç¯ïŒBASE BANKïŒ ç°åžžæ€ç¥ æ€çŽ¢ãšã³ãžã³ã®ç²ŸåºŠåäž ããŒã¿åºç€ã®æ§ç¯ãšBIããŒã«ã®å©çšä¿é² ãã®ããã«éçºé åãåºãã£ãŠããã«ã€ããŠãéäžããŠæè¡ç¿åŸããæéããªããšãã課é¡ãèŠããŠããããã«ãªããŸããã ããã«å¯ŸããŠå¹ŽåããHackWeekãå°å
¥ãå®éã«ç®ã«èŠãã广ãåºãŠããã®ã§ãããã§å
±æããããšæããŸãã HackWeekãšã¯ïŒ äžå®æéæ¥åãé¢ããŠãäžã€ã®ç ç©¶ããŒãã«éäžããæéãèšããäºã§ãã ããã«ãããããŒã å
šäœã®éçºåã®åºäžããæåŸ
ããŠããŸãã å
ã
ã¯2017幎ã«ããŒã¿ãµã€ãšã³ãã£ã¹ãåãã®æè²ãã©ã³ã®è«æãšããŠçºè¡šãããç©ãããŒã¹ã«ãªã£ãŠãããŸãã arxiv.org ããã«ãããããã«ãHackWeekã¯éäžããäºã«ãã£ãŠãããã以äžã®å¹æãæåŸ
ããŠããŸãã æå
ç«¯ã®æ¹æ³è«ã®ç¿åŸ ãã¢ã©ãŒãã³ã° å®åãšã®èåïŒè«æã«ããã³ã©ãã¬ãŒã·ã§ã³ããã®äžã€ïŒ äžèšã«å ããGoogle瀟ã®20%ã«ãŒã«ã®ãããªãå
補åã«ããæè¡é©æ°ã®ããŒã¹ãããããã«ãœã³ã®ãããªãçæéã«ãããçºæ³åã®åŒ·åããæåŸ
ã§ããŸãã BASEã§ã®æŽ»ç𿹿³ ãããããããŒã å
šäœã®éçºåã®åºäžããæåŸ
ããŠããããã宿¥åãåªå
ãã€ã€ç¡çã®ãªãç¯å²ã§ãã¡ã³ããŒäž»äœã§HackWeekã«ç«åè£ããŠé ããŠããŸãã åã
ã®ã¡ã³ããŒã®åžæãå
ã«ã以äžã®ãããªæ¡ä»¶ã§å®ããŠããŸãïŒ å¯Ÿè±¡ããŒã å
è¿°ã®éçºé åã«ãããŠãå°æ¥çã«æŽ»çšããããªåŠç¿ã¢ãã«ã®æ€èšŒ ææ°ã®è«æå
容ãå®ããŒã¿ã§æ€èšŒ éå»ã®éçºæã«ãåŸã§æ€èšãããšããããŒãã®æ€èšŒ æ¥çšã«ã€ã㊠æéã¯ååïŒé±é æéçµäºåŸãéããã«å ±åäŒãè¡ã ãªãªãŒã¹åã»ç¹å¿æãé¿ãã ãµããŒãåãåããå¯Ÿå¿æéã¯é¿ãã ç°å¢ã®æºå æ€èšŒã®ããã ãã®ææãµãŒãã¹å©çšãå¯ sandboxãšããŠãMLå°çšãµãŒããŒã«ç©ºããããã°å æãå¯ ãŸããHackWeekã«å
¥ãäºã宣èšããã¡ã³ããŒã«å¯ŸããŠã¯ããã®æéã®éã以äžã®ãããªå€åäœç³»ãšããŠããŸãã åŒç€Ÿã§ã¯ç¹ã«å°å
¥ã§åé¡ã¯ãªãã£ãã®ã§ããããã®èŸºãã®èª¿æŽãèŠããã±ãŒã¹ãããããšæããŸãã HackWeekã«å°å¿µãããããåºç€Ÿã¯ä»»æ çŸåšã¯Work From Home宿œã®ãããåºæ¬ã¯ãªã¢ãŒãå€åãšãªã£ãŠãããŸã ãã®ã¡ã³ããŒãæ
åœããŠããéåžžæ¥åã¯ãåºæ¥ãéãä»ã®ã¡ã³ããŒãååããŠä»£è¡ãã ããã§ãç·æ¥å¯Ÿå¿ãå
¥ã£ããããã®å¯Ÿå¿ã®æ¥æ°åãå ±åäŒãå»¶æãã ã©ã®ãããªå
容ã宿œããã鲿ãã°ããŸãšããŠãããå ±åäŒã§å
±æããã å ±åäŒ HackWeekçµäºåŸãå ±åäŒã¯ä»¥äžã®èŠé ã§å®æœããŸãã æ€èšŒå®äºã»äžéåãããçºè¡šãã å ±å20ïœ30åã質çå¿ç20ïœ30åãš1æéã§éå¬ å¯èœã§ããã°ããã¢ç°å¢ãçšæãã å ±åçšææžã¯å¿
é ãšãã ã©ããã£ãããŒããéžã°ãããïŒ ä»å¹Žã«å
¥ã£ãŠãã20ä»¶è¿ãå ±åäŒãéå¬ãããŸããããäžéšãæç²ãããšä»¥äžã®ãããªããŒãããããŸããã ãã¬ããžåéã®ããã®ã°ã©ãDBæŽ»çšæ³ åæåç»ã«ãããç©äœæ€ç¥ åŠç¿ã«objectã®äœçœ®æ
å ±ãå©çšããªãobject detection Grad-CAM ã«ããŽãªãŒã»å±æ§æœåºã®ææ³ é³å£°ãã¬ãŒã ã¯ãŒã¯ã®æ€èšŒ ã©ã®ãããªææãåºãŠããŠãããïŒ äžçªã®ææãšããŠã¯ãã¢ã©ãŒãã³ã°ã®å¹æã倧ãããã¡ã³ããŒã®æ°ä»ããéçºäžæ¡ä»¶ã«å¿çšãããäŸãåºãŠããŠããŸãã ãŸããã¡ã³ããŒã¯ä»»æã®ããŒããéžã¶ããšãåºæ¥ãããã«ããŠããã®ã§ãããå®åãšçµã³ã€ããããŒããå€ãã£ãã§ããã¡ã³ããŒæ°ããå®åäžã«è©ŠããŠã¿ããã£ããã©æéãæ¡ç®æ§ã®åé¡ã§ä¿çã«ãã課é¡ããã®æéã§æ€èšŒãããããšã®äºã§ããã¡ããHackWeekã®ææã®æ¹ã广ããããšããäºã§å®åã«çµã¿èŸŒãŸããäŸããããŸãã ãŸãšã HackWeekå®è·µã®ã¡ãªãããåãäžããŠããŸããããBASEã«ãããŠã¯ããŒã¿æŽ»çšãéåžžã«éèŠèŠããåãçµã¿ããããªã£ãŠããããã®å®çŸã«å¯ŸããŠæè»ãªäœå¶ããããŠãããŸãã ä»åŸãšããããŒã¿æŽ»çšãéããŠçæ§ã®å©äŸ¿æ§ã«è²¢ç®ããŠãããã°ãšæããŸãã ææ¥ã¯ãSREããŒã ã®é·æŸ€ããïŒ id:ngsw ïŒã§ãïŒã楜ãã¿ã«ïŒ
ãã®èšäºã¯BASE Advent Calendar 2020ã®3æ¥ç®ã®èšäºã§ãã devblog.thebase.in BASEæ ªåŒäŒç€Ÿ SRE Groupã®çžåã§ãã BASEã®ã€ã³ãã©ã¯AWSäžã«æ§ç¯ããŠããããã€ãã®ããŒã«ã䜿ã£ãŠæ§æç®¡çããŠããŸãããäž»ã«EC2ã®ãµãŒãèšå®ããŒã«ãšããŠå©çšããŠããã®ãçŸç¶ã§ãæ§æç®¡çã§ããŠããªãAWSãªãœãŒã¹ãã¡ãã»ããããŸãã ããã§ãŸãã¯SRE Groupã§äœ¿ã£ãŠãã瀟å
ããŒã«ããçŽæ¥ãµãŒãã¹åœ±é¿ã®ãªããã®ã Terraform ã§æ§æç®¡çãããŠã¿ãŠãããçšåºŠéçšãåºãŸã£ãŠãããäž»ãµãŒãã¹ã®ç®¡çããã¡ãã«å¯ããŠããããšããæ¹åã§é²ãã§ããŸãã Terraformå°å
¥ã«ãããæãæ©ãã ã®ãtfstateã®åãæ¹ãšãã£ã¬ã¯ããªæ§æã ã£ãã®ã§ããããã¡ã€ã³ã«ç޹ä»ã§ããã°ãšæããŸãã è¬èŸ 以äžã®æžç±ãšèšäºãéåžžã«åèã«ãããŠããã ããŸãããããããšãããããŸãã éæåèŠ (2019) ãå®è·µTerraformãAWSã«ãããã·ã¹ãã èšèšãšãã¹ããã©ã¯ãã£ã¹ãã€ã³ãã¬ã¹R&D Terraformã®ãã£ã¬ã¯ããªæ§æã®æš¡çŽ¢ | ADWAYS ENGINEERS BLOG Terraformãªã«ãããããªããã©ãã£ã¬ã¯ããªæ§æã®å®äŸãæããŠäººé¡ã«è²¢ç®ããã | M3 Tech Blog Sansan Labs éçºã§ã® Terraform ãã£ã¬ã¯ããªæ§æ | Sansan Builders Blog åæãšã㊠æåããå
šãŠã®AWSãªãœãŒã¹ãTerraformã§æ§æç®¡çããããšã¯è«Šãã AWSäžã§ã¯Terraform以å€ã§ãã§ã«æ§æç®¡çãããŠãããªãœãŒã¹ãããããã管çãããŠããªããã®ãååšããŠããŸããããããäžæã«ãŸãšããŠTerraformãžç§»è¡ããã®ã¯é£ãããšæããã®ã§ ãŸãã¯ç€Ÿå
ããŒã«ãªã©ãµãŒãã¹ã«çŽæ¥åœ±é¿ã®ãªããã®ããå°ããã¯ããã éçšã®åœ¢ãå®ãŸã£ãŠãããåŸã
ã«Terraformãžç§»è¡ããŠãã ãšããåæã§é²ããŠããŸãã tfstateã®åãæ¹ãšãã£ã¬ã¯ããªæ§æ ãã£ã¬ã¯ããªæ§æã¯ä»¥äžãšãªããŸãã . âââ prd â âââ projectA â â âââ terraform.tf â â âââ main.tf â â âââ variables.tf â âââ projectB â âââ terraform.tf â âââ main.tf â âââ variables.tf âââ stg â âââ projectA â â âââ terraform.tf â â âââ main.tf â â âââ variables.tf â âââ projectB â âââ terraform.tf â âââ main.tf â âââ variables.tf âââ dev ... âââ modules âââ moduleA â âââ README.md â âââ main.tf â âââ outputs.tf â âââ variables.tf âââ moduleB â âââ README.md â âââ main.tf â âââ outputs.tf â âââ variables.tf ... æ¹éãšããŠã¯ä»¥äžã«ãªããŸãã 1. ç°å¢ããšã«ãã£ã¬ã¯ããªãåãã BASEã§ã¯å€å°ãªããšãç°å¢éã§ã®å·®åããããŸããworkspaceã®å©çšãæ€èšããŸãããããã®å Žåå·®åãåžåããããã®ããžãã¯ãæžãå¿
èŠããããããã£ãŠåããã«ãããªãããã§ããããã®ãããã£ã¬ã¯ããªã§ç°å¢ãåããããã«ããŸããã 2. tfstateã¯ç°å¢ããšã§ã¯ãªãprojectããšã«ã〠projectãšããåäœã¯ããªãããã®æå³ãæã£ããªãœãŒã¹çŸ€ããšãã£ãæå³åãã§äŸ¿å®äžäœ¿ã£ãŠããŸãã åæãšããŠç€Ÿå
ããŒã«ãªã©ãµãŒãã¹åœ±é¿ã®å°ãªããã®ããå°ããå§ããŠãããããšããã®ããããŸããç°å¢åäœã§tfstateãæã£ãŠããŸããšã圱é¿ç¯å²ã倧ãããªãããšããããã®åæããå€ããŠããŸããŸãããã®ããtfstateã¯projectããšã«æã€ããã«ããŸããã 3. moduleãå©çšãã resource ã¯moduleã«æžããŠãprojectã®tfãã¡ã€ã«ããåŒã³åºã圢ããšã£ãŠããŸããããã«ããç°å¢ã®è€è£œã¯moduleã«æž¡ã倿°ã®å€ã倿Žããã ãã§è¯ããªããŸãã ãã ãã®å Žåãã©ããŸã§moduleã«æ±çšæ§ãæããããé£ãããšããã§ã¯ãããŸãããŸãè€æ°ã®projectããåäžmoduleãåŒã³åºããŠããå Žåãmodule倿Žã«ãã圱é¿ç¯å²ã倧ãããªã£ãŠããŸããŸãããã®èŸºãã¯ç¹ã«éçšããªããæ¹åããŠãããã€ã³ãããªãšèããŠããŸãã ãã®ä»åãå
¥ããããš 1. Terragruntã®å°å
¥ Terragrunt ãšããTerraformã®ã©ãããŒããŒã«ãå°å
¥ããŸãããããã¯backendå®çŸ©åšãã®ã³ãŒããDRYã«ä¿ã€ããã§ãã ãšããã®ãtfstateãç°å¢åäœã§ã¯ãªãprojectåäœã§æãããã®ã§ãbackendã®å®çŸ©ãprojectåäœã§æžãå¿
èŠããããŸãããã®å Žåã«projectæ¯ã§ããããæžãã®ãé¢åãªã®ãšãèšå®ãã¹ãèµ·ããããšãæžå¿µããããã§ãã Terragruntã®å°å
¥ã«ããã£ãŠã¯ã以äžèšäºã倧å€åèã«ãããŠããã ããŸããã TerragruntãŠãTerraformã®backendåšãã®ã³ãŒãããDRYã«ãã | Developers.IO 以äžã¯ãã»ãŒèšäºã®å
容éãã«å®è·µãããã®ã«ãªããŸãããå
·äœçãªãã£ã¬ã¯ããªæ§æãšãã¡ã€ã«ã®å
容ã§ãã . âââ prd â âââ projectA â â âââ terragrunt.hcl â â âââ terraform.tf â â âââ main.tf â â âââ variables.tf â âââ projectB â â âââ terragrunt.hcl â â âââ terraform.tf â â âââ main.tf â â âââ variables.tf â âââ terragrunt.hcl âââ stg â âââ projectA â â âââ terragrunt.hcl â â âââ terraform.tf â â âââ main.tf â â âââ variables.tf â âââ projectB â â âââ terragrunt.hcl â â âââ terraform.tf â â âââ main.tf â â âââ variables.tf â âââ terragrunt.hcl âââ dev ... åç°å¢ãprojectããšã«terragrunt.hclã远å ãããŠããŸãã ãã®ãã¡ã€ã«ã«Terragruntã®èšå®ãæžããŠãããŸãã ç°å¢ããšã®terragrunt.hcl {env}/terragrunt.hcl remote_state { backend = "s3" config = { bucket = "test-aihara-terraform-tfstate" key = "${path_relative_to_include()}.tfstate" region = "ap-northeast-1" dynamodb_table = "test-aihara-terraform-tfstate-lock" } } path_relative_to_include()ã¯èŠªãã£ã¬ã¯ããªããåãã£ã¬ã¯ããªãžã®çžå¯Ÿãã¹ãè¿ããŸãã https://terragrunt.gruntwork.io/docs/reference/built-in-functions/#path_relative_to_include projectããšã®terragrunt.hcl {env}/{project}/terragrunt.hcl include { path = find_in_parent_folders() } find_in_parent_folders()ã¯èŠªãã£ã¬ã¯ããªããterragrunt.hclãæ¢ããŠããŠèªã¿èŸŒãã§ãããŸãã https://terragrunt.gruntwork.io/docs/reference/built-in-functions/#find_in_parent_folders äŸãã°ãã®å Žåã ãš{env}ãã£ã¬ã¯ããªã«ããterragrunt.hclãèªã¿èŸŒãããšã«ãªããŸããããããããšã§projectããšã«ãããbackendã®å®çŸ©ã¯ãåãå
容ã®terragrunt.hclãçšæããã ãã§æžã¿ãŸãã 2. terraformã§äœãããããšããããããã«tagãã€ãã AWSäžã§ã¯Terraformã§æ§æç®¡çããããã®/ããã§ãªããã®ãæ··åšããŠããããšã«ãªããŸãããã®æãã©ããTerraformã§äœãããã®ããããããã«ç¹å®ã®tagãã€ããããã«ããŠããŸãã äŸãã°ä»¥äžã®ããã« terraform: true ã®tagãã€ããããã«ãããªã©ããŠããŸãã resource "aws_security_group" "security_group" { name = var.name description = var.description vpc_id = var.vpc_id tags = { "terraform" = "true" } } ãããã« åè¿°ãããšããTerraformã®å°å
¥ã¯ãŸã 瀟å
ããŒã«ããµãŒãã¹åœ±é¿ã®ãªããã®ã«çãŸã£ãŠãããŸãã äžæŠæ¹é決ãã¯ãããã®ã®ãtfstateã®åãæ¹ããã£ã¬ã¯ããªæ§æã«é¢ããŠãŸã 詊è¡é¯èª€ããŠãããšããã®ãçŸç¶ã§ããããã«é¢ããŠæ±ºãŸã£ãæ£è§£ã¯ãªããšæããŸãããéçšãç¶ããŠããäžã§ç¶ç¶çã«æ¹åãããçµç¹ããµãŒãã¹ã«ãã£ããããããã«ããŠãããã°ãšæããŸãã ææ¥ã¯Product Dev DS Groupã®éŽæš(@rmarl)ããã§ãïŒã楜ãã¿ã«ã
ãã®èšäºã¯BASE Advent Calendar 2020ã®2æ¥ç®ã®èšäºã§ãã devblog.thebase.in ããã«ã¡ã¯ãBASEã®ããã³ããšã³ãããŒã ãšã³ãžãã¢ã®å è€ã§ãã å
æ¥ãåŒç€ŸæŸåã® ãã¡ãã®ããã° ã«ãŠããæ¢åã®Vue.jsã«ããè³ç£ã¯ç©æ¥µçã«ã¡ã³ããã³ã¹ãã€ã€ããã®æãã®æã§ç·åçã«å€æããŠæé©ãªæè¡ãéžå®ãããã¹ã¿ã³ã¹ã§æã
ã¯èããŠãããšããããšãã話ããŸãããçŽåŸã« Vue.js 3.0ã®æ£åŒãªãªãŒã¹ ããããã¢ããããŒãã«é¢ããŠå®éã«åãçµã¿ãå§ããŠããŸãã çŸåšã€ã¡ãŒãžããŠããæµã çŸåšãBASEã®ãµãŒãã¹ã§äœ¿ãããŠããããŒãžã§ã³ã¯2.6ç³»ã§ãããããã®ã¢ããããŒããšããããšã«ãªããŸãã çŸåšå©çšããŠããVue.jsã«äŸåããUIã©ã€ãã©ãªãããªããŒã·ã§ã³ã©ã€ãã©ãªã3系察å¿ã§å€§ããAPIãå€ããããšãäºæ³ãããäžæ°ã«å
šãŠã®äœ¿çšç®æã§ããŒãžã§ã³ãã¢ããããŒãããããšã¯å°é£ã ãšæããŠããŸãã ããã§ã次ã®ãããªæµãã§é²ããŠããããšãçŸåšèšç»ããŠããŸãã Deprecatedãªæ©èœã®çœ®ãæãäœæ¥ 瀟å
UIã©ã€ãã©ãªã®Vue.js3系察å¿çã®éçº monorepoåãšããã«éããäŸåé¢ä¿ã®åæŽç packageããšã«ããŒãžã§ã³ã䜿ãåããåŸã
ã«ç§»è¡ Vue.jsã䜿çšããŠããBASEã®ã·ã§ããåã管çç»é¢ã§ã¯ã ãã¡ãã®ããã° ã«ããããã«ãæ©èœåäœã§ãšã³ããªãã€ã³ããååšããMPAã§ãããšããåæããããŸãããã®åäœã§packageãåå²ããããããã§Vue.jsã®ããŒãžã§ã³ã䜿ãåããããšã§æ®µéçãªã¢ããããŒãã®å®çŸãèããŠããŸãã ä»åã¯ãçŸåšé²è¡äžã®ãDeprecatedãªæ©èœã®çœ®ãæãäœæ¥ãã«ã€ããŠã話ããŸãã 察象ç¯å² Vue.js 3ã®ãã€ã°ã¬ãŒã·ã§ã³ã«é¢ããããã¥ã¡ã³ã ããåç
§ããŸãã åè¿°ã®éãpackageããšã«ã¢ããããŒããããšããäºå®ã§ãããäºåã«å¯Ÿå¿ã§ãããã®ãããã°ãã£ãŠãããããšããã§ããä»å察å¿ãããã®ã¯ããã®äžã§ã眮ãæããæ©èœããã§ã«2.6ç³»ã«ååšããŠãããã3ã«ã¢ããããŒããããšãå¥ã®ä¿®æ£æ¹éãååšããããã®ã®ã¿ãã¿ãŒã²ããã«ããŸããã filterã®å»æ¢ Functional Componentã®å»æ¢ slot屿§,slot-scope屿§ã®å»æ¢ (2.6ã«ãŠDeprecatedãšãªã£ãŠããŸãã3ã§æ£åŒã«å»æ¢ãããŸã) EventEmitterç³»ã®APIïŒ$on, $off, $onceïŒã®å»æ¢ã«äŒŽãå¯Ÿå¿ ä»¥äžãäžæŠå¯Ÿå¿ãã¹ããã®ãšããŠæŽãåºãããŸããã äºåæºå åŒç€Ÿå³äº¬ã® ãã¡ãã®ããã° ã§èšå®ããŠããã£ãããã«ãESLintã®eslint-plugin-vueãã©ã°ã€ã³ã§éæšå¥šã®æ©èœãæ©æ¢°çã«å€å®ããŸãããŸããfixãªãã·ã§ã³ã§ä¿®æ£ã§ãããã®ã¯ä¿®æ£ããŠããŸãããã以å€ã®ä»¥äžã¯æåã§ä¿®æ£ããŠåããŸãã å®éã®ä¿®æ£ filterã®å»æ¢ ã©ã®ããã«ä¿®æ£ããã ã¡ãœããã«çœ®ãæãã 察å¿ããeslint-plugin-vueã®ã«ãŒã« vue/no-deprecated-filter 泚æç¹ ããã§ã¯åãªãã¡ãœããã«çœ®ãæããŸããå Žåã«ãã£ãŠã¯ãç®åºããããã£ã§ãã®åŠçãèšè¿°ããŠããã»ããè¯ããããªå®è£
ãèŠãããŸãããã察å¿ãçµ±äžãããããäžæŠæ¹éãšããŠä»åã¯ã¡ãœããã§å®è£
ããŠããŸãã éé¡è¡šç€ºã倿ããfilterããã䜿ãããŠããŸãããããããã¯Mixinçµç±ã§Vueã®prototypeã¡ãœãããšããŠãç»é²ãããŠããã®ã§ãã¡ãã«çœ®ãæããŸããã Functional Componentã®å»æ¢ ã©ã®ããã«ä¿®æ£ããã éåžžã®ã³ã³ããŒãã³ãã«æžãæãã 察å¿ããeslint-plugin-vueã®ã«ãŒã« vue/no-deprecated-functional-template 泚æç¹ 颿°åã³ã³ããŒãã³ãã¯ã€ã³ã¹ã¿ã³ã¹ãæããªã(thisã®ã³ã³ããã¹ããç¡ã) ãããrender颿°å
ã«contextãšãããªããžã§ã¯ããæž¡ãããããããpropsãªã©ãåç
§ãããšãã£ãã³ãŒãã«ãªã£ãŠããŸããæ³šæããªããããããæ®éã®SFCã«æžãæããŸããã å®ã¯ãã®å¯Ÿå¿ã§1ã€ãã°ãåºããŠããŸã£ãã®ã§ã詳ããã話ããŸãã æã
ã¯VeeVelidateãšããããªããŒã·ã§ã³ã©ã€ãã©ãªããµãŒãã¹å
šäœã§å©çšããŠããŸãããã®ã©ã€ãã©ãªã§ã¯åã³ã³ããŒãã³ãã«ç¬èªã®ããªããŒã¿ã¹ã³ãŒããããã芪åã³ã³ããŒãã³ãã§ã®ããªããŒã·ã§ã³çµæãå
±æããããã«ã$validatorãšãã倿°ã芪ããinjectãªãã·ã§ã³ãå©çšããŠæ³šå
¥ããããšã§ããªããŒã·ã§ã³ã¹ã³ãŒããå
±æããããšããããšããããªã£ãŠããŸãã ããšãã°ãããã£ãparentã³ã³ããŒãã³ãããã£ãå Žåã <template> <child> <grandchild /> <grandchild /> <grandchild /> </child> </template> childã³ã³ããŒãã³ãå
ã§injectãªãã·ã§ã³ãå©çšããããšã§ãgrandchildã³ã³ããŒãã³ãã«ãŠ$validatorãåç
§ããããšãåºæ¥ãããã«ãªãã芪ããåã®ããªããŒã·ã§ã³ãå®è¡ããããšãã§ããããã«ãªããŸãã ä»åã®ãã°ã¯ãããã£ãã±ãŒã¹ã§Functionalã³ã³ããŒãã³ããããã§ãªããã§æåãå€ãã£ãŠããŸã£ãããšãããã®ã§ãã ããšãã°ãäžèšã®grandchildã³ã³ããŒãã³ããFunctionalã³ã³ããŒãã³ãã§ãã£ãå ŽåãèããŠã¿ãŸããFunctionalã³ã³ããŒãã³ãã«ã¯ã€ã³ã¹ã¿ã³ã¹ããªãããã芪ã®ã¹ã³ãŒãã§ããã«è©äŸ¡ãããŸãããã®ãšãã®èŠªã®ã¹ã³ãŒããšããã®ãããããããã®ã§ãã childã§ã¯ãªãparentã³ã³ããŒãã³ãã«ãªããŸã ãçæãããvnodeãã¹ãããã³ã³ãã³ããšããŠparentã«æž¡ãããããã§ãã ããã¯ãchildãã¬ã³ããªã³ã°ãããåã«ãgrandchildã³ã³ããŒãã³ãããã§ã«å®è¡ãããŠããããšããããšã§ããã§ããããchildã³ã³ããŒãã³ãã§injectãããã«ãã§ããªãããšããããšãçºçããŸãã ãšããããšã§ãgrandchildãFunctionalã³ã³ããŒãã³ãã ã£ãåœæã¯å®è£
è
ãparentã³ã³ããŒãã³ãã§$validatorãinjectããŠäºãªããåŸãŸããã ãããç¥ããã«ãã®ãŸãŸFunctionalã³ã³ããŒãã³ãããã®ãŸãŸéåžžã®ã³ã³ããŒãã³ãã«çŽããŠããŸããšãåœç¶æå³ããªãåäœã«ãªããŸããéåžžã®ã³ã³ããŒãã³ãã¯ã芪ã³ã³ããã¹ãã§ããã«ã¯ã¬ã³ããªã³ã°ããããchildã®ã¬ã³ããªã³ã°ãµã€ã¯ã«äžã«ã¬ã³ããªã³ã°ãããŸããã€ãŸãchildã³ã³ããŒãã³ãã«å¿
èŠãªãã®ãinjectããå¿
èŠããããšããããšã§ãã ãã¡ãã®issueã³ã¡ã³ã ããã®çŸè±¡ã詳ãã説æããŠããŸãã slot屿§,slot-scope屿§ã®å»æ¢ ã©ã®ããã«ä¿®æ£ããã ãããããslot屿§ã§ã¯ãªãv-slotãã£ã¬ã¯ãã£ãã«ãslot-scope屿§ã§ã¯ãªãããããã£ãåãåãv-slotãã£ã¬ã¯ãã£ãã«æžãæãã 察å¿ããeslint-plugin-vueã®ã«ãŒã« vue/no-deprecated-slot-attribute vue/no-deprecated-slot-scope-attribute 泚æç¹ eslint --fix ã«ãŠäžéšèªåã§ä¿®æ£ã§ããŸãããv-slotãã£ã¬ã¯ãã£ãã¯templateã¿ã°ã«ããå©çšã§ããªãã®ã§ãtemplateã¿ã°ä»¥å€ã«slot屿§ã䜿ãããŠãããã®ã¯èªåä¿®æ£ã§ããŸããããããä¿®æ£ãšããŠã¯äžçªæ°ãå€ãé¢åã§ããã 1ã€ããã£ããã€ã³ããªã®ã§ãããslot屿§ã§æž¡ãèŠçŽ å
ã§thisãåç
§ãããšãã«ãslot屿§ã§ããã°åããã®ããv-slotãã£ã¬ã¯ãã£ãã§ã¯åããªãããšããäºè±¡ããããŸãããäºåã«ãããããã¹ãŠä¿®æ£ããŠããslot屿§ãä¿®æ£ããå¿
èŠããããŸãããã¡ã㯠vue/this-in-template ã®ã«ãŒã«ã«ãŠãã§ãã¯ã§ããŸãã®ã§æ
ãŠãŠè¿œå ããŸãããå
ã
thisã®äœ¿çšã¯çŠæ¢ãããŠããã¯ããªã®ã§ãããæ©äŒã§ããã ãŸãšã Deprecatedãªæ©èœã®çœ®ãæãã«é¢ããŠã¯ã以äžãæ®ã察å¿ããäºå®ã§ãã Event Emitterç³»ã®APIïŒ$on, $off, $onceïŒã®å»æ¢ã«äŒŽãå¯Ÿå¿ å®ã¯ä»åã話ãããã®ããŸã ãã¹ãŠã¯çŽããããŠããªãã®ã§ãåŒãç¶ã察å¿ãç¶ããŠãããŸãã ãã®äœæ¥ãçµäºæ¬¡ç¬¬ãåè¿°ã®æµãã«æ²¿ã£ãŠç§»è¡ããŠããäºå®ã§ãã ãŸãã2021 1Qã«äœæ¥ãããäºå®ã®2.7ã¯ã3系移è¡ã®ããã®æ¯æŽãšãªãæ©èœã远å ãããããšãäºå®ãããŠããŸãããŸã2.7ã«ç§»è¡ããããšã§ãããœããã©ã³ãã£ã³ã°ãªã¢ããããŒãã«ãªãã®ã§ã¯ãªãã§ãããããã¿ã€ãã³ã°ã«ãã£ãŠã¯æ¢åã®2.6ç³»ã2.7ã«ã¢ããããŒãããŠãã3ç³»ã«é²ããããšãèããŠããããšæã£ãŠããŸãã ææ¥ã¯Product Dev SREããŒã ã®çžåããã§ãããæ¥œãã¿ã«ã
ãã®èšäºã¯2020幎 BASEã°ã«ãŒãã®ã¢ããã³ãã«ã¬ã³ããŒïŒæ¥ç®ã«ãªããŸãã devblog.thebase.in BASEæ ªåŒäŒç€Ÿåç· åœ¹EVP of Developmentã®è€å·ã§ããåããåäŒç€Ÿã§ããPAYæ ªåŒäŒç€Ÿã®åç· åœ¹ãBASE BANKæ ªåŒäŒç€Ÿã«ãé¢ãã£ãŠãããã°ã«ãŒã暪æã§ã¹ã ãŒãºãªçµç¹éå¶ãšãµãŒãã¹éçºãå®çŸããã°ã«ãŒãã·ããžãŒãéããããªã¥ãŒã¢ãããæèããŠä»äºãããŠããŸãã ãŸã 12æã®é ã§å°ãæ©ãã¿ã€ãã³ã°ã§ã¯ãããŸããã2020å¹Žãæ¯ãè¿ã£ãŠãããããšæããŸãã 2020幎ã£ãŠã©ããªå¹Žã ã£ã ããã¯ãã°ãæã
ã®äŸ¡å€ã®åºãæ¹ã®æœ®ç®ãå€ãã£ãã¿ã€ãã³ã°ã ãšèããŠããŸããã°ã«ãŒãã®çãäžã«ããBASEãšãããµãŒãã¹ã¯ããµãŒãã¹ãäœã£ãŠããä»å¹Žã®é ãŸã§ã誀解ãæããã«èšãã°ã代衚ã®é¶Žå²¡ãäœã£ããµãŒãã¹ã³ã³ã»ããããããŠãããäœçŸãããŠãŒã¶äœéšãå¹³ããèšãã°ãã¶ã€ã³æ§ã«æ¯ããããŠãããµãŒãã¹ã ã£ãããã«ä»ãèãããšæããŸããä»ã©ãã§èšãBizDevãšãµãŒãã¹ãã¶ã€ã³ãåªããŠãããšè¡šçŸãããšããããããã§ããããã ãããŸã§ã®ãšã³ãžãã¢é£ã®ä»äºã¯ããããŠå€§ãããªè¡šçŸããããšããã®ç°å¢ãç¶æéå¶ããããžãã¹ã®èªç¶æé·ãæ¯ããããšã§äŒç€Ÿãäžå ŽãããšãããŸã§æ¥ãããããªå°è±¡ããæãããšããããŸãã ãšãããã³ããçŠã«ãããŠå¢ããããã©ãã£ãã¯ãæ¯ããŠããã·ãŒã³ãç®ã®åœããã«ãããã®ãŸãŸã ãšãã®å
ã®5å10åãã以äžã®æé·ã«ãããŠå£ãåºãŠãããã ãšèããã®ã2020幎ã«èµ·ããããšã§ããã ãã®èŸºãæè¡çãªèšèã§å·éã«æžããã®ãCTOå·å£ã®èšäºã§ã¯ãããŸãã devblog.thebase.in ãã®çµéšãéããŠãèãæ¹ãå€ãã£ãã¯å€§ãããŸã§ãããããŸã§åŸã
ã«èªåãã¡ãäœã£ãŠããæ¡çšåºæºãæ¢åã¡ã³ããŒã®æé·ã«ã€ããŠãå床èšèªåããããšã«ãªããCTOã責任ãæ
ããµãŒãã¹æè¡ãšããããŒãžã£ã¡ã³ããŒã責任ãæ
ãããŒã ãããžã¡ã³ããäžäœåããŠåãçµãããšãå§ããã®ã2020å¹Žã®æå€§ã®å€åã ã£ããšæããŸãã ãããŸã§ã¯ãã©ãããµãŒãã¹ãäœããšããåãçµã¿ãšãæè¡ãè¯ãããŠãããšããåãçµã¿ãããããããåŸæãªäººã忥ããŠããã°ã§ããããããªããïŒãšèããŠãããšããããããŸããããããã§ã¯æé·ããŠãããµãŒãã¹ãæ¯ããããªãããã®ãµãŒãã¹ã«æºããã¡ã³ããŒå
šå¡ãããã£ããæè¡ã®ããšãæèããåªããæè¡åãç€ã«è¯ããµãŒãã¹ãäœã£ãŠãããšãã圢ã«ããªããšãããªããšããããšã匷ãèªèãããããããšã«ãªããŸããã æ°åã³ããã«ããç€ŸäŒæ
å¢ã®å€åã¯ãšãŠãæãŸãããã®ã§ã¯ãããŸããããã³ããçŠã«ãããŠçºçããæ¥éãªç€ŸäŒã®ããžã¿ã«ã·ããã®æ³¢ã®äžã§ãæã
ã«ãšã£ãŠã®çããèš±ãããªããªã£ãã¿ã€ãã³ã°ã ãšãèšããŸãã devblog.thebase.in ãšã³ãžãã¢ãªã³ã°åã®åºäžãã«ã€ããŠã¯ãæè¡æè³ãšããŠä»èŸŒãã§ãããã®ããããåŒãç¶ãCTOã®å·å£ããªãŒããã圢ã§ãããŒãžã£é£ãããŒã ã¡ã³ããŒãšé£æºããªããé²ããŠããããšã«ãªããŸãããã®ææã«ã€ããŠã¯ãŸãæ¥å¹Žã®æè¡ããã°ã§ç¶ç¶çã«ãå ±åããŠåããŸãã basebook.binc.jp 2021幎ã¯ã©ããªã éçºããŒã ã«ãããŠã¯ãéé£ç¶çãªæé·ãæ±ãããã1幎ã«ãªããããããŸããã ããã¯ä»åŸèµ·ããããçµç¹ã®æé·ã人ã®å¢å ã«ãã£ãŠãèµ·ããããã§ãããè»èœ¢ãã©ããã£ãŠãããžã¡ã³ãããŠãããïŒãšããèŠç¹ã§ãã£ããã人ãå¢ããããšã§è²¬ä»»ãæç¢ºåãããŠããã§ãããCTOãå§ããšããæè¡è²¬ä»»è
çŽã®äººãã¡ã®è¡åãæè¡ã人éã«ãããæé·ãæ±ããŠããããšã«ãªãæ°ãããŠããŸãã 2020幎ãŸã§ã®åèªèº«ã¯ããããŠèªè² ããããŠããã ããšãããŸããŸãªåé¡ã«ã€ããŠãã©ãã«ãããŸãç«ã¡åã£ãŠè§£æ±ºãããšããè¡åãããŠããããã«æããŸããæ°ããåé¡è§£æ±ºã®ããã«äœå¶ãäœããšèšã£ããã€ã³ãã¥ããŒã·ã§ã³ã®ããã»ã¹ã«ãããŠã¯ãã²ãšãŸãèªåã§æãåãããŠãããã¿ã€ããäœã£ãŠç¥èŠããŸãšããŠãããããžã§ã¯ããçµç¹ãšããŠäººã«ç§»è²ããããšããããããŸãã¯ãããããªäººéã«ä»äºãä»»ãåããŠãããããšã§ãææãåºãã人ãããã°ãããã§ãªã人ãããŠäžç¢ºå®ãªã€ã·ã¥ãŒã解決ããããšã«å¯Ÿãããã£ã¬ã³ãžãããŠããŸããã ãã£ã¬ã³ãžãã®ãã®ã¯åŒãç¶ãç¶ããŠãããŸãããããããæ··æ²ã®äžã§æé·ããŠããŠããã人ã«ãæç¢ºãªè²¬ä»»ãæž¡ããŠã責任è
ãšããŠããŒã ãšããŠãŸãšããŠããããšãæ±ããŠãã幎ã«ãªãããã§ãã åèªèº«ã¯ããã®äžã§èµ·ããããŸããŸãªããšã«ç®ãåããŠãéçºã¡ã³ããŒå
šå¡ãBe Hopefulã«åãç¶ãããã€Speal Openlyã«èªç±ã«çºèšã§ããéçºè
çéã§å«ã°ããå¿ççå®å
šæ§çãªããã®ãç¶æããªãããã¡ã³ããŒã®æé·ãå®çŸããçµæãšããŠãµãŒãã¹éçºãæåã«å°ããšããã®ãä»äºã«ãªãã ãããªãšæã£ãŠããŸãã ããã«ããæ°ãã«èª²é¡ãå¢ãããå
±æããããã解決ããããã«æ°ãã«äººãè¿ããŠããŒã ã倧ãããªã£ãŠããã€ãã¬ãŒã·ã§ã³ãæããŠãããšããã®ããçµç¹ã®æ£åžžé²åãšæã£ãŠããŸãã®ã§ããã®ããšãèºããªãããã«ãã£ãããã£ãŠãããšããã®ããåŒãç¶ãã®èª²é¡ã«ãªããŸãã devblog.thebase.in PAYãšBASE BANKã«ã€ã㊠æè¡ããªãã³ã§ãµãŒãã¹éçºè
åãã®æ±ºæžAPIãæäŸããPAYããŒã ã¯ãåŒãç¶ãå°æ°ç²Ÿéã®æè¡è
ãäžå¿ã«ãµãŒãã¹æäŸãç¶ããŠããããšã«ãªããŸãã2020幎ã®ã³ããçŠã«ãããŠã¯ãBASEã®æ±ºæžå®å®æ§ã®ããã«PAYã®ã¡ã³ããŒã«ãå€ã
ãå°œåããã ããŸãããBASEãšãããµãŒãã¹ãæ³å®ä»¥äžã«æé·ããããšã§ãPAY.JPãµãŒãã¹ã«ãããBASEã®é¢äžåºŠã倧ãããªããããŠããŸããã¡ã³ããŒã«å¯ŸããŠå€§ããªè² æ
ããããŠããŸã£ããšããã®ãäžã€ãããŸãããããããã®çµéšãç€ã«PAY.JPã®ããäžå±€ã®å®å®éçšã«å¯äžããã¹ããSREã®æ¡çšãªã©ãé²ããŠããŸãã BASE BANKã¯2020幎ã§ä»²éãé 調ã«å¢ããŠããã®ããªã«ãããã®ç¹åŸŽã§ããBANKããŒã ã¯ããããã¯ããããŒãžã£ã®æ³å·ãšãããã¯ãªãŒãã®æ±å£ãå
ã
BASEéçºããŒã ã®ã³ã¢ã¡ã³ããŒã ã£ãããšãããBASEãšåŒ·ã飿ºãããµãŒãã¹ãäœãããšã«æ
£ããŠããŸãããåŸããå
¥ã£ãŠããã¡ã³ããŒãGoèšèªãšããããŒã¯ãŒãã§ã®å
¥ç€Ÿãç¡èŠã§ããªãã£ãã«ãé¢ããããPHPã§æžãããBASEåŽã®ãµãŒãã¹ã«ããã£ã€ãæºãã£ãŠããããªã©ãæèã®é«ãæè¡è
éå£ãšããŠæŽ»èºããŠããã£ãŠããŸããBANKèªäœã®ããžãã¹ã®ä¿é²ãããããšãªãããBASEãµãŒãã¹ã®ã·ã§ããã§å£²äžãçºçããåŸã®åãåãã«ã€ããŠããã£ãããœãªã¥ãŒã·ã§ã³ã匷åããŠãããã·ã§ããã®æé·ãæ¯ããŠãããšããä»åŸã®æŽ»èºã楜ãã¿ã§ããããã£ããããªã¥ãŒãå®çŸããŠãããããšæã£ãŠããŸãã åèªèº«ã¯ã©ããªããã ããç¬ èªåã2021ã«ã©ããªããšãã©ãããããšãã¯ãããŸãããããããªãã§ãã ç¬ å®çŸãã¹ãèšç»ãã®ãã®ã¯ãã£ããååšããŠããŸããããããããã£ããå®çŸããŠããã®ã¯åœããåã§ããããã以å€ã«èµ·ãããããããªããšããã£ããåé¡è§£æ±ºããŠãããäœåãæã¡ãªãããæ¥åžžãçããŠããããããªã€ã¡ãŒãžãæã£ãŠããŸããPMIã§ã²ãŒã²ãŒèšã£ãŠããããªè¿ããæªæ¥ããŸãããã®ã§ã¯ãªãã§ããããïŒãããã¯èŠæããŠããŸãããã®éã«ã¯æ¥çã§ã®çµéšè
ïŒå€§äœCTO/VPoEçµéšè
ããªïŒã«ã¯æ¡çšãªãã¡ãŒãæ¥åå§èšçã
ã§ãçžè«ããããšããããšæããŸãã®ã§ããã®éã«ã¯ãããããé¡ãããããŸãã 2020幎ããŸãããããªããšã«ãªããªããŠæã£ãŠãã¿ãŸããã§ããããæ¥å¹ŽããŸãèªåãã¡ã®æé·ãä¿ãããé£ããåé¡ãåºãŠããŠãããããã£ããè§£ããŠãããæ©äŒããã£ãããããã¯ããã§æ¥œããããããªãããšæã£ãŠããŸããæã
ã¯ãŸã ãŸã ã¹ã¿ãŒãã¢ããã§ãããäžå ŽããŽãŒã«ã§ã¯ãªããµãŒãã¹ã®ç€ŸäŒçä¿¡çšãåŸãããã®ããã»ã¹ã§ãããªããšæããŸããã·ã§ãããªãŒããŒããã¯ãã¡ããã®ããšç€ŸäŒããã®æåŸ
ã«ãã£ããå¿ããŠããéçºçµç¹ãäœã£ãŠããããšã責åã ãšæã£ãŠããŸãã®ã§ããŸãããããèµ·ããããšã楜ãããªãšã äœãèµ·ããªãã®ãäžçªéå±ã§ã¢ãããŒã·ã§ã³ãäžããæ··æ²loverãªã¿ã€ããªã®ã§ãããå€åã«ãã£ãŠã¡ã³ããŒãèºãããããã®ã¯èŠãããªãã§ãããæ
éãã€å€§èã«ãã£ããç¶æ³ãã¢ãã¿ãªã³ã°ããŠãããªãããäœãåé¡ãèµ·ããŠãå°ããªãã¡ã«çºèŠãã解決ããŠããã€ãã¬ãŒã·ã§ã³ãåããšããã®ã¯å€ãããªããšæã£ãŠããŸãã
ããã«ã¡ã¯ãBASE BANK æ ªåŒäŒç€Ÿ Dev Division ã«ãŠã Software Developer ãããŠããæ±å£ïŒ @hgsgtk ïŒã§ãã TL;DR AWS ã®ãããŒãžãè
åšæ€åºãµãŒãã¹ã§ãã Amazon GuardDuty ãæå¹åããå Žåãå
šãªãŒãžã§ã³ã«å¯ŸããŠèšå®ããããšãæšå¥šããã Amazon GuardDuty ãå
šãªãŒãžã§ã³ã§æå¹åããæ€åºããå
容ã Slack ã«éç¥ãããŸã§ã®æ§æã説æã»ãããå®çŸããå
·äœç㪠Terraform ã³ãŒãã解説ãã èšäºå
¬éæç¹ã§ terraform-provider-aws ã AWS Chatbot ã«å¯Ÿå¿ããŠããªããããäžéš Console ç»é¢ã§äœæãã åœèšäºã®ãµã³ãã«ã³ãŒã㯠ãã¡ã ã«ãŠå
¬éããŠãã Amazon GuardDuty / AWS Chatbotãšã¯ Amazon GuardDutyïŒç¥ïŒGuardDutyïŒã¯æªæã®ããæäœã»äžæ£åäœãã¢ãã¿ãªã³ã°ããããŒã«ã§ããAWS ç°å¢ãå®éçšããå Žåãã»ãã¥ãªãã£äžã®è
åšãå«ãŸããŠããªããç¶ç¶ããŠç¢ºèªããäºãéèŠã§ããããGuardDuty ã¯ã»ãã¥ãªãã£ãã¹ããã©ã¯ãã£ã¹ãšããŠå°å
¥ã§ãã 1 ã€ã®ãµãŒãã¹ã§ãã aws.amazon.com Amazon GuardDuty ã¯ãAWSãã®ã¢ã«ãŠã³ããã¯ãŒã¯ããŒããããã³ãAmazon S3 ã«ä¿åãããããŒã¿ãä¿è·ããããã«ãæªæã®ããã¢ã¯ãã£ããã£ãäžæ£ãªåäœãç¶ç¶çã«ã¢ãã¿ãªã³ã°ããè
åšæ€åºãµãŒãã¹ã§ãã GuardDuty ã¯çºèŠççµ±å¶ã®ãµãŒãã¹ãšãªããŸããçºèŠççµ±å¶ãšã¯æãŸãããªãäºè±¡ãçºçããããšãçºèŠããITçµ±å¶æŽ»åã®äžçš®ã§ããã»ãã¥ãªãã£ä¿è·ã«é¢ã㊠GuardDuty ãã©ã®ãããªåœ¹å²ãæ
ããã«ã€ããŠã¯æ¬¡ã® YouTube åç»ã«ãŠè©³ãã説æãããŠããŸãã www.youtube.com ãããŠãAWS Chatbot ãçšãããš Slack ãã£ã³ãã«ãžã®éç¥ãæéå°ãªãããããã«å®çŸã§ããŸãã aws.amazon.com AWS Chatbot ã¯ãSlack ãã£ã³ãã«ã Amazon Chime ãã£ããã«ãŒã ã§ AWS ã®ãªãœãŒã¹ãç°¡åã«ã¢ãã¿ãªã³ã°ããã³æäœã§ããããã«ããŠãããã€ã³ã¿ã©ã¯ãã£ããšãŒãžã§ã³ãã§ãã ä»åã¯ããã®ïŒã€ã®ãµãŒãã¹ãçµã¿åãããŠæ€åºãããè
åšã Slack ã«éç¥ããã¯ãŒã¯ãããŒã玹ä»ããŸããCloudFormation ã§ã®æ§ç¯äŸã¯ããã€ããã£ãã®ã§ãããTerraform ã§æ§ç¯ããäŸã«ã€ããŠè§£èª¬ããŠããå
容ãã€ã³ã¿ãŒãããäžã«å°ãªãã£ãã®ã§ãTerraform ã§éçšããŠããéçºçŸå Žã®æ¹ã«ãšã£ãŠåèã«ãªãæé ãšãªãã°å¹žãã§ãã åœèšäºã§åºæ¥ãããšãšæ§æå³ åœèšäºã§ã¯ãGuardDuty ããã®æ€åºçµæã AWS Chatbot ãçšã㊠Slack éç¥ããæ§æã玹ä»ããŠããŸãããã®ãããåœèšäºã®å
容ã»ãµã³ãã«ã³ãŒããçšããããšã§æ¬¡ã®ãããªéç¥ã Slack ã§åããããšãåºæ¥ãããã«ãªããŸãã Slackéç¥ã®ã€ã¡ãŒãž ãªããç»åå
ã«ããæ€åºå
容㯠GuardDuty ã®æ©èœã® 1 ã€ã§ãããGenerate sample findingsïŒçµæã®ãµã³ãã«ã®çæïŒãã«ãã£ãŠçæãããµã³ãã«å
容ã§ãã ãããŠããããå®çŸããããã®æ§æå³ã以äžã§ãã æ¬èšäºã§å®çŸããæ§æå³ åãªãŒãžã§ã³ããšã«å¿
èŠãªãªãœãŒã¹ãšãAWS Chatbot ã IAM Role ãšãã£ã Global ãªãã®ãååšããŸãã ãŸããå·çåœæ AWS Chatbot 㯠terraform-provider-aws ã察å¿ããŠããªãããçŽæ¥ Terraform 管çã«ããããšã¯ã§ããŸããã github.com ãã®ãããåœèšäºã§ã¯ãã®æ§æã®äœæã®ããæ¬¡ã®æé ãèžã¿ãŸãã Terraform ã§å
šãªãŒãžã§ã³åã® GuardDuty ã®æå¹åã»éç¥ã¯ãŒã¯ãããŒãæ§ç¯ãã AWS Console ç»é¢ãã AWS Chatbot ãèšå®ãã ãªãã @gainings ããã«ãæç€ºããã ããŸããããCloudFormation ã Terraform 管çããããšã§éæ¥çã« AWS Chatbot ã Terraform 管çäžã«çœ®ããšããæ¹æ³ãããããã§ããBooth ã§è²©å£²ãããŠããã ã¯ã©ãŠãç Žç£ãåé¿ããAWSå®è·µã¬ã€ã ããšããæžç±ã«ãã®æ¹æ³ã«ã€ããŠè©³ãã説æããããŸããã©ã®ãããªæ¹éã§ã³ãŒãåããŠãããã«ãããŸãããAWS Chatbot ãæ§ç¯ããã²ãšã€ã®éžæè¢ã«ãªããŸããã Terraformã§æ§ç¯ãã ä»åã®ãµã³ãã«ã³ãŒãã¯æ¬¡ã®ãªããžããªã«å
¬éããŠããŸãã github.com åœãªããžããªã®æ§æã¯ä»¥äžã§ãã . âââ hgsgtk-dev <- æ§ç¯ããç°å¢ãmoduleãå©çšããŠå
šãªãŒãžã§ã³åèšå®ãã âââ modules âââ chatbot <- AWS Chatbot module âââ guardduty <- GuardDuty module guardduty module GuardDuty ãšãã®éç¥ã¯ãŒã¯ãããŒã®ããã®æ§æèŠçŽ ã¯ä»¥äžã§ãã GuardDuty ã®æå¹å EventBridge(CloudWatch Event)ã®èšå® SNS Topic ã®æå·å SNS Topic ã®äœæ GuardDutyã®æå¹å GuardDuty ã®æå¹åã¯æ¬¡ã®èšè¿°ã®ã¿ã§å®äºã§ãã resource " aws_guardduty_detector " " guardduty " { enable = true } ãã®ä»ãS3 ãžã®ãšã¯ã¹ããŒããªã©æ§ã
ãªèšå®ãå¯èœã§ããåœèšäºã§ã¯éç¥ã¯ãŒã¯ãããŒã®ç޹ä»ãè¶£æšãªã®ã§è©³ãã玹ä»ããŸããããæ°ã«ãªãæ¹ã¯ AWSã®éçºã¬ã€ã ã Terraformã®ããã¥ã¡ã³ã ã確èªããŠãã ããã EventBridge(CloudWatch Event)ã®èšå® EventBridge ã§ã¯ GuardDuty ããã®æ€åºãã€ãã³ããšããŠåãåã£ãŠåŸç¶ã® SNS Topic ãã¿ãŒã²ããã«ãã³ããªã³ã°ããŸãã ãŸã Event Rule ãäœæããŸãã resource " aws_cloudwatch_event_rule " " guardduty " { name = " capture-guardduty " description = " Capture Guard Duty finding events " event_pattern = << EOF { " source " : [ " aws.guardduty " ] , " detail-type " : [ " GuardDuty Finding " ] } EOF } event_pattern ã§èšå®ããå
容ã¯ããã€ãã³ããæ€åºãããããšãæ¡ä»¶ã«ããŠããŸãããããã®èšå®ä»¥å€ã«ãæ€åºå
容㮠severityïŒç·æ¥åºŠïŒãæ¡ä»¶ã«è¿œå ã§ããŸãã docs.aws.amazon.com { " source ": [ " aws.guardduty " ] , " detail-type ": [ " GuardDuty Finding " ] , " detail ": { " severity ": [ 4 , 4.0 , 4.1 , 4.2 , ïŒçç¥ïŒ ] } } çè
ã®çŸå Žã§ã¯æå°éã®èšå®ã§å§ããŠå¿
èŠã«å¿ããŠéç¥å¯Ÿè±¡ã® severityïŒç·æ¥åºŠïŒã調æŽããæ¹éãšããŸããã æ¬¡ã«ãäœæããã«ãŒã«ã§åãåã£ãã€ãã³ãã®éä¿¡ã¿ãŒã²ããã«æ¬¡ã«äœæãã SNS Topic ãèšå®ããŸãã resource " aws_cloudwatch_event_target " " guardduty-sns " { rule = aws_cloudwatch_event_rule.guardduty.id target_id = " guardduty-sns " arn = aws_sns_topic.event_bridge_to_chatbot.arn } SNS Topicã®æå·å 以åãåœéçºããã°ã§ Terraform ã®ã»ãã¥ãªãã£éçè§£æ tfsec ã玹ä»ããŸããã devblog.thebase.in tfsec ã®ææé
ç®ã«ã¯ SNS Topic ã®æå·å ãå«ãŸããŠããŸããã»ãã¥ãªãã£äžã®ãã¿ãŒãã©ã¯ãã£ã¹ã®ã²ãšã€ãšã㊠SNS Topic 㯠Amazon KMS(Key Management Store)ã«ãã£ãŠæå·åããŸãã resource " aws_kms_key " " for_encrypt_sns_topic " { description = " guarddutyããã®eventãåããsns topicæå·åçš " enable_key_rotation = true policy = data.aws_iam_policy_document.policy_for_encrypt_sns_topic.json } resource " aws_kms_alias " " for_encrypt_sns_topic_alias " { name = " alias/guardduty/for_encrypt_sns_topic " target_key_id = aws_kms_key.for_encrypt_sns_topic.key_id } data " aws_iam_policy_document " " policy_for_encrypt_sns_topic " { version = " 2012-10-17 " # defaultã§ã€ããŠããã«ãŒãã¢ã«ãŠã³ãã«å¯Ÿããæš©éèšå® statement { sid = " Enable Root User Permissions " effect = " Allow " principals { type = " AWS " identifiers = [ " arn:aws:iam::${var.aws_account_id}:root " ] } actions = [ " kms:* " ] resources = [ " * ", ] } # events.amazonaws.com ã«å¯Ÿããæš©éãæå·å察象ã®ãµãŒãã¹æäœã«å¿
èŠ statement { sid = " AWSEvents " effect = " Allow " principals { type = " Service " identifiers = [ " events.amazonaws.com " ] } actions = [ " kms:GenerateDataKey ", " kms:Decrypt " ] resources = [ " * ", ] } } 泚æç¹ãšããŠãä»åã®æ§æã§ CloudWatch Event Rule ã®ã¿ãŒã²ãããšããŠèšå®ããå Žåã events.amazonaws.com ã«å¯ŸããŠåŸ©å·åïŒ Decrypt ïŒã»ããŒã¿ããŒã®çæïŒ GenerateDataKey ïŒã®ã¢ã¯ã·ã§ã³ãèš±å¯ããå¿
èŠããããŸãã aws.amazon.com SNS Topicã®äœæ SNS Topic æå·åçšã® KMS Key ãäœæã§ããã®ã§ SNS Topic ãäœæããŸããäœæãã Key 㯠aws_sns_topic.kms_master_key_id ã§èšå®ããŸãã resource " aws_sns_topic " " event_bridge_to_chatbot " { name = " event-bridge-to-chatbot " kms_master_key_id = aws_kms_key.for_encrypt_sns_topic.key_id } resource " aws_sns_topic_policy " " event_bridge_to_chatbot_policy " { arn = aws_sns_topic.event_bridge_to_chatbot.arn policy = data.aws_iam_policy_document.sns_topic_policy.json } data " aws_iam_policy_document " " sns_topic_policy " { version = " 2012-10-17 " # defaultã§ã€ããŠããã«ãŒãã¢ã«ãŠã³ãã«å¯Ÿããæš©éèšå® statement { sid = " __default_statement_ID " effect = " Allow " principals { type = " AWS " identifiers = [ " * " ] } actions = [ " SNS:GetTopicAttributes ", " SNS:SetTopicAttributes ", " SNS:AddPermission ", " SNS:RemovePermission ", " SNS:DeleteTopic ", " SNS:Subscribe ", " SNS:ListSubscriptionsByTopic ", " SNS:Publish ", " SNS:Receive " ] resources = [ aws_sns_topic.event_bridge_to_chatbot.arn, ] condition { test = " StringEquals " variable = " AWS:SourceOwner " values = [ var.aws_account_id ] } } # events.amazonaws.com ãã€ãã³ãçºè¡ããããã«å¿
èŠ statement { sid = " allow_AWSEvents_publish " effect = " Allow " principals { type = " Service " identifiers = [ " events.amazonaws.com " ] } actions = [ " sns:Publish ", ] resources = [ aws_sns_topic.event_bridge_to_chatbot.arn, ] } } ããã§ã¯ã events.amazonaws.com ã«å¯Ÿã㊠sns:Publish ã¢ã¯ã·ã§ã³ãèš±å¯ããå¿
èŠããããŸãã chatbot module AWS Chatbot çšã® module ãçšæããŸãã AWS Chatbot èªäœã¯åè¿°ãããšãã Terraform ã§ã®ã³ãŒã管ç察象å€ã«ãªããŸãããAWS Chatbot ãå©çšãã IAM Role ã¯æ¢åã® IAM ãå©çšã§ããã®ã§ Console ã§äœæããåã« Terraform ã§äœæããŸãã AWS Chatbot ã§ã¯ 4 ãã¿ãŒã³ã®èš±å¯èšå®ããã³ãã¬ãŒãã§çšæãããŠããŸãã éç¥ã®ã¢ã¯ã»ã¹èš±å¯ èªã¿åãå°çšã³ãã³ãã®ã¢ã¯ã»ã¹èš±å¯ Lambda åŒã³åºãã³ãã³ãã®ã¢ã¯ã»ã¹èš±å¯ AWS ãµããŒãã³ãã³ãã®ã¢ã¯ã»ã¹èš±å¯ ä»åã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ããéç¥ã®ã¢ã¯ã»ã¹èš±å¯ããæš©éãšããŠã〠IAM Role ãäœæããããšã«ãªããŸãã resource " aws_iam_role " " chatbot-notification-only " { name = " chatbot-notification-only " assume_role_policy = jsonencode ( { Version : " 2012-10-17 ", Statement : [ { Sid : "", Effect : " Allow ", Principal : { Service : " chatbot.amazonaws.com " } , Action : " sts:AssumeRole " } ] } ) description = " AWS Chatbot Execution Role for Only Notification " } resource " aws_iam_role_policy_attachment " " chatbot-notification-only-attach " { policy_arn = aws_iam_policy.chatbot - notification - only.arn role = aws_iam_role.chatbot - notification - only.name } resource " aws_iam_policy " " chatbot-notification-only " { name = " chatbot-notification-only " policy = jsonencode ( { Version = " 2012-10-17 " Statement : [ { Sid : "", Effect : " Allow ", Action : [ " cloudwatch:Describe* ", " cloudwatch:Get* ", " cloudwatch:List* " ] , Resource : " * " } ] } ) } äœæãã IAM Role ã«çŽã¥ã IAM Policy 㯠AWS å
¬åŒããã¥ã¡ã³ãå
ã®è§£èª¬ãå®éã« Console äžã§è©Šãã«äœæãããã®ãåèã«ããŠããŸãã docs.aws.amazon.com moduleãå©çšããŠå
šãªãŒãžã§ã³åäœæãã module ã®çšæãçµãã£ãã®ã§å
šãªãŒãžã§ã³äœæããŠãããŸãã å
šãªãŒãžã§ã³äœæããããã«ãä»åã®äœææ¹æ³ã§ã¯è€æ°ã® Provider ãçšæããæ¹éãšããŸããTerraform ã§ã¯ module ãå©çšããéãæç€ºçã« Provider ãæž¡ããŸãã www.terraform.io ãã®ä»æ§ãçšããŠãªãŒãžã§ã³ããšã« module ãçšæããŸãã å
šãªãŒãžã§ã³åã®Providerãäœæ guardduty moduleãå©çšããGuardDutyãšéç¥ã¯ãŒã¯ãããŒãäœæ chatbot moduleãå©çšããAWS Chatbotçšã®IAMããŒã«ãäœæ å
šãªãŒãžã§ã³åã®Providerãäœæ å
šãªãŒãžã§ã³åã®ProviderãäœæããŸãã # ããã©ã«ãã®Provider provider " aws " { version = " ~> 3.18.0 " region = var.region } provider " aws " { region = " us-east-1 " alias = " us-east-1 " } provider " aws " { region = " us-east-2 " alias = " us-east-2 " } # ïŒçç¥ïŒ 泚æç¹ãšããŠã¯ãæå¹åããŠããªããªãŒãžã§ã³ãããå Žåã¯å
šãªãŒãžã§ã³èšå®ããå¿
èŠããªãç¹ã§ãã以äžã®ãªãŒãžã§ã³ã¯æå¹åããªãéã管ç察象ã«ããå¿
èŠã¯ãªãå¯èœæ§ããããŸãã af-south-1 ã¢ããªã« (ã±ãŒãã¿ãŠã³) ap-east-1 ã¢ãžã¢ãã·ãã£ã㯠(éŠæž¯) eu-south-1 æ¬§å· (ãã©ã) me-south-1 äžæ± (ããŒã¬ãŒã³) docs.aws.amazon.com guardduty moduleãå©çšããGuardDutyãšéç¥ã¯ãŒã¯ãããŒãäœæ äœæãã Provider ãå©çšããŠå
šãªãŒãžã§ã³åã® module å©çšã³ãŒããçšæããŸãã module " guardduty-us-east-1 " { source = " ../modules/guardduty " aws_account_id = var.aws_account_id providers = { aws = aws.us - east - 1 } } module " guardduty-us-east-2 " { source = " ../modules/guardduty " aws_account_id = var.aws_account_id providers = { aws = aws.us - east - 2 } } # ïŒçç¥ïŒ chatbot moduleãå©çšããAWS Chatbotçšã®IAMããŒã«ãäœæ AWS Chatbot ã¯ãªãŒãžã§ã³èšå®ããªã global ãªãµãŒãã¹ãªãã 1 ã€ã ãäœæããŸãã module " chatbot " { source = " ../modules/chatbot " } Console ç»é¢ã§æ®ãã® AWS Chatbotãäœæãã æåŸ AWS Chatbot ã Console ç»é¢ããäœæããŠãããŸãã AWS Chatbot ã¯åœèšäºã®å
¬éæç¹ã§ã¯ Amazon Chime ãš Slack ã®ïŒã€ã®ã¯ã©ã€ã¢ã³ãããµããŒãããŠããŸããä»å㯠Slack éç¥ãèŠä»¶ãªã®ã§ Slack ãéžæããŸãã Configure client ãéžæã Slack ã® Authorization ãå®äºãããšã察象㮠workspace ãäœæãããŸãã å®éã«éç¥ãããã£ãã«ãåœè©²ç»é¢ã® Configure Slack channel ããèšå®ããŠãããŸãã Logging ã§ã¯ããšã©ãŒã®ã¿ãããå
šãŠã®ã€ãã³ãããéžæã§ããŸããããã®ãã®ã³ã°å
ã® CloudWatch Logs 㯠US East (N. Virginia) ãšãªããŸãããã®çç±ã¯ã å
¬åŒããã¥ã¡ã³ã ã«ãŠæ¬¡ã®ããã«èª¬æãããŠãããšããã§ãã You can view your logs in the Amazon CloudWatch console. Note that you must specify US East (N. Virginia) for the Region. docs.aws.amazon.com AWS Chatbot çšã«å¿
èŠãª IAM Role ã¯äºåã«äœæãããã®ãå©çšã§ãããããTerraform ã§äœæãã IAM Role ãæå®ããŸãã æåŸã« AWS Chatbot ã§éç¥ãã SNS Topic ãæå®ããŸããããã§ã¯ãTerraform ã§äºåã«å
šãªãŒãžã§ã³åäœæãã SNS Topic ãèšå®ããŠããŸãã ãã®èšå®ããããšå
éšçã«ã¯ AWS Chatbot ããã® protocol: HTTPS ã® SNS Subscription ãäœæãããŸãã AWS Chatbotã®éç¥èšå®ãããããšã§äœæãããSNS Subscription ãªããçè
㯠Terraform ã§ SNS Subscription ãäœæããããšæ€èšŒããŸãããäžå¯ã§ãããçç±ã¯ãterraformäžã®èšæ³ã§ãã sns_topic_subscriptionã®protocol ã®ä»æ§ã§ãã https -- delivery of JSON-encoded messages via HTTPS. Supported only for the end points that auto confirms the subscription . ãããŠãAWS Chatbot ã®éç¥èšå®ãã SNS Topic ãæå®ãããããŒã§ãªããã°ãç¢ºèªæžã¿ãã«ãªããªãããã§ãããã®ãããSNS Topic ã«å¯Ÿãã Subscription ã Console ç»é¢ããäœæããå¿
èŠããããŸããTerraform ã³ãŒãã§ç®¡çããå Žåã¯ã terraform-provider-aws ã® AWS Chatbot ã®ãµããŒã ãåŸ
ã€å¿
èŠããããŸãã 以äžã§èšå®ã¯å®äºã§ãã ãããŸã§ãããšåé ã§ç޹ä»ãããšããåœè©² Slack ãã£ã³ãã«ã«éç¥ãæ¥ãããã«ãªããŸãã åäœç¢ºèªæ¹æ³ GuardDuty ã§ã¯ãGenerate sample findingsïŒçµæã®ãµã³ãã«ã®çæïŒããšããæ©èœããããŸãã ãã®æ©èœã§ã¯ãµã³ãã«ã®æ€åºçµæãçæããŠãããŸãããã®æ©èœã§çæãããçµæã¯ CloudWatch Event ã«ãçºè¡ããããããæ¬èšäºã§ç޹ä»ããŠãããããªéç¥ã¯ãŒã¯ãããŒãçµãéã®ãããã¯ã«æçšã§ãã ãããã« GuardDuty ãæå¹åã Slack éç¥ãè¡ãªãæ§æã Terraform ã§äœæããäºäŸã«ã€ããŠæ
å ±ãå°ãªãã£ãã®ã§ç޹ä»ãããŠããã ããŸãããå®éã«äœæããéã«åèã«ãªãã°å¹žãã§ãã
ããã«ã¡ã¯ãBASE BANK æ ªåŒäŒç€Ÿ Dev Division ã§ãšã³ãžãã¢ãšããŠã€ã³ã¿ãŒã³ãããŠããåå·ã§ãã ä»åãAmazon Elasticsearch Service(以äžãAmazon ES)ã«ãããECS/Fargate ã§çšŒåããã¢ããªã±ãŒã·ã§ã³ã®ãã°ããŒã¿ã®è§£æåºç€ãæ°èŠã§æ§ç¯ããããšã«ãªã£ãã®ã§ãæ§ç¯ããã«ããã£ãŠèª¿æ»ããå
容ãé¢é£ããå
容ãå®éã«ãããªã£ãæ§ç¯æ¹æ³ã«ã€ããŠããã€ã玹ä»ããŸãã ä»åã®æ§ç¯ã®ç°¡åãªå
šäœæ§æå³ã¯æ¬¡ã®ããã«ãªããŸãã ä»åã¯ã ECS/Fargate ã®ãã°ã S3 ã«ã«ãŒãã£ã³ã°ãã Amazon ES ã«ãã°ãã«ãŒãã£ã³ã°ãã VPC ã¢ã¯ã»ã¹ã® Amazon ES ãæ§ç¯ããKibana ãå€éšããã¢ã¯ã»ã¹ã§ããããã«ãã ã®ïŒã€ã®æé ã«ãããŠãæ§ç¯æ¹æ³ãé¢é£ããå
容ã«ã€ããŠç޹ä»ããŠãããããšæããŸãã ãªãããã®èšäºã§åãæ±ã£ãŠããåããŒã«ã»ãµãŒãã¹ã®ããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã Terraform: v0.12.5 Terraform provider.aws v3.6.0 SAM CLI: version 1.7.0 AWS CLI: aws-cli/2.0.61 Python/3.9.0 Darwin/19.3.0 source/x86_64 Fargate platform version: 1.4.0 FireLens ã§ ECS/Fargate ã®ãã°ã S3 ã«ã«ãŒãã£ã³ã°ãã FireLens ã«ã€ã㊠Kinesis Data Firehose ãçšã㊠ECS/Fargate ã®ãã°ã S3 ãžã®ã«ãŒãã£ã³ã°ãã ECS/Fargate ã®ãã°ã S3 ã«çŽæ¥ã«ãŒãã£ã³ã°ããæ¹æ³ã«ã€ã㊠Amazon Elasticsearch Service ã«ãã°ãã«ãŒãã£ã³ã°ãã Amazon Elasticsearch Service ã®æ§ç¯ Amazon Elasticsearch Service ã® Terraform ã«ããæ§ç¯ ECS ã®ãªããŒã¹ãããã·ãµãŒããŒã䜿çšãã Kibana ã«ããããŒã¿è§£æç°å¢æ§ç¯ ECS ãããã€ããŒã«ã«ã€ã㊠ãããã« FireLens ã§ ECS/Fargate ã®ãã°ã S3 ã«ã«ãŒãã£ã³ã°ãã FireLens ã«ã€ã㊠ECS ã®ã³ã³ããã®æšæºåºå/æšæºãšã©ãŒåºåã«åºåããããã°ã S3 ã«ã«ãŒãã£ã³ã°ããããã«ãFireLens ããã°ãã©ã€ããŒãšããŠäœ¿çšããŸããã FireLens ã䜿çšããããšã§ãECS ã§åºåããããã°ãããµã€ãã«ãŒãšããŠå®è¡ããã Fluentd ã Fluent Bit ã®ãã°ã«ãŒã¿ãŒã³ã³ããã«ã«ãŒãã£ã³ã°ããããšãã§ããŸãã å¥ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãS3 ãžã®ãã°ã®ã«ãŒãã£ã³ã°ã¯ãCloudWatch Logs çµç±ã§è¡ã£ãŠããŸããããFilreLens ãçšããæ¹æ³ã«ãã£ãŠãCloudWatch Logs ã®ã³ã¹ããæããããšããã«ã¹ã¿ã èšå®ãçšããæè»ãªãã°ã®åãæ±ããã§ããããã«ãªããŸããã Kinesis Data Firehose ãçšã㊠ECS/Fargate ã®ãã°ã S3 ãžã®ã«ãŒãã£ã³ã°ãã ä»åã®æ§ç¯ã§ã¯ Kinesis Data Firehose çµç±ã§ S3 ã«ãã°ãã«ãŒãã£ã³ã°ããŸããã ãŸãã¯ããã«ãKinesis Data Firehose ãš S3 ã®æ§ç¯ãããŸãã Terraform ã§ã®å®çŸ©äŸã¯æ¬¡ã®ããã«ãªããŸãã resource "aws_kinesis_firehose_delivery_stream" "sample" { destination = "s3" name = "sample" s3_configuration { bucket_arn = aws_s3_bucket.sample.arn role_arn = aws_iam_role.sample-kinesis-firehose-iam-role.arn prefix = "sample/" } } resource "aws_iam_role" "sample-kinesis-firehose-iam-role" { name = "sample-kinesis-firehose" assume_role_policy = jsonencode( { Version = "2012-10-17", Statement = [ { Sid = "", Effect = "Allow", Principal = { Service = "firehose.amazonaws.com" }, Action = "sts:AssumeRole" } ] } ) } resource "aws_iam_policy" "sample-kinesis-firehose-iam-policy" { name = "sample-kinesis-firehose-iam-policy" policy = jsonencode( { Version = "2012-10-17" Statement = [ { Sid = "" Effect = "Allow" Action = [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultiPartUploads", "s3:PutObject", ] Resource = [ aws_s3_bucket.sample.arn, "${aws_s3_bucket.sample.arn}/*", ] } ] } ) } resource "aws_iam_role_policy_attachment" "sample-kinesis-firehose-iam-role-attach" { role = aws_iam_role.sample-kinesis-firehose-iam-role.name policy_arn = aws_iam_policy.sample-kinesis-firehose-iam-policy.arn } resource "aws_s3_bucket" "sample" { bucket = "sample" acl = "private" } Kinesis Data Firehose ã«å¯ŸããŠã¯ãããŒã¿ãéä¿¡ãã S3 ã®èšå®ãšããã® S3 ãæäœããããã«å²ãåœãŠã IAM ããŒã«ãäœæããŠããŸãã æ¬¡ã«ãECS ã®ã¿ã¹ã¯å
ãž FireLens ã³ã³ããã远å ãããµã€ãã«ãŒæ§æãšããããã«ãECS ã®ã¿ã¹ã¯å®çŸ©ãä¿®æ£ããå¿
èŠããããŸãã ãã°ãåºåããã¢ããªã±ãŒã·ã§ã³ã³ã³ããã«ãã°ãã©ã€ããŒã次ã®ããã«èšå®ããŸãã "logConfiguration": { "logDriver": "awsfirelens", "options": { "Name": "firehose", "region": "ap-northeast-1", "delivery_stream": aws_kinesis_firehose_delivery_stream.sample.name } } delivery_stream ã®ãšããã«ã¯ãå
çšæ§ç¯ãã Kinesis Data Firehose ã® name ã§èšå®ãããã®ã䜿çšããŸãã æ¬¡ã« FireLens èšå®ãå«ããã°ã«ãŒã¿ãŒã³ã³ããã远å ããŸãã å®çŸ©äŸã¯æ¬¡ã®ããã«ãªããŸãã { "name": "log-router", "image": "906394416424.dkr.ecr.ap-northeast-1.amazonaws.com/aws-for-fluent-bit:latest", "essential": true, "firelensConfiguration": { "type": "fluentbit" } } æåŸã«ãã¿ã¹ã¯ããŒã«ãä¿®æ£ããFireLens ã³ã³ããã Kinesis Data Firehose ãžãšã¹ããªãŒã ãéä¿¡ã§ããããã«ããŸãã ããªã·ãŒã®å®çŸ©äŸã¯æ¬¡ã®éãã§ãã { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": " firehose:PutRecordBatch ", " Resource ": " * " } ] } 以äžã®èšå®ã§ãECS ã®ãã°ã S3 ã«åºåããããšãã§ããŸãã ECS/Fargate ã®ãã°ã S3 ã«çŽæ¥ã«ãŒãã£ã³ã°ããæ¹æ³ã«ã€ã㊠ãŸãä»åã®æ§ç¯ã§ã¯ãS3 ãžã®ãã°ã®è»¢éã« Kinesis Data Firehose ã䜿çšããŸããããFluent Bit ã v1.6 ãããã³ã³ãããã°ãã«ãŒãã£ã³ã°ããéä¿¡å
ãšã㊠S3 ããµããŒãããKinesis Data Firehose ãçµç±ããã«çŽæ¥ S3 ã«ãã°ã転éããããšãã§ããããã«ãªã£ãããã§ãã aws.amazon.com ãã ããããã©ã«ãã®èšå®ã§ãã S3 ã®ãã«ãããŒãã¢ããããŒã API ã䜿çšãããã®æ¹æ³ã䜿ãå Žåã¯ãFluent Bit ã®ã€ã³ã¹ã¿ã³ã¹ããããŒã¿ã®ãããã¡ãªã³ã°ã®ããã«æ°žç¶çãªãã£ã¹ã¯ãå¿
èŠãšããã®ã§æ³šæãå¿
èŠã§ãã ãã®ãã£ã¹ã¯ã¯ããã«ãããŒãã¢ããããŒã API ã§éä¿¡ããããŒã¿ã®ãã£ã³ã¯ããããã¡ãªã³ã°ããããã«äœ¿çšããããã Fluent Bit ãäžæã«åæ¢ããå Žåã«ãåããã£ã¹ã¯ã§åèµ·åããæªå®äºã®ã¢ããããŒãåŠçãå®äºããããã«å¿
èŠã ãšããããšã§ãã ä»åã®ãã㪠ECS/Fargate ã®ç°å¢ã§äœ¿çšããå Žåã¯ãAmazon EFS ãã¡ã€ã«ã·ã¹ãã ã ECS ã¿ã¹ã¯ã§äœ¿çšããããšãæšå¥šãããŠããããã§ããã ãŸããæ°žç¶çãªãã£ã¹ã¯ã䜿çšããªãå Žåã«ãS3 ã® PutObject API ã䜿çšããããŒã¿ããããã¡ãªã³ã°ããã«é »ç¹ã«éä¿¡ããæ¹æ³ã«ãã£ãŠãããŒã¿ã®æå€±ãæããèšå®ãããããã§ããã ä¿¡é Œæ§ãéèŠããå Žåã«ã¯ãKinesis Data Firehose ã Fluent Bit ãš S3 éã®ãããã¡ãšããŠäœ¿çšããæ¹æ³ãæšå¥šãããŠããããã§ããã®ã§ãS3 ã«ãã°ã転éããå Žåã«ã¯ãç¹å¥ãªçç±ããªãéã Kinesis Data Firehose ãçµç±ããæ¹æ³ã§ãããªãã®ãè¯ãã®ããªãšæããŸããã github.com Amazon Elasticsearch Service ã«ãã°ãã«ãŒãã£ã³ã°ãã Kibana ãçšãããã°ã®èª¿æ»ç°å¢ãæ§ç¯ããããã«ãS3 ã«ã«ãŒãã£ã³ã°ããããã°ã Amazon ES ã«è»¢éãã Lambda ãäœæããŸããã Lambda 㯠S3 ã® PUT ãããªã¬ãŒã«ããŠèµ·åããåãåã£ã event ã®æ
å ±ãçšããŠååŸãã S3 ããã®å¯Ÿè±¡ã®ãã°ããŒã¿ãå å·¥ããAmazon ES ã«è»¢éããŸãã BASE BANK ããŒã ã§ã¯ãAWS SAM CLI ã䜿çšãã Lambda ã®éçšããããªã£ãŠãããä»åã® Lambda ã®ç°å¢æ§ç¯ã«ããã£ãŠã AWS SAM CLI ã䜿çšããŸããã AWS SAM CLI ãçšãã Lambda ã®ç°å¢æ§ç¯æ¹æ³ã«é¢ããŠã¯ãååã®æ°žéãæžããäžèšãšã³ããªããåç
§ãã ããã devblog.thebase.in AWS SAM CLI ã§ Lambda ã管çããå Žåã¯ãAWS SAM ã®ãã³ãã¬ãŒããã¡ã€ã«ã§ããªã¬ãŒãšãªãã€ãã³ãã®èšå®ãããŒã«ãç°å¢å€æ°ãVPC åšãã®èšå®ããããªããŸãã BASE BANK ããŒã ã§ã¯ãAWS ãªãœãŒã¹ã®ç®¡çã Terraform ã§è¡ã£ãŠããã®ã§ãLambda ãªãœãŒã¹ã®ç®¡çã®ã¿ã SAM ãçšã㊠Cloud Formation ã§ãããªããarn ãªã©ãéããŠããªã¬ãŒã®å¯Ÿè±¡ãšãªããªãœãŒã¹ãåç
§ãããã³ãã¬ãŒããã¡ã€ã«ãèšè¿°ããŠããŸããã ä»å Lambda ã®ããªã¬ãŒã®å¯Ÿè±¡ãšãªã ECS ããã®ãã°ãä¿åãããŠãã S3 ã«ã€ããŠããåœå㯠Terraform ã§ç®¡çããŠããã®ã§ãããAWS SAM CLI ã§ Lambda ãæ§ç¯ããããªã¬ãŒã®å¯Ÿè±¡ã S3 ãšããå Žåã¯ãS3 ã Lambda ãšåããã³ãã¬ãŒããã¡ã€ã«ã§å®çŸ©ããªããã°ãªããªããšããå¶çŽããããŸããã github.com ãã£ãŠãTerraform ã§ç®¡çãããŠãã S3 ããAWS SAM ã®ãã³ãã¬ãŒããã¡ã€ã«ã§å®çŸ©ããããšã§ CloudFormation ã§ç®¡çããããã«ããTerraform åŽã§ã¯ãData Resource ãšã㊠S3 ãåç
§ããããã«ä¿®æ£ããŸããã SAM ãã³ãã¬ãŒããã¡ã€ã«ã®ãªãœãŒã¹ã»ã¯ã·ã§ã³ã®äœæäŸã¯æ¬¡ã®ããã«ãªããŸãã Resources : LogToEsFunction : Type : AWS::Serverless::Function Properties : CodeUri : log_to_es/ Handler : app.lambda_handler Runtime : python3.8 Events : BucketEvent : Type : S3 Properties : Bucket : !Ref LogBucket Events : s3:ObjectCreated:Put Filter : S3Key : Rules : - Name : prefix Value : log_prefix/ Role : !Ref ExecutionRole Environment : Variables : ES_DOMAIN_URL : !Ref EsDomainUrl VpcConfig : SecurityGroupIds : !Ref SecurityGroupIds SubnetIds : !Ref SubnetIds LogBucket : Type : AWS::S3::Bucket Properties : BucketName : !Ref S3Bucket S3 ã«ä¿åããã ECS ã®ãã°ããLambda ã䜿çšã㊠Amazon ES ã«è»¢éããæ¹æ³ãä»åã¯äœ¿ããŸããããECS ã®ãã°ã Amazon ES ã«ã«ãŒãã£ã³ã°ããæ¹æ³ãšããŠãFireLens ã䜿çšããããšã§ Fluent Bit ãçŽæ¥ãã°ããŒã¿ã Amazon ES ã«ã«ãŒãã£ã³ã°ããããšãã§ããããã«ãªã£ãããã§ãã aws.amazon.com ãã¡ãã®æ¹æ³ã䜿ãå Žåã¯ãAmazon ES ãžéä¿¡ããããŒã¿ã®å å·¥ã«ã€ããŠãããã°ããŒã¿ãæ¬ æããå Žåã®èæ
®ãªã©ãèããå¿
èŠãããããã§ããããæè»œã« Amazon ES ã«ãã°ããŒã¿ãã«ãŒãã£ã³ã°ã§ããã®ã¯è¯ãããã ãšæããŸããã Amazon Elasticsearch Service ã®æ§ç¯ Amazon ES ã® VPC ã¢ã¯ã»ã¹ã§ã®æ§ç¯ãšãå€éšãã Kibana ã«ã¢ã¯ã»ã¹ããããã®ç°å¢æ§ç¯ããããªããŸããã Amazon ES ã®äœ¿ãåããšããŠã Lambda ã«ãããElasticsearch API ãçšãããã°ããŒã¿ã®æå
¥ Kibana ã«ãããã°ããŒã¿ã®è§£æã®ããã®ã¢ã¯ã»ã¹ ããããŸãã ä»åã¯ãVPC ã¢ã¯ã»ã¹ã«ããæ§ç¯ã«ãããAmazon ES ã«å¯Ÿããã»ãã¥ãªãã£ã®åŒ·åãAmazon ES ãš Lambda éã®å®å
šãªéä¿¡ãå®çŸããããšãã§ããŸããããäžæ¹ã§ãKibana ã«å¯ŸããŠã¯é©åãªã¢ã¯ã»ã¹å¶éãããäžã§ãããŒã¿è§£æã®ããã®å€éšããã®ã¢ã¯ã»ã¹ãããå¿
èŠããã£ãã®ã§ãALB ãš ECS ã®ãªããŒã¹ãããã·ãµãŒããŒã䜿çšããç°å¢æ§ç¯ããããªããŸããã Amazon Elasticsearch Service ã® Terraform ã«ããæ§ç¯ ä»å Amazon ES ã¯ãTerraform ã§æ§ç¯ããŸããã Amazon ES ã Terraform ã§æ§ç¯ããå Žåã®ãåºæ¬çãªèšå®ãããå®çŸ©äŸã¯æ¬¡ã®ããã«ãªããŸãã resource "aws_elasticsearch_domain" "es" { domain_name = "sample" elasticsearch_version = "6.3" cluster_config { instance_type = "t2.small.elasticsearch" instance_count = 1 } vpc_options { subnet_ids = var.es_subnet_ids security_group_ids = var.es_security_group_ids } ebs_options { ebs_enabled = true volume_size = 10 } } ãã®äŸã§ã¯ãElastic Search ã® version ããã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã®èšå®ããµãããããã»ãã¥ãªãã£ã°ã«ãŒãã® VPC åšãã®èšå®ãããŠããŸãã Amazon ES ã®ã»ãã¥ãªãã£ã«é¢ããŠã¯ã VPC ã¢ã¯ã»ã¹èšå®ã«ãããããã¯ãŒã¯ã«é¢ããã»ãã¥ãªãã£ã¬ã€ã€ãŒ ãã¡ã€ã³ã¢ã¯ã»ã¹ããªã·ãŒã«ããããªãœãŒã¹ããŒã¹ã®ã»ãã¥ãªãã£ã¬ã€ã€ãŒ Fine Grained Access Control ã«ãããããŒã«ããŒã¹ã®çްããã¢ã¯ã»ã¹ã³ã³ãããŒã«ã«ããã»ãã¥ãªãã£ã¬ã€ã€ãŒ ã® 3 ã€ã®äž»èŠãªã»ãã¥ãªãã£ã¬ã€ã€ãŒãããããã®ãã¡ Terraform ã«ãããã¡ã€ã³ã¢ã¯ã»ã¹ããªã·ãŒã®å®çŸ©äŸã¯æ¬¡ã®ããã«ãªããŸãã resource "aws_elasticsearch_domain_policy" "es" { domain_name = aws_elasticsearch_domain.es.domain_name access_policies = jsonencode( { Version : "2012-10-17", Statement : [ { Effect : "Allow", Principal : { AWS : "*" }, Action : "es:*", Resource : "${aws_elasticsearch_domain.es.arn}/*" } ] } ) } ãã¡ã€ã³ã¢ã¯ã»ã¹ããªã·ãŒã®èšå®ã«ã€ããŠã¯ãaws_elasticsearch_domain å
ã® access_policies ã§ãèšå®ããããšãã§ããŸãããTerraform ã§ã¯ããªãœãŒã¹ã®å®çŸ©å
ã§èªããåç
§ããããšãã§ããªãã®ã§ãä»åã®å Žåã¯äžèšã®ããã«å¥ãªãœãŒã¹ã§å®çŸ©ããŸããã BASE BANK ããŒã ã§ã¯ãTerraform ã®ã»ãã¥ãªãã£éçè§£æããŒã«ã§ãã tfsec ãå°å
¥ããŠããŠãä»åã®æ§ç¯ã«ããã£ãŠãtfsec ã®ææã«ããèšå®ã®æ€èšãããé
ç®ãããã€ããããŸããã tfsec ã«ã€ããŠããæ€èšããé
ç®ã«é¢ããŠã¯ãååã®æ±å£ãæžããäžèšãšã³ããªããåç
§ãã ããã devblog.thebase.in Amazon ES ã®æ§ç¯ã«ããã£ãŠæ³šæãã¹ãç¹ãšããŠãæ¢åã®ãã¡ã€ã³ã«ã¯èšå®ã§ãããæ°èŠã§æ§ç¯ããéã«ããèšå®ã§ããªãé
ç®ããã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã Elasticsearch ã®ããŒãžã§ã³ã«ãã£ãŠã¯èšå®ã§ããªãé
ç®ãååšãããšããã®ããããŸããã äŸãã°ãAudit Logs ã®æå¹åããããŸãã Amazon ES ã§ã¯ãAudit Logs ã䜿çšããããšã§ãElasticsearch ãžã®ãã¹ãŠã®ãªã¯ãšã¹ãã®ãã®ã³ã°ãã€ã³ããã¯ã¹ã®å€æŽãåä¿¡æ€çŽ¢ã¯ãšãªã®èšé²ãªã©ã®ãããããŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®ãã°ãèšé²ã§ããããã«ãªããŸããã aws.amazon.com ãããããã®é
ç®ãèšå®ããã«ã¯ãæ¢åããŸãã¯æ°èŠã® Amazon ES ã§ãElasticsearch ã®ããŒãžã§ã³ã 6.7 以éã§ãããFine Grained Access Control ãæå¹ã«ãªã£ãŠããå¿
èŠããããŸãã Fine Grained Access Control ãšã¯ãããŒã«ããŒã¹ã®ã¢ã¯ã»ã¹ã³ã³ãããŒã«ã«ãããã¯ã©ã¹ã¿ãŒã¬ãã«ãã€ã³ããã¯ã¹ã¬ãã«ãããã¥ã¡ã³ãã¬ãã«ããã£ãŒã«ãã¬ãã«ã®çްããã¢ã¯ã»ã¹èš±å¯ããKibana ãã«ãããã³ã·ãŒã®äœ¿çšãªã©ãã§ããããã«ãªããã®ã§ãã ãã®èšå®ãæå¹åããã«ã¯ã ä¿ç®¡æã®ããŒã¿ã®æå·å ãš ããŒãéã®æå·å ãæå¹ã«ãªã£ãŠããããã¡ã€ã³ãžã®ãã¹ãŠã®ãã©ãã£ãã¯ã« HTTPS ãèŠæ±ããèšå®ãæå¹ã«ãªã£ãŠããªããã°ãªããŸããã ãã®ãã¡ãä¿ç®¡æã®ããŒã¿ã®æå·åãšãããŒãéã®æå·åãElasticsearch ã®ããŒãžã§ã³ã«é¢ããŠã¯ãæ¢åã®ãã¡ã€ã³ã«å¯ŸããŠå€æŽããããšãã§ããªãã®ã§ã倿Žãããå Žåã¯ãã¡ã€ã³ãæ°èŠã«äœæããå¿
èŠããããŸãã ãŸããä¿ç®¡æã®ããŒã¿ã®æå·åã«é¢ããŠã¯ãã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã«ãã£ãŠã¯èšå®ã§ããªãã®ã§æ³šæãå¿
èŠã§ãã docs.aws.amazon.com ECS ã®ãªããŒã¹ãããã·ãµãŒããŒã䜿çšãã Kibana ã«ããããŒã¿è§£æç°å¢æ§ç¯ VPC ã¢ã¯ã»ã¹ã«ãã£ãŠæ§ç¯ããã Amazon ES ã«ãããŠãKibana ãžã®å€éšããã®ã¢ã¯ã»ã¹ãããæ¹æ³ã¯ããã€ããããŸãããä»å㯠ALB ãš ECS ã®ãªããŒã¹ãããã·ãµãŒããŒã䜿çšããæ¹æ³ã«ããç°å¢æ§ç¯ããŸããã ECS ã®ãªããŒã¹ãããã·ãµãŒããŒãçµç±ããã«ãALB ããçŽæ¥ã¢ã¯ã»ã¹ããããšãã§ããŸãããAmazon ES ã® Private IP ã®å€æŽã宿çã«ã¡ã³ããã³ã¹ããå¿
èŠãããäžäŸ¿ã§ãã ECS ã®ãªããŒã¹ãããã·ãµãŒããŒãçµç±ããããšã§ãAmazon ES ã®ãã¹ãåã䜿ã£ãŠèšå®ãã§ããã®ã§ã宿çãªã¡ã³ããã³ã¹ãäžèŠã«ãªããããæè»ãªèšå®ãããããšãã§ããããšæããŸãã ä»åã®æ§ç¯ã§ã¯ãECS ã®ãªããŒã¹ãããã·ãµãŒããŒã¯ãnginx ã®ã€ã¡ãŒãžã䜿çšããèšå®ãã¡ã€ã«ã眮ãæããã ãã®ç°¡çŽ ãªæ¹æ³ã§ãããªããŸããã ECS ãããã€ããŒã«ã«ã€ã㊠ECS ã®ãããã€æ¹æ³ã«ã€ããŠã¯ããã€ãæ€èšããäžã§ãECS CLI ã«ãããããã€ç°å¢ãæ§ç¯ããŸããã docs.aws.amazon.com ECS CLI ã¯ãECS ã¯ã©ã¹ã¿ãŒããã³ã¿ã¹ã¯ã®äœæãæŽæ°ããDocker Compose ãã¡ã€ã«ãå©çšããŠãããªããããŒã«ã§ãã ECS CLI ã§ã¯ãALB ãã»ãã¥ãªãã£ã°ã«ãŒããªã©ã®ãªãœãŒã¹ã®äœæã管çãã§ããŸããããä»å㯠Terraform ã§ ECS ãµãŒãã¹ãã¿ã¹ã¯ä»¥å€ã®å¿
èŠãª AWS ãªãœãŒã¹ã管çãããŠããã®ã§å®¹æã«å°å
¥ããããšãã§ããŸããã ãŸããDocker Compose ãš Amazon ECS ã®çµ±åã«ãããDocker ã³ãã³ãã©ã€ã³ã䜿çšã ECS ãžã®ã¢ããªã±ãŒã·ã§ã³ã®ããã〠ãã§ããããã«ãªããŸããã aws.amazon.com Docker Compose ã§æ§ç¯ãããæ¢åã®ã¢ããªã±ãŒã·ã§ã³ã®æ¡åŒµããDocker Compose ãå©çšãã ECS éçºè
ã®éçºäœéšã®åäžãå³ããããã«ãªããããªã®ã§ãæ©äŒãããã° ECS CLI ãšã®éãã«ã€ããŠãå«ããŠèª¿æ»ããŠã¿ãããšæããŸããã ãããã€æ¹æ³ãæ€èšããäžã§ãAWS Copilot CLI ã«ã€ããŠã調æ»ããŸããã aws.github.io AWS Copilot CLI ã¯ãæäœé Dockerfile ããããã°ãECS ã¯ã©ã¹ã¿ãŒããµãŒãã¹ãã¿ã¹ã¯ã«å ããŠãVPC ããµãããããALB ãªã©ã®ãã®ä»å¿
èŠãª AWS ãªãœãŒã¹ãäœæãšãè€æ°ã® AWS ã¢ã«ãŠã³ããè€æ°ã®ç°å¢ã«å¯Ÿãããããã€ã®ãµããŒããŸã§ãããªã£ãŠããããããªãæœè±¡åºŠã®é«ãããŒã«ã§ãã äžæ¹ã§ãv0.3 ããæ¢åã® VPC ããµããããã®èšå®ãã§ããããã«ãªããŸãããã现ããèšå®ã«ã€ããŠã¯ãŸã ãŸã ã§ããªãç¶æ³ã§ãã aws.amazon.com æ¢åã® ALB ãèšå®ãããªã©ããã®ä»ã®çްããèšå®ãã§ããªãç¶æ³ããä»åã¯å°å
¥ãèŠéããŸããããECS ã§ãããã¿ã€ããåãããããæè¡æ€èšŒããããããããšãç°¡åã«ã§ãã匷åãªããŒã«ã ãšæããŸãã®ã§ãä»åŸã®é²åã«æåŸ
ãã€ã€ã䜿ã£ãŠãããããšæããŸããã ãããã« Amazon ES ãçšãããECS/Fargate ã¢ããªã±ãŒã·ã§ã³ã®ãã°è§£æåºç€ã®æ§ç¯äŸãšãããã«é¢é£ããå
容ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ãããã ECS/Fargate ã¢ããªã±ãŒã·ã§ã³ã®ãã°è§£æåºç€ã®ç°å¢æ§ç¯ããããæ¹ã
ã®å©ãã«ãªãã°å¹žãã§ãã ãŸãä»åã®æ§ç¯ã«ããã£ãŠã¯ãAWS ã®ã¢ããããŒãã®ãµã€ã¯ã«ã®æ©ãããšãŠãæããŸããã æ¬¡ã
ãšæ°ããæ©èœããªãªãŒã¹ãããã®ã§ã宿çã«ãã£ããã¢ããããããç°å¢æ§ç¯ãããã³ã«æ°ããæè¡ã®æ€èšŒãããŠãããªããšãªãšæããŸããã
BASE BANK æ ªåŒäŒç€Ÿ Dev Division ã§Software Developer ãããŠããæž
æ°ŽïŒ @budougumi0617 ïŒã§ãã ã¿ãªããã®éçºçŸå Žã§ã瀟å
ã©ã€ãã©ãªã»ã¢ãžã¥ãŒã«ãšããŠéçºããŠããã³ãŒãã»GitHubãªããžããªããããšæããŸãã ãã®ãããªãªããžããªã¯ããã±ãŒãžç®¡çã·ã¹ãã ãçµç±ããŠå©çšããããšãã»ãšãã©ã§ããããã®ããã«ã¯ãªãªãŒã¹äœæ¥ãè¡ãå¿
èŠãããããšæããŸãã ç§ã®ããŒã ã§ã¯å
æ¥GitHubãªããžããªã®ãªãªãŒã¹äœæ¥ãGitHub Actionsã§èªååããã®ã§ãæ¬èšäºã§ã¯ãã®å
容ãå
±æããããšæããŸãã TL;DR ä»åã¯GitHub Actionsãšrelease-it npmã䜿ã£ãŠããŸãã github.com www.npmjs.com äžèšã®æè¡ãçµã¿åãããããšã§æ¬¡ã®ãããªèªåãªãªãŒã¹ã®ã¯ãŒã¯ãããŒãæ§ç¯ããŸããã ïŒPull RequestãããŒãžããããªã©ã§ïŒmainãã©ã³ãã«ã³ããããããã·ã¥ããããã¿ã°ãæã¡ãGitHubãªãªãŒã¹ãäœæããã ååãªãªãŒã¹ãšã®å·®åã§ ã³ãããã¡ãã»ãŒãžã®ãªãªãŒã¹ããŒããäœæãã ç¹å®ã®ãã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªãæŽæ°ãããŠãããšãã ã ãªãªãŒã¹ãã ã³ãããã¡ãã»ãŒãžã«å¿ããŠã»ãã³ãã£ãã¯ããŒãžã§ã³ã®ããã/ãã€ããŒ/ã¡ãžã£ãŒã¢ããããŒããåãæ¿ãã Actionsäžã§ãã䜿ããªãnpmããã±ãŒãžãªã®ã§ã ãªããžããªã«package.jsonã眮ããªã GitHub Actionsã䜿ã£ãŠèªååãè¡ãªããšã ã³ãããå
容ã«å¿ããæäœãç°¡åã«å®çŸ ã§ããŸãã ãã ããæ¬¡ã®å¶çŽããããŸããã ãããã¯ããã©ã³ããå©çšããŠããå Žåã¯GitHub Actionsäžããã³ããããããã·ã¥ããããšã¯ã§ããªã ãªãªãŒã¹çšã®PRãã€ãããšãã£ãè¿åçãå¿
èŠ ãã®ãããä»åã®èªåãªãªãŒã¹ã§ã¯ããªããžããªå
ã® version 倿°ã®å€ãæŽæ°ããŠã³ãããããŠãããã®ãããªæäœã¯å«ãã§ããŸããã ãªããä»ãã詊ããŠã¿ããæ¹ã¯ä»¥äžã®2ã€ã®ãã¡ã€ã«ãçšæããã ãã§å®çŸã§ããŸãã .release-it.json .github/workflows/release.yml .release-it.json ã®å
å®¹ã¯æ¬¡ã®ãšããã§ããGitHubãªããžããªã®ã«ãŒããã£ã¬ã¯ããªã«é
眮ããŸãã https://github.com/budougumi0617/autorelease-by-release-it-on-actions/blob/main/.release-it.json { " requireUpstream ": false , " requireCleanWorkingDir ": false , " github ": { " release ": true } , " git ": { " commit ": false , " push ": false , " requireUpstream ": false , " requireCleanWorkingDir ": false } , " npm ": { " publish ": false , " ignoreVersion ": true } } .github/workflows/release.yml ã®å
å®¹ã¯æ¬¡ã®ãšããã§ãã https://github.com/budougumi0617/autorelease-by-release-it-on-actions/blob/main/.github/workflows/release.yml name : auto release demo on : push : # mainãã©ã³ãã«ã³ããããpushããããšãã«éå® branches : - main # äžèšæ¡ä»¶ã«å ããŠgenãã£ã¬ã¯ããªé
äžã倿Žããããšãã®ã¿ãšããæ¡ä»¶ã远å paths : - gen/** jobs : auto-release : runs-on : ubuntu-latest env : GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }} RELEASE_IT_VERSION : 14.2.1 steps : - name : Check out codes uses : actions/checkout@v2 with : fetch-depth : 0 - name : Setup Node uses : actions/setup-node@v1 with : node-version : '12' - name : Set releaser settings run : | git config --global user.name release-machine git config --global user.email email@example.com - name : Major release id : major if : contains(toJSON(github.event.commits.*.message), 'bump up version major' ) run : npx release-it@${RELEASE_IT_VERSION} -- major --ci - name : Minor release id : minor # ã¡ãžã£ãŒããŒãžã§ã³ã¢ãããããŠããªããšããã€ããŒããŒãžã§ã³ã¢ãããè¡ãªãã if : steps.major.conclusion == 'skipped' && contains(toJSON(github.event.commits.*.message), 'bump up version minor' ) run : npx release-it@${RELEASE_IT_VERSION} -- minor --ci - name : Patch release # ã³ãããã¡ãã»ãŒãžã«ç¹ã«æå®ããªãå Žåã¯ãã€ããŒããŒãžã§ã³ãæŽæ°ãã if : "!(steps.major.conclusion == 'success' || steps.minor.conclusion == 'success')" run : npx release-it@${RELEASE_IT_VERSION} -- patch --ci ä»åã®ãµã³ãã«YAMLã®å Žåã¯main ãã©ã³ãã« gen ãã£ã¬ã¯ããªå
ãžã®å€æŽãå«ãã PRãããŒãžãããšèªåã§ãªãªãŒã¹ãè¡ãªãããŸãã ãŸãã bump up version major ãšãã£ãã¡ãã»ãŒãžãå«ãŸããŠããå Žåã¯ã¡ãžã£ãŒããŒãžã§ã³ã¢ãããè¡ãªãããŸãã https://github.com/budougumi0617/autorelease-by-release-it-on-actions/releases ãµã³ãã«ãªãªãŒã¹ããŒãž ãªããæ¬èšäºã§å©çšããŠããåããŒã«ã®ããŒãžã§ã³ã¯ä»¥äžã®ãšããã§ãã ããŒã«å ããŒãžã§ã³ GitHub Actions v2 release-it npm 14.2.1 Node.js 12.Xç³» 以äžã®URLã¯å®éã«GitHub Actionsã§äœåãèªåãªãªãŒã¹ãããŠã¿ããµã³ãã«ãªããžããªã§ãã https://github.com/budougumi0617/autorelease-by-release-it-on-actions ãªãªãŒã¹äœæ¥ãèªååããã ã©ããªèšèªã䜿ã£ãŠããŠããæ¥åã§éçºãè¡ãªã£ãŠãããšç€Ÿå
ã©ã€ãã©ãªãäœæããããšããããšæããŸãã äœæããã©ã€ãã©ãªã¯npmãComposerãGo Modulesãªã©ã®ããã±ãŒãžç®¡çã·ã¹ãã ãçµç±ããŠäœ¿ãããšã«ãªãã®ã倧åã ãšæããŸãã ãããªããšäžå®ã®æŽæ°ããšã«ã¿ã°ãèšå®ããããŒãžã§ã³ç®¡çããå¿
èŠãåºãŠããŸãã ãšã¯ãã ãPRãããŒãžããã git tag ã³ãã³ããæã£ãŠâŠããšåéçºè
ãè¡ãªãã®ã¯åå« ã§ãã ãã®ããã mainãã©ã³ãã«PRãããŒãžããããïŒã³ããããããã·ã¥ããããïŒèªåã§ã¿ã°æã¡ããªãªãŒã¹ãã ãšããèªååã詊ã¿ãŸããã ãã¡ããã¿ã°ã¯ãªãªãŒã¹ã®ãã³ã«ã»ãã³ãã£ãã¯ããŒãžã§ã³ãã€ã³ã¯ãªã¡ã³ããããããã«ããŸãã GitHub Actionsäžã§release-it npmãå®è¡ããŠãªãªãŒã¹ããã https://www.npmjs.com/package/release-it release-it npmã¯ãããªã«ã»ãã³ãã£ãã¯ããŒãžã§ã³ãã€ã³ã¯ãªã¡ã³ãããªãããªãªãŒã¹ããŒããäœã£ãŠGitHubãªãªãŒã¹ãäœæããŠãããã³ãã³ãã§ãã ããšãã°ãçŸæç¹ã®ããŒãžã§ã³ã 0.1.2 ã ã£ããšããæ¬¡ã®ããã«å®è¡ãããšãã€ããŒããŒãžã§ã³ãã€ã³ã¯ãªã¡ã³ããã 0.2.0 ããŒãžã§ã³ã®ãªãªãŒã¹ãäœæããŠãããŸãã $ npm run release -- minor --ci 次ã®ãªã³ã¯ã¯release-it npmã§äœæããããªãªãŒã¹ããŒãã§ãã https://github.com/budougumi0617/autorelease-by-release-it-on-actions/releases/tag/0.0.1 ãªãªãŒã¹ããŒãã®ãµã³ãã« GitHub Actionsäžã§Node.jsç°å¢ãçšæããŠå®è¡ããã ãã§çµããããšæããããããããèšå®ããå¿
èŠããã£ãã®ã§ããã€ã³ãã解説ããŠãããŸãã GitHub Actionså®è¡æã«ã¿ã°ãååŸããŠãã https://github.com/actions/checkout#checkout-v2 Set fetch-depth: 0 to fetch all history for all branches and tags. ä»åæ§ç¯ããèªåãªãªãŒã¹ã®ã¯ãŒã¯ãããŒã§ã¯æ¢åã®ã¿ã°ãããªãªãŒã¹ããã»ãã³ãã£ãã¯ããŒãžã§ã³ã決å®ããŸãã ãã®ãããGitHub Actionså®è¡æã« ã¿ã°ãäžç·ã«ãã§ãã¯ã¢ãŠãããŠããå¿
èŠããããŸã ãã¿ã°ã¯GitHub Actionsãå©çšæã«ã»ãŒ100% use ãããŠããã§ããã actions/checkout ã«å¯Ÿã㊠fetch-depth: 0 ãªãã·ã§ã³ãæž¡ãã ãã§ååŸå¯èœã§ãã - name : Checkout codes uses : actions/checkout@v2 with : fetch-depth : 0 ç¹å®ã®ãã¹é
äžãæŽæ°ããããšãã®ã¿ãªãªãŒã¹ãã ä»åèªåãªãªãŒã¹ããããªããžããªã¯ã³ãŒãã®èªåçæãè¡ãªã£ãŠããŸããããã®ãããæ¬¡ã®ãããªäºæ
ããããŸããã PRãããŒãžããããã³ã®ãªãªãŒã¹ã¯ ïŒã©ãã©ãããŒãžã§ã³ãäžãã£ãŠããŸãã®ã§ïŒããŠã»ãããªã èªåçæããã³ãŒããé
眮ãããŠãã gen/ ãã£ã¬ã¯ããªã®å
容ã倿Žããããšãã ã ãªãªãŒã¹ããã OpenAPIãgRPCãªã©ãå©çšããŠåãªããžããªå
ã§ã¯ã©ã€ã¢ã³ãã³ãŒããèªåçæãããããŠãããšãåæ§ã®ããŒãºãçãŸãããšæããŸãã æåã¯CircleCIãå©çšããŠèªåãªãªãŒã¹ãå®çŸããããšæã£ãã®ã§ããã ãã¹ã䜿ã£ãŠCIãå¶åŸ¡ããã®ã¯GitHub Actionsã®ã»ããç°¡åã ã£ãã®ã§ ãGitHub Actionsã§èªåãªãªãŒã¹äœæ¥ãè¡ãªãããšã«ããŸããã GitHub Actionsã®ã¯ãŒã¯ãããŒã§ã¯æ¬¡ã®ãããªå¶åŸ¡ãããããšãã§ããŸãã ã³ãããå
容ã確èªããŠç¹å®ãã£ã¬ã¯ããªã«æŽæ°ããã£ãã確èªãã https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#onpushpull_requestpaths GitHub Actionsã§ã¯ã on.<push|pull_request>.paths ã䜿ãããšã§ãç¹å®ãã£ã¬ã¯ããªã«æŽæ°ããã£ããšãã ãã«ãžã§ãã®å®è¡ãå¶éã§ããŸã 1 ã æ¬¡ã®ãµã³ãã«ã³ãŒãã¯ä»¥äžã®2ã€ã®æ¡ä»¶ãæºããããšãã®ã¿å®è¡ãããèšå®ã§ãã mainãã©ã³ãã«ã³ããããããã·ã¥ããã ããã·ã¥ãããã³ãããã®äžã« gen/ ãã£ã¬ã¯ããªå
ã®æŽæ°ãå«ãŸããŠãã on : push : branches : - main paths : - gen/** ã¯ãŒã¯ãããŒã®å¶åŸ¡ã«ã³ãããã¡ãã»ãŒãžãå©çšãã https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions ãã®ããŒã¿æ§é 㯠ããããå
¬åŒããã¥ã¡ã³ãã«æç€ºçã«èŒã£ãŠããªã ã®ã§ãããGitHub Actionsã§ãã©ã³ãã«pushããã äžé£ã®ã³ãããã®æ
å ±ããžã§ãå®è¡äžã«å©çšå¯èœ ã§ãã ã¯ãŒã¯ãããŒå®è¡æã®æ
å ±ã¯ github context ãšããŠåç
§ã§ããã®ã§ããããã®äžã® github.event ã§pushãããã³ãããã®æ
å ±ãæã£ãŠããŸã 2 ã ãã®æ
å ±ãããŒã¹ãããšã³ãããã®å
容ãã¯ãŒã¯ãããŒäžã«äœ¿ãããšãã§ããŸãã æ¬¡ã®ã³ãŒãã¯ãã³ãããã®ã¡ãã»ãŒãžã« 'bump up version major' ããã£ãã true ã«ãªããåŒã§ãã contains(toJSON(github.event.commits.*.message), 'bump up version major' ) https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstepsif ãããšã jobs.<job_id>.steps.if ãã䜿ãããšã§ããã³ãããã¡ãã»ãŒãžã«ãã£ãŠå®è¡ãããstepããã¯ãŒã¯ãããŒã«çšæããããšãã§ããŸãã jobs : sample : runs-on : ubuntu-latest steps : - name : teststep if : contains(toJSON(github.event.commits.*.message), 'ã³ãããã¡ãã»ãŒãžã確èª' ) run : echo 'executed!!' https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#steps-context ãŸããcontextã® steps.<step id>.conclusion ãçšããããšã§åã¹ãããã®å®è¡çµæãå©çšã㊠else if ã®ãããªå¶åŸ¡ãè¡ãªãããšãå¯èœã§ãã jobs : ifelse-pattern : steps : - name : foo id : foo if : contains(toJSON(github.event.commits.*.message), 'foo' ) run : echo 'if step!' - name : bar id : bar # fooã¹ããããã¹ãããããã && ã³ãããã¡ãã»ãŒãžã«barãå«ãå Žåã«å®è¡ãã if : steps.foo.conclusion == 'skipped' && contains(toJSON(github.event.commits.*.message), 'bar' ) run : echo 'elseif step!' 次ã®ãªã³ã¯ã¯å®éã«ã¹ããããããã€ãã¹ãããããŠããActionsã®å®è¡çµæã§ãã https://github.com/budougumi0617/autorelease-by-release-it-on-actions/runs/1454817991 Actionså®è¡ç»é¢ ãããŸã§ã¯GitHub Actionsã®èšå®æ¹æ³ã§ããããæ¬¡ã¯release-it npmãGitHub Actionsäžã§äœ¿ãã³ãã§ãã ã¿ã°ã®èšå®ãšãªãªãŒã¹ã¯ããããã³ãããã¯ããªã release-it npmã¯GitHub Actionsäžã§ npx ã³ãã³ãã§å®è¡ããŠããã®ã§ package.json ã¯äžèŠã§ãã ããrelease-it npmçšã®èšå®ãçšæããå¿
èŠããããŸãã ä»åå©çšããŠããèšå®ã¯æ¬¡ã®ãšããã§ãã { " requireUpstream ": false , " requireCleanWorkingDir ": false , " github ": { " release ": true } , " git ": { " commit ": false , " push ": false , " requireUpstream ": false , " requireCleanWorkingDir ": false } , " npm ": { " publish ": false , " ignoreVersion ": true } } ãã£ãã説æãããšã次ã®ãããªèšå®ã§ãã GitHubãªãªãŒã¹ãäœæãã gitã®ã³ãããã¯äœæããªã gitã®pushã¯ããªã npmã®å
¬éã¯ããªã ããŒãžã§ã³ã決å®ããããã« package.json å
ã®ããŒãžã§ã³ãåç
§ããªã éãæ¹ã¯ãâpushããªãâã£ãŠããšã¯ã¿ã°ãå
¬éãããªãããããªãã®ïŒããšæããããããŸããããããã®ãæªãã®ãããªãªãŒã¹ãè¡ãªããšãã«ã¿ã°ã¯ããã·ã¥ãããããã§ãã Actionsãããããã¯ããã©ã³ãã«ã¯ã³ããããpushã§ããªã https://github.community/t/how-to-push-to-protected-branches-in-a-github-action/16101/5 ãããŸã§äŸ¿å©ãªGitHub Actionsã§ããããã²ãšã€å¶çŽããããŸãããã㯠ãããã¯ããã©ã³ãã«ã³ããããããã·ã¥ããããšãã§ããªã ç¹ã§ããæãéããªããæ¢ããŠããã®ã§ãããªããããªã®ã§è«ŠããŸããã ãªã®ã§ãå
ã»ã©ã®release-it npmçšã®èšå®ãã¡ã€ã«ã¯ãã¿ã°ã®èšå®ãšãªãªãŒã¹ã¯ãããã©ã³ãããã¯ããã·ã¥ããªãããšããå
容ã«ãªããŸãã ãèªåãªãªãŒã¹ãããšã㯠package.json ã®äžã«ãã version ãæŽæ°ãããïŒã³ãããããã·ã¥ãããïŒãã ãã©ïŒããšãããããªããŒãºããã¡ãããããšæããŸãã ããããä»åã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãªãªãŒã¹ã¿ã°ã§ããŒãžã§ã³ã管çãããŠããã°ãã¡ã€ã«ãšããŠããŒãžã§ã³ãåç
§ã§ããå¿
èŠã¯ãªãã£ãã®ã§ããã¡ãã劥åããŸããã ããšã¯éçºããã ãïŒ ä»¥äžã®èšå®ãè¡ããšãç¹å®æ¡ä»¶ã®ã³ããããäœãã ãã§èªåã§ãªãªãŒã¹ãããããã«ãªããŸãã ããããã®èšå®ã¯ç¬ç«ããŠããã®ã§ãã奜ã¿ã§ã«ã¹ã¿ãã€ãºããŠããã ãã°ãšæããŸãã ç¹å®ã®ãã£ã¬ã¯ããªã«éå®ããå¿
èŠã¯ãªãã®ã§ on.<push|pull_request>.paths ã®èšå®ã¯åé€ãã ãããããã³ãããã¡ãã»ãŒãžã倿Žãã etc... name : auto release demo on : push : # mainãã©ã³ãã«ã³ããããpushããããšãã«éå® branches : - main # äžèšæ¡ä»¶ã«å ããŠgenãã£ã¬ã¯ããªé
äžã倿Žããããšãã®ã¿ãšããæ¡ä»¶ã远å paths : - gen/** jobs : auto-release : runs-on : ubuntu-latest env : GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }} RELEASE_IT_VERSION : 14.2.1 steps : - name : Check out codes uses : actions/checkout@v2 with : fetch-depth : 0 - name : Setup Node uses : actions/setup-node@v1 with : node-version : '12' - name : Set releaser settings run : | git config --global user.name release-machine git config --global user.email email@example.com - name : Major release id : major if : contains(toJSON(github.event.commits.*.message), 'bump up version major' ) run : npx release-it@${RELEASE_IT_VERSION} -- major --ci - name : Minor release id : minor # ã¡ãžã£ãŒããŒãžã§ã³ã¢ãããããŠããªããšããã€ããŒããŒãžã§ã³ã¢ãããè¡ãªãã if : steps.major.conclusion == 'skipped' && contains(toJSON(github.event.commits.*.message), 'bump up version minor' ) run : npx release-it@${RELEASE_IT_VERSION} -- minor --ci - name : Patch release # ã³ãããã¡ãã»ãŒãžã«ç¹ã«æå®ããªãå Žåã¯ãã€ããŒããŒãžã§ã³ãæŽæ°ãã if : "!(steps.major.conclusion == 'success' || steps.minor.conclusion == 'success')" run : npx release-it@${RELEASE_IT_VERSION} -- patch --ci çµããã« ãPRããŒãžããããŒïŒããšæã£ãŠãããã®ããšã«ãããããªãªãŒã¹äœæ¥ãããã®ã¯åå«ã§ããã ããã§å°ãã§ãçç£æ§ãããããšãããªãšæã£ãŠããŸãã ãªããGitHub Actionsãããããã¯ããã©ã³ããžã®çŽæ¥ã³ãããããã·ã¥ã¯ã§ããªãã®ã§ãããrenovateã¯PRãäœæãAppã§èªåæ¿èªãèªåããŒãžãšããè¿åãããŠãããã¯ããã©ã³ããžã®ããã·ã¥ãå®çŸããŠããããã§ãã GitHub Apps - renovate-approve · GitHub ãã£ãšçªãè©°ããããªã£ããåæ§ã®æäœãå®è£
ããŠãã¡ã€ã«æŽæ°ãå«ããèªåãªãªãŒã¹ãå®çŸããããªãšæããŸãã æåŸã«ãBASE BANKã§ã¯æ°ãããã¶ã€ããŒãšã«ã¹ã¿ããŒãµã¯ã»ã¹ã®åéãéå§ããã®ã§ããã²ãå¿åãåŸ
ã¡ããŠããŸãã www.wantedly.com www.wantedly.com åèãªã³ã¯ https://github.com/budougumi0617/autorelease-by-release-it-on-actions https://www.npmjs.com/package/release-it https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions https://github.community/t/how-to-push-to-protected-branches-in-a-github-action/16101/5 ãç¹å®ã®ãã£ã¬ã¯ããªã«æŽæ°ããã£ããšãã¯ç¡èŠããããšããéå¶åŸ¡ãã§ããŸãã ↩ contextãechoããŠç¡çãã確èªããŸããã ↩
BASEæ ªåŒäŒç€Ÿåç· åœ¹ EVP of Developmentã®è€å·ã§ãã äžçäžãæ°åã³ããã®åœ±é¿ã§éçšã®å
è¡ããäžéæãªäžãåœç€Ÿã¯åŒãç¶ãæé·ã暡玢ããŠããç¶æ³ã§ããããŒãžã£é£ãäžå¿ã«æ¡çšæŽ»åã«ã泚åããæ¯æ¥ãéã£ãŠããŸãã åœç€Ÿã¯æ£ç€Ÿå¡æ¡çšã¯ãã¡ããã®ããšã§ãããæ¥åå§èšå¥çŽã®æ¹ã
ã«ããæäŒãããã ããŠãããŸãããä»åã¯æ¥åå§èšå¥çŽã«ãã©ãŒã«ã¹ããèšäºãæžããŠã¿ãããšæããŸãã å
補ã«ãã ããããŒã ãç¶æããããã®æ¡çšæŽ»å ç§éã¯ãµãŒãã¹ãç¶æãæé·ãããããã«æ¯æ¥ãœãŒã¹ã³ãŒãã®ã¡ã³ããã³ã¹ãããŠããŸããæã
ã¯AWSãGCPãªã©ã®ã¯ã©ãŠãã®ç°å¢ãšãªãŒãã³ãœãŒã¹ã®ãœãããŠãšã¢ã«æ©æµãåããªãããç¬èªã®ããžãã¯ã¯å
補ã§éçºããŠããŸãã ä»ç€Ÿã®éçºäœå¶ã®äºäŸãšããŠãã¹ã¿ãŒãã¢ãããšããŠæåã¯å
補ã§ç«ã¡äžãããšããŠããçµç¹ã倧ãããªãããžãã¹ã®æé·ãåãããäžã§ãSIerããã«ç€Ÿå
ã«ãã£ã€ãå
¥ã蟌ãã§ããã£ãŠSESå¥çŽãªã©ã§éçºåãè£å¡«ãããããªãã·ã§ã¢ã§æµ·å€ã«éçºããé¡ãããäºäŸãããèããŸãã æã
ã¯åµæ¥ä»¥æ¥ãå
補ã§ãœãŒã¹ã³ãŒããæžããŠããããŒã ã§ãã®ã§ããã¯ãå
補ã§ã®éçºã«ã¯ãã ããããããŸããå
補ã®éèŠæ§ã¯ãæ£ç€Ÿå¡ããœãŒã¹ã³ãŒããæžããåŠããšããããšã§ã¯ãªãããœãŒã¹ã³ãŒããæžãè¡çºãšãµãŒãã¹éçšã坿¥ã«çµã³ã€ããŠããããããã€åŸã«äœããã£ããããœãŒã¹ã³ãŒããæžããåœäººã«å³åº§ã«ãã£ãŒãããã¯ããŠæ¹åãæ±ããããäœå¶ãç¶æãããŠããããšã瀺ããŸãã ããã«ããWebãµãŒãã¹ãäœã楜ãããšæè¡è
ãšããŠã®æé·ããªã¢ã«ã¿ã€ã ã«å®çŸãããããã¯ãã¯ãªãªãã£ã«çµã³ã€ãããšããããšã倧åã«ããŠããŸããã¹ããŒãã£ãªéçºãšæ¹åãå®çŸããããšããæç¶çã«æé·ããWebãµãŒãã¹ã®æ¹åãµã€ã¯ã«ãæ¯ããŠããŸããéçºã¡ã³ããŒã«ãããŠãããã®éçºãµã€ã¯ã«ãåãç¶ããããšããè€å©çã«ãšã³ãžãã¢ãšããŠã®ã¹ãã«ãåäžããããšã«ç¹ãããŸãã èšãæ¹ãå€ãããšããããã¯ããæé·ãããããšãåæãšããå
補ã«ããéçºäœå¶ãç¶æãç¶ããããšããããšããããŸãããããã¯ããé£ç¶çã«æé·ãããªãã®ã§ããã°ãå
補ã®éçºäœå¶ã«ãã ããå¿
èŠã¯ãªããéçºãã¢ãŠããœãŒã¹ããã§ãŒãºããšã«ãåãã®é ããç¥ããªããœãŒã¹ã³ãŒããç©ã¿äžããŠãã£ãŠæ©èœãä»ãè¶³ããŠãããšããéžæããŸãããã®ã§ããããç©æ¥µçã«ãªãã·ã§ã¢ãªã©ãããããŠããäŒç€Ÿãããããããšãããã¯ããŒã ã®èŠæã®è©±ãšæãããã®ãããããŸããã çŸæç¹ã§æãããšãšããŠãããåèšå¥çŽããªãã·ã§ã¢ã§éçºããçŽåããããœãŒã¹ã³ãŒãã«ãã£ãŠæ·±å€ã«äžå
·åãããã©ãŒãã³ã¹åé¡çãèµ·ããã°ããã®äžçªã«å¯Ÿå¿ããã®ã¯SREããŒã ãCTOã§ããå¯èœæ§ãé«ããèª°ãæžããã®ãã®é¡ãèŠããªããœãŒã¹ã³ãŒãã§äžå
·åã«å¯Ÿå¿ãç¶ããã®ã¯é
·ãªè©±ã ãšåã¯èããŠããŸãã ãµãŒãã¹ãéå¶ãç¶ããã®ã§ããã°ãèšãæ¹ã¯å€ã§ãããäžå
·åãåºãã仲éã®é¡ãæãæµ®ãã¶åœ¢ãããªãã¡ãèªåãã¡ããŒã ã®è²¬ä»»ãšããŠçŽåŸè¡ã圢ã§äžå
·å察å¿ãããããœãŒã¹ã³ãŒãã®æ¹åãããŠããããšã¯ä»äºã«å¯Ÿããã¢ãããŒã·ã§ã³ç¶æãšããŠãéèŠèŠããŠããŸããWebãµãŒãã¹ã«ãããŠäººãæºããæéã¯ããµãŒããç¶æãããã ãã®æŽ»åã§ã¯ãªããã·ã§ãããªãŒããŒããã®æµéç·é¡ã®å®çŸãæ¯ãããµãŒãã¹ã®æ¹åã®ãã³ããåŸã倧åãªæŽ»åãªã®ã§ãç¡é§ãªæéã«ã¯äœ¿ããããªãã§ãã ã€ãŸããå
補çµç¹ãç¶æããããã®äººä»¶è²»ãæ¡çšè²»ã«æè³ããããšã¯ãããã«æºããäººã®æé·ãšãããã¯ãã®æé·ãå®çŸããããã§ãããçµæãšããŠäŒæ¥ã®ããã³ã·ã£ã«ãèç©çã«åäžãããŠããææ®µãšããããšã«ãªããŸãã ãã ãããããæé·å§åã«å¯ŸããŠãã¡ãããšéçºã远ãã€ããŠããã°ã®è©±ãå
補ã«ãã ããç¶ããŠãæ¡çšãæ»ã£ãŠããŸã£ãŠæ³å®ããæé·ãå®çŸã§ããªãã£ããšããããããããããå
補ã«ãã ããåãçµå¶è²¬ä»»ãåã圢ã§äŒç€Ÿã®æ§çžãå€ãã£ãŠããŸã£ããããããããã ãããç¶ããããšã¯ã§ããªããªã£ãŠããŸããããããŸããã ãããªããªãããã«ããã£ãã仲éãå¢ãããŠããããšã¯éçºããŒã å
šå¡ã§æºãã£ãŠããéèŠãªä»äºã§ãããšèããŠããŸãã å
補ã«ãã ããããŒã ãç¶æããããã®æ¥åå§èš å
補ããŒã ãå®çŸããããã«éçšåœ¢æ
ãåœç±ã¯ãã ãããŸãããåãããŒã ã§åããŠæ¹åãµã€ã¯ã«ãåããç¶æ
ãç¶æã§ããŠããã°è¯ãã®ã ãšæããŸãããã®ããæºããã¡ã³ããŒã®å¥çŽåœ¢æ
ã¯ãçŸç¶ã¯æ£ç€Ÿå¡ãšããŠãžã§ã€ã³ããã ãããæ¥åå§èšå¥çŽã§ãé¡ãããŠããç¶æ³ã§ãã ãããŸã§BASEãPAYã®éçºã«ãããŠã¯ãæ¯èŒçå°äººæ°ã§ã¯ãããã®ã®æ¥åå§èšå¥çŽã®æ¹ã«ããæŽ»èºããã ããŠããŸãããæã
ãæ¥åå§èšå¥çŽã§ãé¡ãããæ¹ã¯ã瀟å¡ãšããŠç»çšã§ããªããã€ã¹ãã«ãªæ¹ããšå®çŸ©ããŠããŸããã ã€ãŸãæ¢ã«ç¬ç«ããŠããªãŒã©ã³ã¹ãèªåã®äŒç€Ÿãæã£ãŠããŠç¬ç«å¿ãé«ãã£ãããæå±ããŠããäŒç€Ÿã®æçãããããããã瀟å¡ãšããŠæ¥ãŠããã ãããšãé£ããæ¹ãšã®å¥çŽåœ¢æ
ãšããŠæŽ»çšããŠããŸãã ãã®ä»£è¡šäŸãšããŠãæ²äžããã®ã€ã³ã¿ãã¥ãŒãåç»ã§åé²ããŸããããã2幎åãBASEããæäŒãããã ããŠããŠãBASEã®çºå±ã«ã¯æ¬ ãããªã仲éã§ãã æ¥åå§èšå¥çŽã®æ¹ãšç€Ÿå¡ãšã¯å€å°ã®åœ¹å²ã®å·®ã¯ããã©ãåŽåç°å¢ãéçºã«å¿
èŠãªæ
å ±ãå«ããã§ããéãåãéãŠãªãã瀟å¡ãšåãããã«æŽ»èºãæåŸ
ããŠããŸããæè¡ããã°ã®å·çãæ®éã«ãé¡ãããŠããã瀟å
å匷äŒã§æŽ»èºããã ããªã©ãæ
å ±ã®ã€ã³ãã¢ãŠããç¹ã«åãéãŠãªãæ¥åãšããŠããªããŠããã ããŠãããŸãã 2021éçºèšç»ããæäŒãããã ãæ¥åå§èšå¥çŽã®æ¹ãåéããŸãïŒ çŸåšã2021幎ã®éçºèšç»ãæŽããŠããŸããããšãŠããšãŠã人ãè¶³ããŸãããBASEãšãããµãŒãã¹ããã£ãšããããŠãã·ã§ãããªãŒããŒããã®æé·ãæ¯ããããã®éçºãäžç·ã«ãã£ãŠããã ããæ¥åå§èšã®äººãå¢ãããããšæã£ãŠããŸãããã¡ããã瀟å¡ç»çšãç©æ¥µçã«è¡ã£ãŠãããŸãã ãªããšã³ãžãã¢æ¡çšåãã®äŒç€Ÿç޹ä»è³æãäœã£ãã®ã§ãããããã£ããæ¯éèŠãŠã¿ãŠãã ããã speakerdeck.com 圹å²å¥ã®åéèŠé
ã¯ãã¡ãïŒ ãããã圹å²ã§äººæåéäžïŒ ããã³ããšã³ããšã³ãžã㢠open.talentio.com éçºãããžã§ã¯ãã«ãããããã³ããšã³ãå®è£
ãšãBASEã®ããã³ããšã³ãå®è£
ã«ãããã©ã€ãã©ãªãå®è£
æè¡ã®å®ãç¥ãæ
ããŸãã Webã¢ããªã±ãŒã·ã§ã³ãšã³ãžã㢠open.talentio.com Webã¢ããªã±ãŒã·ã§ã³ãšã³ãžãã¢ã¯äž»äœæè¡ã¯ããã¯ãšã³ãå®è£
ã§ããããµãŒãã¹ãäœãæã«ããã³ããšã³ããæžããŠããŸãã ããã¯ãšã³ããšã³ãžãã¢ïŒã¢ããªAPIéçºïŒ open.talentio.com BASEã¢ããªã®APIã®éšåãéçºãããšã³ãžãã¢ã«ãªããŸãã
ããã³ããšã³ãããŒã ã®å³äº¬ã§ãããµãŒãã¹ã®å©çšè
åãã«ã¯ BASE U ã«ãŠåç¥ããããŸãããã2020 幎 11 æ 15 æ¥ããã£ãŠ BASE 㯠Internet Explorer 11 (ä»¥äž IE11) ã®ãµããŒããçµäºããŸããããµããŒãçµäºãšèããšåºæ¬çã«ã¯ãã¬ãã£ããªå°è±¡ã«ãªããã¡ã§ãããããã§ã¯äž»ã«éçºè
ã«åããŠããµããŒããçµäºããããšã«ãã£ãŠåºããæ°ããæªæ¥ã®è©±ãããããšæããŸãã ã·ã§ããã®ãã¶ã€ã³ãé²åãããã§ããã 2 ã€ã®æè¡ IE11 ãµããŒãçµäºåŸã«æ°ãã«å©çšã§ããæè¡ã®äžã§ãç¹ã«æ³šç®ããŠããã®ã¯ãWeb ComponentsããšãCSS ã«ã¹ã¿ã ããããã£ãã§ãã developer.mozilla.org developer.mozilla.org ã©ã¡ããååãèãããšãå¢ããŠããŠããŠããã§ã«ãåç¥ã®æ¹ãå€ããšæããŸããç°¡åã«èšãã°åè
ã¯ç¬èªã®ã¿ã°ãäœã£ãŠæäŸã§ããæ©èœãåŸè
㯠CSS ã§äœ¿ãã倿°ã ãšæã£ãŠãããããšã€ã¡ãŒãžããããã®ã§ã¯ãªãã§ããããã HTML ç·šéãšã·ã§ãããã¶ã€ã³ ããããæŽ»çšã§ããèæ¯ã«ã¯ BASE ãæäŸããŠãããHTMLç·šéããšãã App ã®ååšããããŸãããã®æ©èœã¯ã·ã§ããã®ãã¶ã€ã³ãããªãèªç±ã«ç·šéã§ããæ©èœã§ã ãã¶ã€ã³ããŒã±ãã ã®ããŒã¹ãšãªããã®ãšããªã£ãŠãã BASE ã®çºå±ãšã¯åã£ãŠãåããªãé¢ä¿ã§ãããã®èªç±åºŠã®é«ãããå€ãã®ãªãŒããŒãºã«å©çšããŠããã ããŠããã®ã§ãããäžæ¹ã§æ©èœã®åäœä¿èšŒãæè¡çãµããŒããé£ãããšããåé¡ããããŸããã æ©èœãæäŸããä¿è·ããããã® Web Components HTML ç·šéãæäŸããŠãããBASE ã®ã·ã§ãããæ§ç¯ããããã®æ¡ä»¶ã倿°ã BASE Template ãšåŒã³ãŸããããã«ã€ããŠè©³ããç¥ãããå Žåã¯ã以äžã®ããã¥ã¡ã³ããåç
§ããŠãã ããã はじめに · Developers ãã®äžã§ããååã®ååããååŸããããã® {ItemTitle} ã®ãããªã¿ã°ã§åé¡ãèµ·ããããšã¯ã»ãšãã©ãããŸããããããäŸãã° {AppsReviewTag} ã¯ããã®ã¿ã°ãã¬ãã¥ãŒæ©èœãå®çŸããããã®æ¯èŒç倧ããã® HTML ãš JavaScript ã«çœ®ãæããŠåäœããã¿ã°ãšãªã£ãŠããŸãããã®ã¿ã°ã¯ããããã³ã³ããŒãã³ãã®ãããªæ±ããšãªãã®ã§ãããããã¯çŸç¶å€ãã®ãã©ãŠã¶ã§åäœãããããããå¿
èŠãª HTMLãJavaScriptãCSS ã«çœ®ãæãããããªçŽ æŽãªå®è£
ãšãªã£ãŠããŸãã(äŸã®ã³ãŒãã¯ãããããããããã®ã§ãå®éã«é
ä¿¡ããããã®ã§ã¯ãããŸããã) // HTML ç·šéã§èšè¿°ãããã³ãŒã < div class = "review" > {AppsReviewTag} </ div > // å®éã«ã·ã§ãããšããŠé
ä¿¡ãããã³ãŒã < div class = "review" > < div class = "base-review-container" > < div ...> .... </ div > </ div > < script > .... </ script > </ div > ããã«ãã£ãŠç¹ã«å€ãèµ·ããåé¡ããæå³ããªãç Žå£ãã§ããã¹ã³ãŒãã®ååšããªããã®ã« BASE ãéçºãããã®ãåŸä»ããããããªåœ¢ã«ãªããããã³ãŒãã«äºæãã¬ã³ã³ããªã¯ããçºçããã±ãŒã¹ããããŸããäŸãã°ã BASE åŽã®æ¹ä¿®ã«ãã£ãŠ HTML ç·šéã§äœæãããã·ã§ããã®ãã¶ã€ã³ãš CSS ãã³ã³ããªã¯ãããã¶ã€ã³ã厩ããŠããŸã£ãããä»ã®ç®æã® JavaScript ã®å®è¡ãšã©ãŒã«ãã£ãŠäžéšã®æ©èœã忢ããŠããŸã£ãããšããããŸãããçµæãšããŠãªãŒããŒãºãBASE å
±ã«åãåãããã¯ã¬ãŒã ã«ç¹ãã£ãŠããŸããŸãã // æå³ãã class ãè¡çªããŠããŸã£ãïŒ < div class = "review" > < style > .review { padding : 40px ; /* äºéã« padding ãé©çšãããŠããŸãããã¶ã€ã³åŽ©ãã®åå ã« */ } </ style > < div class = "review" > < div ...> .... </ div > </ div > < script > document . querySelectorAll ( '.review' ) . ... // æ¬æ¥æ³å®ããŠããªãèŠçŽ ã察象㫠</ script > </ div > ãããã®åé¡ã解決ããæ¹æ³ãšã㊠Web Componentsã ç¹ã« Shadow DOM ãžã®æåŸ
ã倧ãããªã£ãŠããŸããShadow DOM ã¯ã«ãã»ã«åããã DOM ããªãŒãã¹ã¿ã€ã«ã䜿çšã§ãããããHTML ç·šéãæžãããã³ãŒããš BASE ãæäŸããŠããã³ãŒãããäºãã«å¹²æžãã¥ãããªããŸãããããå©çšããããšã§ãæäŸåŽå©çšåŽã«é¢ãããå®å®ããæ©èœã®éçºã远å ãå®çŸã§ããããã«ããŠãããããšæã£ãŠããŸãã ãŸããBASE ã®ã·ã§ãã以å€ãžã® BASE ã®æ©èœã®è¿œå ã®ãããªããšãèããããŸããå°æ¥çã«ä»¥äžã®ãããªã³ãŒããåã蟌ãããšã§ãã©ãããã§ã BASE ã®ååã賌å
¥ã§ããæ©èœãæäŸããããããããŸããã < base -order itemId= "1234567890" ></ base -order > CSS ã«ã¹ã¿ã ããããã£ã«ãããã¶ã€ã³ã®å€æŽ CSS ã«ã¹ã¿ã ããããã£ã«ã€ããŠã¯ 2 éãã®æŽ»çšæ¹æ³ãèããŠããŸãã 1 ã€ã¯å
ã»ã©ç޹ä»ãã Web Components ã§ã®æ©èœæäŸã®ãã¶ã€ã³é¢ãè£å©ãããããªåœ¢ã§ã®å©çšã§ããWeb Components ã«æ©èœãé èœããŠãããšå®å
šæ§ãé«ãŸãäžæ¹ã§ããããŸã§æ¯èŒç容æã«è¡ããŠããã¹ã¿ã€ã«ã®äžæžãã«ãããã¶ã€ã³èª¿æŽãè¡ãã¥ãããªã£ãŠããŸããŸããæ©èœã®å®å®æ§ããã¡ããã§ããã·ã§ãããããŒãã«ãã£ããã¶ã€ã³ãæäŸã§ããå¿
èŠãããããããã®ééãåããããã®æ¹æ³ãšã㊠CSS ã«ã¹ã¿ã ããããã£çµç±ã§å€ãã®ã¹ã¿ã€ã«ã倿Žå¯èœã«ã§ããªãããšèããŠããŸãã 2 ã€ç®ã¯å®éã« BASE ã®ã·ã§ããéçšããŠããæ¹ã§ãªããšåããã¥ãããããããŸããã ãã¶ã€ã³ããŒã±ãã ã§è²©å£²ãããŠããå€ãã®çŽ æµãªããŒãã¯ãããã«çްéšãã«ã¹ã¿ã ã§ããããã¶ã€ã³ãªãã·ã§ã³ããæäŸããŠããŸãã デザインオプション · Developers ãã®ãã¶ã€ã³ãªãã·ã§ã³ãæ¬åœã«çްããçšæããŠãã ããããŒããã¶ã€ããŒæ§ãå€ã BASE ãšããŠãéåžžã«å¬ããã®ã§ãããã©ãããŠããã®æ°ã«å§åãããŠããŸããããªã±ãŒã¹ãååšããŸããããã§ããã ãã床ã«ããããŠæ®µéçãªèšå®ã CSS ã«ã¹ã¿ã ããããã£ãããŒã¹ã«å°å
¥ã§ããªãããšèããŠããŸããäŸãã°ã§ããããã¶ã€ã³ãªãã·ã§ã³ãã§èšå®ã§ãããã®ã¯å€§ãŸããªã«ã©ãŒã®ã¿ã«çµãã现ããªã«ã©ãŒèª¿æŽã«ã€ããŠã¯åã
ã« CSS ã«ã¹ã¿ã ããããã£ãèšå®ã§ãããããªæ©èœã§ãã ä»ã«ãã«ã©ãŒã»ããã®ãããªæ©èœãèããããŸããçŸè¡ã®ãã®ã§ãäžéšã®ã«ã©ãŒã«ã€ããŠã¯ããŒãéã§èšå®ãåŒãç¶ããããã«ãªã£ãŠããã®ã§ããããããããæ±çšçãªä»çµã¿ãšããããšã§ãã€ã¹ããç¶æãããŸãŸæ§ã
ãªããŒãã詊ãããªã©ããããã¯ãã¡ãã BASE ã ãã§å®è£
ã§ãããã®ã§ã¯ãªããããŒããã¶ã€ããŒã®ååãå¿
é ãªãã®ã§ãã ãŸã ãŸã ã§ããããšã¯ãããã ä»åã¯ç¹ã« HTML ç·šéãã·ã§ãããã¶ã€ã³ã«å€§ããé¢ãããã®ã«ã€ããŠèšåããŸãããããã¡ããä»ã«ã BASE ããã£ãšäœ¿ãããããªããããªæ¹åã宿œãããŠãããŸãã IE11 ã®ããã«åŠ¥åããŠãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®èª¿æŽ 管çç»é¢ã®ããã©ãŒãã³ã¹ã®åäž ãããŠãéçºã®ã¹ããŒãã¢ãã IE11 ã®ãµããŒããçµäºããéçºã«ããŒã¹ãã®ããã£ã BASE ã®ä»åŸã«ãæåŸ
ãã ããããããŠãããªéçºãäžç·ã«ãã£ãŠã¿ããã¡ã³ããŒãåžžã«åéããŠãããŸãã open.talentio.com
èªå·±çŽ¹ä» ããã«ã¡ã¯ãBASEæ ªåŒäŒç€Ÿã®ããã³ããšã³ãããŒã ã®è°·å£ã§ãã æ¬æ¥ã¯ãBASEã®ããã³ããšã³ãã§äœ¿çšããŠããæ¥ä»ã©ã€ãã©ãªã«ã€ããŠã話ãããŸãã BASEã®æ¥ä»ã©ã€ãã©ãªã«ã€ã㊠BASEã§ã¯ãfrontendãšããé åãåºæ¥å§ããåœåãæãã¡ãžã£ãŒãªæ¥ä»ã©ã€ãã©ãªã§ãã moment.js ã䜿çšããŠããŸããã ãã®åŸã ãã¶ã€ã³ã³ã³ããŒãã³ãã®éçº ãªã©ãfrontendé åãæé·ããŠããäžã§ ãã䜿ãåæã®è¯ãå¥ã®æ¥ä»ã©ã€ãã©ãªãæ€èšããã date-fns ãæ¡çšãããŸããã çŸæç¹ã§ãã»ãŒå
šãŠã®ã³ãŒããdate-fnsã«ç§»è¡æžã¿ã§ãã date-fnsã«ã€ã㊠date-fnsã«ã€ããŠå°ã説æãããšãå
¬åŒã«ããããŸããäžèšã®ãããªç¹åŸŽãäžããããŸãã moment.jsã day.js ãDateãªããžã§ã¯ããã©ããããŠæ±ãã®ã«å¯ŸããçŽç²ãªé¢æ°ãå¿
èŠãªåã ãèªã¿èŸŒãã§äœ¿çšããããšãåºæ¥ãŸãã ãã¡ãã® ãã£ã¬ã¯ã㪠ãèŠããšã180以äžã®æ©èœãçšæãããŠãããå
šãŠé¢æ°ãexportããŠããäºãããããŸãã date-fnsã¯å€ãäžå€ã«ä¿ã€ããšãå¯èœã§ãã ããã¯moment.jsãšæ¯èŒãããšäžèšã®ãããªéããèŠãããŸãã //moment.jsã®å ŽåãaddãåŒã³åºã床ã«å
ã®å€ã倿ŽãããåãçµæãåŸãããŸããã //ã³ã³ãœãŒã«ã«èŠåãã衚瀺ãããŸããããã®åäœãäºæãã¬ãã°ãçã¿åºãå¯èœæ§ããããŸãã const today = new Date (); const momentToday = moment(today); momentToday.add( "day" , 3); console.log(momentToday.toDate()); // Sat Nov 07 2020 11:17:47 GMT+0900 (æ¥æ¬æšæºæ) momentToday.add( "day" , 3); console.log(momentToday.toDate()); // Tue Nov 10 2020 11:17:47 GMT+0900 (æ¥æ¬æšæºæ) //date-fnsã®å Žåãå
ã®å€ã倿Žããããšã¯ãããŸããã const threeDaysTime = addDays(today, 3); console.log(threeDaysTime); // Sat Nov 07 2020 11:17:47 GMT+0900 (æ¥æ¬æšæºæ) const sixDaysTime = addDays(threeDaysTime, 3); console.log(sixDaysTime); // Tue Nov 10 2020 11:17:47 GMT+0900 (æ¥æ¬æšæºæ) ãŸãä»ã®ã©ã€ãã©ãªãšäŸåããŠãããã颿°ãåŒã³åºãåºŠã«æ°ããDateãªããžã§ã¯ããè¿ããŸãã 颿°èªäœã«ãå¯äœçšãç¡ãããããã¹ãããŒã«ãä»ã®ã©ã€ãã©ãªã«çµã¿èŸŒãããšã容æã§ãã bundleãµã€ãºã䜿çšããèšèªãwebpackã®èšå®ã«ããç°ãªããŸãããæ¯èŒç軜éã§ãã åºå
ž: https://bundlephobia.com/ TreeShakingããµããŒãããŠããŸãã TypeScriptãšFlowã©ã¡ãã«ã察å¿ããŠããŸãã ããã¥ã¡ã³ã ãå
å®ããŠããããµã³ãã«ã³ãŒããè±å¯ãªã®ã§ãäœ¿ãæ¹ã«å°ããšããããšãå°ãªãã§ãããã ãŸãè¿é ãmoment.jsãã¡ã³ããã³ã¹ã¢ãŒãã«ãªããšããäž»æšã® èšäº ãå
¬éãããŸããã ãã®ç§»è¡å
åè£ã®ïŒã€ãšããŠdate-fnsãèšèŒãããŠããç¥å床ãé«ãã©ã€ãã©ãªã§ãã åºå
ž: https://www.npmtrends.com/ date-fnsã®ããŒãžã§ã³ã¢ãã äžèšã®çµç·¯ã§æ¡çšãããdate-fnsã§ãããBASEã§ã¯ãå®è£
åœåã®v1.30.1 ããã¢ããããŒããããŠããªãã£ããããä»å¹Žã®3æã«v2.0.0ã«ã¡ãžã£ãŒã¢ããããŒãããŸããã v2.0.0ã®éçºã«ã¯ããã 2å¹Žã®æ³æ ããããããŠããã äžã«ã¯ ç Žå£çå€æŽ ãå«ãŸããŠãããããããã€ãä¿®æ£ããå¿
èŠããããŸããã v1.30.1 -> v2.0.0ã®äž»ãªç Žå£ç倿Žç¹ äžèšã颿°åã®å€æŽãªã©ãé€ããäž»ãªå€æŽç®æã§ãã (ãµã³ãã«ã³ãŒãã¯å
¬åŒããæç²ããŠããŸã) äž»èŠãªé¢æ°ã¯æååãèš±å¯ããŠããããæ¥ä»ã®ã¿æå®ã«ãªã£ãã æååã䜿çšãããå Žåã¯parseISOã§å€æããŠäœ¿çšããå¿
èŠããããŸãã // Before v2.0.0 addDays( '2016-01-01' , 1) // v2.0.0 onward addDays(parseISO( '2016-01-01' ), 1) Unicodeã®ãã©ãŒããããå€ãããŸããã 以åãŸã§ã¯moment.jsã®ä»æ§ãæš¡å£ããŠãã çµç·¯ ããããŸãããããã®ä»ã®å€ãã®èšèªã«ç¿ã£ãŠãããæ®éçãªç©ã«å€æŽãããŸããã åŸæ¹äºæçšã®ãªãã·ã§ã³ãçšæãããŠããŸãããä»åŸãã®ãªãã·ã§ã³ãåé€ãããå¯èœæ§ãé«ãã®ã§ãå¯èœãªéã倿Žããæ¹ãè¯ãã§ãããã // Before v2.0.0 format( new Date (), 'YYYY-MM-DD' ) //=> 2018-10-283 // v2.0.0 onward format( new Date (), 'yyyy-MM-dd' ) //=> 2018-10-10 format( Date .now(), 'YY-MM-dd' , { awareOfUnicodeTokens: true } ) //=> '86-04-04' format颿°ã¯æç€ºçã«ãã©ãŒããã圢åŒãæå®ããå¿
èŠããããŸãã // Before v2.0.0 format( new Date (2016, 0, 1)) // v2.0.0 onward format( new Date (2016, 0, 1), "yyyy-MM-dd'T'HH:mm:ss.SSSxxx" ) æ¥æ°ã®å€æã¯parse颿°ã«å
šãŠå§ä»»ããŠããŸããããparseã¯åŒæ°ãå¿
é ãšããããããã®çšéã«åããã颿°ãçšæãããŸããã // Before v2.0.0 parse( '2016-01-01' ) parse(1547005581366) parse( new Date ()) // Clone the date // v2.0.0 onward parse( '2016-01-01' , 'yyyy-MM-dd' , new Date ()) parseISO( '2016-01-01' ) toDate(1547005581366) toDate( new Date ()) // Clone the date æåŸã« æ¥ä»ãšããæ§è³ªäžã倿Žç®æã¯å€å²ã«æž¡ããŸããããç Žå£ç倿Žããã£ãã«ãé¢ããã ã¢ããããŒãã®é£åºŠã¯ãããŸã§é£ãããã®ã§ã¯ãããŸããã§ããã ããã¯ãdate-fnsãDateãåŒæ°ãšããŠæž¡ãã ãããšããã·ã³ãã«ãªäœ¿ãæ¹ã§ãããããä¿®æ£ãã¹ãã³ãŒããæ¯èŒçèªã¿ãããã£ããããã ãšæããŠããŸãã moment.jsãã¡ã³ããã³ã¹ã¢ãŒãã«ãªãäžãç§»è¡åè£ã®ïŒã€ãšããŠdate-fnsãæ€èšããŠã¿ãŠãããã§ããããã
ããã«ã¡ã¯ãBASE BANK æ ªåŒäŒç€Ÿ Dev Division ã«ãŠã Software Developer ãããŠããæ±å£ïŒ @hgsgtk ïŒã§ãã BASE BANK Dev ã§ã®éçºã§ã¯ãã¯ã©ãŠãã€ã³ãã©ã®æ§æç®¡çã«ã Terraform ãå©çšããŠããŸãã äžã®æ
å ±ããããããã¥ã¬ãŒã·ã§ã³ããŠãã CTO ã® @dmnlk ããã«ãæè»œã« CI ã«çµã¿èŸŒããããªã»ãã¥ãªãã£ãã§ãã¯ããŒã«ãããããšãæããŠããã£ãã®ã§ãå°å
¥ããŠã¿ãŸããã CTOæ°ã®ãã¥ã¬ãŒã·ã§ã³ã¡ãã£ã¢ã§ç޹ä»ããã tfsec ãæ©é詊ããŠè¯ãããã ã£ã https://t.co/bl67dlW2Ub https://t.co/vAkTOVagec — Kazuki Higashiguchi (@hgsgtk) August 21, 2020 ãã®ããã°ã®å
¬éæ¥ã¯ 2020/10/30 ã§ãã®ã§ãå°å
¥ããŠããçŽ 2 ã¶æåŒ·çµã¡ãŸãããå°å
¥ã»éçšãã€ã¥ããçµéšããããããã tfsec èªäœã®å€åããéçšããããšã§åŠã¹ã AWS ã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ãã玹ä»ããŸãã ç®æ¬¡ ç®æ¬¡ TL;DR tfsec ãšã¯ å§ãæ¹ ã¯ã©ãŠãã®èªèšŒããŒã»æš©éä»äžãå¿
èŠãªãããå°å
¥ãããã GitHub Actions ã§å§ãã æ¢åã®ææã¯ tfsec:ignore ã§ãã£ãã Fixme issue ã«ãã tfsec ã®ææãã AWS ã«ãããã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ãåŠã¶ Amazon CloudFront ã®æšå¥š SSL/TLS Policy Amazon ECR ã®ã€ã¡ãŒãžã¹ãã£ã³æ©èœã®æå¹å Amazon S3 ã®ãã±ãããã®ã³ã° AWS Key Management Service ã®ããŒããŒããŒã·ã§ã³ã®æå¹å Amazon Elasticsearch Service ã®ããŒã¿ä¿è· ããŒãééä¿¡ã®æå·å ä¿ç®¡æã®æå·å Redis çš Amazon ElastiCache ã®ããŒã¿ä¿è· In-Transit Encryption (TLS) At-Rest Encryption ãã®ä» aws_security_group_rule' should include a description for auditing purposes aws_cloudfront_distribution' does not have a WAF in front of it ãããã« TL;DR Terraform ã®ã»ãã¥ãªãã£éçè§£æ tfsec ã¯ã¯ã©ãŠãã®èªèšŒããŒã»æš©éä»äžãå¿
èŠãªãããããã«è©Šãããšãåºæ¥ã tfsec èªäœã®éçºãé »ç¹ã«ã³ããããããŠããæ¥ã
é²åãéããŠãã tfsec ã䜿ãç¶ããããšã§åŠãã AWS ã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ãããã€ã玹ä»ãã tfsec ãšã¯ tfsec ã¯ãTerraform ãã¡ã€ã«ãéçè§£æãã»ãã¥ãªãã£ã€ã·ã¥ãŒãšãªããããªç¹ãææããŠãããããŒã«ã§ãã A static analysis security scanner for your Terraform code. Discover problems with your infrastructure before hackers do. www.tfsec.dev AWSã»Azureã»GCP ãšãã£ãã¯ã©ãŠããã³ããŒããµããŒãããŠããŸãããŸããç§å¿æ
å ±ã®æ··å
¥ããªãããšãã£ãç¹å®ãã³ããŒã«é¢ãããªãäžè¬çãªã»ãã¥ãªãã£ãã§ãã¯äºé
ãåããŠããŸãã éçºã¯ã¡ã³ãããŒã»ã³ã¢ã³ããã¿ãŒã®æ¹ã
ã«ãã£ãŠé »ç¹ã«è¡ãããŠããŸãããã§ãã¯é
ç®ã®æ°èŠè¿œå ã¯ãã¡ããã®ããšãå
ã»ã©ç޹ä»ãã https://www.tfsec.dev ãšãããŠã§ããµã€ããå
¬éããããtfsec èªäœã®ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã ã«ã¹ã¿ã ãã§ãã¯ äœæã®ãµããŒããªã©ãæ¥ã
æ°æ©èœã远å ãããŠããŸãããŸããçè
èªèº«ããã€ã PR ãæåºããŠããŸããããã«å¯ŸããŠãããã«åå¿ããã ãã¡ã³ãããŒã»ã³ã¢ã³ããã¿ãŒã®ç±éã®é«ããæããŸãã å§ãæ¹ ã¯ã©ãŠãã®èªèšŒããŒã»æš©éä»äžãå¿
èŠãªãããå°å
¥ãããã tfsec ãå§ããããç¹åŸŽãšããŠãåœè©²ã¯ã©ãŠãã®èªèšŒããŒã»æš©éãªã©ãäžèŠãªç¹ã§ããããšãã°ã terraform plan ããããããªããŒã«ã ãšãAWS ã®å Žå IAM ãçºè¡ããå¿
èŠããããŸããããããæ¬ããŒã«ã¯ *.tf ãã¡ã€ã«ã®å
容ã®éçè§£æãè¡ãã ããªã®ã§ããããããããŸããã AWS ã§ã®ã€ã³ãã©æ§æç®¡çã Terraform ã§ããå Žåã Terraform ã«å¯ŸããŠãããªãã«åŒ·ãæš©éãä»äžããããããã®æš©é管çãã©ãã§ãããã¯è«ç¹ã«ãªããã¡ã§ãããããèããªããŠããã®ã¯ããšãŠãå§ããããå©ç¹ã ãªãšæããŸãã GitHub Actions ã§å§ãã ç§ã®æå±ããããŒã ã§ã¯ã GitHub Actions ã§å°å
¥ãã¯ãããŸããã å
¬åŒã® GitHub ã§ã¯ã triat/terraform-security-scan ã玹ä»ãããŠããŸãããããä»åã¯ãGitHub ã® Pull request(PR) ãžã®ã³ã¡ã³ããããã«å®çŸã§ããç¹ã§ã reviewdog ãå
¬éããŠãã reviewdog/action-tfsec ã䜿çšããŸããã github.com æ¬ã¢ã¯ã·ã§ã³ã䜿ã£ãèšå®æ¹æ³ã¯äŸãã°æ¬¡ã®ãã㪠yml ãã¡ã€ã«ã§ãã name : tfsec on : [ pull_request ] jobs : tfsec : name : tfsec runs - on : ubuntu - latest steps : - name : Checkout uses : actions /checkout @v2 - name : Terraform security scan uses : reviewdog /action - tfsec@master with : github_token : $ {{ secrets.github_token }} reporter : github - pr - review # Change reporter fail_on_error : " true " # Fail action if errors are found filter_mode : " nofilter " # Check all files, not just the diff flags : "" # Optional ããã«ãããæ¬¡ã®ããã«ææå
容ã GitHub ã® PR ã®ã³ã¡ã³ãã§èŠããããã«ãªããŸãã ReviewDogã«ããPRãžã®ã³ã¡ã³ã ã¡ãªã¿ã«ãæè¿ GitHub ã« Unchanged files with check annotations ãšãã Beta çã®æ©èœãã€ããŠãPR ã§ã®å€æŽå·®åå€ã®ãã¡ã€ã«ã«å¯Ÿããã³ã¡ã³ããåæ ãããããã«ãªããŸããã "Unchanged files with check annotations" ã«ããPRå·®åå€ã®ã³ã¡ã³ã tfsec ã¯ãRelease ã«ãã£ãŠæ°ããªãã§ãã¯é
ç®ãå¢ãããããŸãããã§ãã¯é
ç®ãå¢ããéã«ãããã«åŒã£ãããå
容ã Terraform ã®èšè¿°ã«å«ãŸããŠããªãããç¶ç¶çã«ãã§ãã¯ããã«ããã£ãŠã䟿å©ãªæ©èœã ãªãšå人çã«æããŠããŸãã github.com æ¢åã®ææã¯ tfsec:ignore ã§ãã£ãã Fixme issue ã«ãã GitHub Actions ã«å
¥ãããšãå€ããå°ãªããã Error / Warning ã¬ãã«ã®å
å®¹ãææããããããããŸãããå°å
¥ã«ããããã¹ãŠãçŽããŠãããšããã®ãæ°èŠã«çãŸããã»ãã¥ãªãã£ã®ç©Žãå¡ããªããŠãã£ãããªãã®ã§ãåŒç€Ÿã®äŸã§ã¯ãæåã« tfsec:ignore ãšããããŒãã³ã°ã§æ¢åã®ææãç¡èŠããèšå®ãããŠãããŸããã resource " aws_ecr_repository " " hoge " { # tfsec : ignore : AWS023 # Fixme above it Fixme ã§æ®ãã€ã€ãéæè§£æ¶ããŠããæ¹æ³ããšã£ãŠãããŸããã tfsec ã®ææãã AWS ã«ãããã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ãåŠã¶ å®éã« tfsec ã䜿ãç¶ããŠããŸããŸãªææã«ãã£ãŠã AWS ã«ãããã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ãåŠã³ãŸããããããã®åŠã³ããããåãããŸããå
·äœçã«ã¯æ¬¡ã®å
容ã玹ä»ããŸãã Amazon CloudFront ã®æšå¥š SSL/TLS Policy Amazon ECR ã®ã€ã¡ãŒãžã¹ãã£ã³æ©èœã®æå¹å Amazon S3 ã®ãã®ã³ã°ãã±ãã AWS Key Management Service ã®ããŒããŒããŒã·ã§ã³ã®æå¹å Amazon Elasticsearch Service ã®ããŒã¿ä¿è· Redis çš Amazon ElastiCache ã®ããŒã¿ä¿è· ãã®ä» ã²ãšã€ã²ãšã€èŠãŠã¿ãŸãããã Amazon CloudFront ã®æšå¥š SSL/TLS Policy tfsec ã§ã¯ aws_cloudfront_distribution' defines outdated SSL/TLS policies (not using TLSv1.2_2018) ãšããææé
ç®ããããŸããããã¯ã以äžã® issue ã§è¿œå ããã CloudFront ã®ãã§ãã¯èгç¹ã§ãã github.com ãã® issue åœæã®ãã¹ããã©ã¯ãã£ã¹ã§ã¯ã TLSv1.2_2018 ãæšå¥šãããŠãããŸããããããçŸåšã¯ã AWS Console ã«è¡šç€ºãããŠããŸããã TLSv1.2_2019 ãæšå¥šãããã»ãã¥ãªãã£ããªã·ãŒãšãªã£ãŠããŸãã ããããã TLSv1.2_2019 ã¯ã©ãéãã®ããšããçåãæãããæ¹ïŒãã€ãŠã®èªåã§ããïŒã¯ãã¯ã©ã¹ã¡ãœããããã®æ¬¡ã®ããã°ã®è§£èª¬ããšãŠãããããããã®ã§ããããã§ãã dev.classmethod.jp resource " aws_cloudfront_distribution " " example.com " { # ïŒçç¥ïŒ viewer_certificate { acm_certificate_arn = " certificateã®arn " cloudfront_default_certificate = false minimum_protocol_version = " TLSv1.2_2019 " ssl_support_method = " sni-only " } ) ããšããšã TLSv1.2_2018 ã§ã¯ãªãå Žå Error ãšææãããŠããŸããããPR ãæåºããªãªãŒã¹ããã ããŸããããã TLSv1.2_2019 ã«ãããŠã Error ã«ãªãå Žåã¯ãtfsec ã®ããŒãžã§ã³ã 0.27.0 >= ã«äžããŠã¿ãŠãã ããã github.com Amazon ECR ã®ã€ã¡ãŒãžã¹ãã£ã³æ©èœã®æå¹å ãã¡ãã¯ãååã®åå·ããã«å¯Ÿå¿ããã ããŸããã aws_ecr_repository' defines a disabled ECR image scan ãšããææãåã察å¿ãããã®ã§ããECR image scan ã¯ã2019 幎 10 æ 28 æ¥ã«å
¬éããã ECR image ã«å¯Ÿããã€ã¡ãŒãžã¹ãã£ã³ã®æ©èœã§ãã aws.amazon.com ä»ã®ããŒã«ã§ã¯ã trivy ã dockle ãªã©ããããããŸãã ECR Image scan ãæå¹ã«ããã«ã¯ã aws_ecr_repository.image_scanning_configuration ãèšå®ããŸãã image_scanning_configuration ã¯ãTerraform 2 ç³»ã®å Žå㯠2.34 ããã 3 ç³»ã®å Žå㯠3.10 ãã䜿çšå¯èœã§ãã resource " aws_ecr_repository " " hoge " { # ïŒçç¥ïŒ image_scanning_configuration { scan_on_push = true } } Amazon S3 ã®ãã±ãããã®ã³ã° aws_s3_bucket does not have logging enabled ãšææãããå ŽåãS3 ã®ãã±ãããã®ã³ã°ã®æ€èšãå¿
èŠã§ãã S3 ã§ã¯ AWSéçºè
ã¬ã€ãïŒAmazon S3 ãµãŒããŒã¢ã¯ã»ã¹ã®ãã°èšé² ã§è§£èª¬ãããéãããµãŒããŒã¢ã¯ã»ã¹ã«å¯Ÿãããã°èšé²æ©èœãæäŸãããŠããŸãããã®ãã®ã³ã°ãæå¹ã«ããŠãããšã»ãã¥ãªãã£ãã¢ã¯ã»ã¹ç£æ»ã®èгç¹ã§åœ¹ã«ç«ã¡ããã§ãã resource "aws_s3_bucket" "public-usecase-bucket" { # ïŒçç¥ïŒ logging { target_bucket = aws_s3_bucket.access-logs.id # logging bucketãæå® target_prefix = "logs/" } } resource "aws_s3_bucket" "access-logs" { # ïŒçç¥ïŒ acl = "log-delivery-write" } S3 ã®ã¢ã¯ã»ã¹ãã°ãã±ãããäœæããéã«ã¯ãacl ã log-delivery-write ã«ããŸãã discuss.hashicorp.com log-delivery-write ã¯ãAWS ããããããå®çŸ©ããæ¢å® ACL ãšåŒã°ãããã®ã® 1 ã€ã§ãïŒæ¢å® ACL ã«ã€ããŠã¯ã AWSéçºè
ã¬ã€ã:ã¢ã¯ã»ã¹ã³ã³ãããŒã«ãªã¹ã (ACL) ã®æŠèŠ ããåç
§ãã ããïŒã LogDelivery ã°ã«ãŒãã¯ãã±ããã«å¯Ÿãã WRITE ããã³ READ_ACP ã¢ã¯ã»ã¹èš±å¯ãååŸããŸãã ãã®ã³ã°ãã±ããèªäœã® ACL ãèããéã«ã¯ãã®æ¢å® ACL ã䜿çšããã®ã䟿å©ã§ãã 以åã¯ããã®ã³ã°ãã±ããèªäœã«ã aws_s3_bucket does not have logging enabled ãšããææãå
¥ã tfsec:ignore ããŒãã³ã°ã§åé¿ããå¿
èŠããããŸãããããããtfsec ã«å¯Ÿã㊠PR ãæåºãè§£æ¶ããããŸãããS3 ãã±ããã®ãã®ã³ã°ãã±ããã®å Žåãåœè©²ææãããªãããã«ä¿®æ£ãããŠããŸãã github.com AWS Key Management Service ã®ããŒããŒããŒã·ã§ã³ã®æå¹å ããã¯ãååã® @budougumi0617 ãããæ°èŠ KMS Key ãæ§ç¯æã«ææããã察å¿ããã ãããã®ã§ããAWS Key Management ServiceïŒä»¥éãAWS KMS ãšç¥ããŸãïŒã«ã¯ã ã«ã¹ã¿ããŒãã¹ã¿ãŒã㌠ããŒããŒã·ã§ã³ ãšããæ©èœããããŸãã AWS KMS ã¯èªåçã«æå¹ã«ããæ¥ãã CMK(Customer Master Key) ã 365 æ¥åŸã«ããŒããŒã·ã§ã³ãããã®åŸã¯ 365 æ¥ããšã«å®è¡ããŸãã docs.aws.amazon.com resource "aws_kms_key" "sample_key" { description = "æ©å¯æ
å ±ã®æå·åã«å©çš" enable_key_rotation = true # èªåããŒããŒããŒã·ã§ã³ãæå¹ã«ãã } äœæ¥ãšããŠã¯ã enable_key_rotation = true ã®èšå®ã ãã§ãããã®èšå®ãããŠãã 365 æ¥åŸã«èªåã§ããŒããŒã·ã§ã³ãããŸãã Amazon Elasticsearch Service ã®ããŒã¿ä¿è· ãã¡ãã¯ãååã®åå·ãããæ°èŠ Amazon Elasticsearch Service (以éãAmazon ES ãšç¥ããŸã)æ§ç¯æã«ææãã察å¿ããã ãããã®ã§ããAmazon ES ã¯ãããŒã¿ä¿è·ã«ãããã»ãã¥ãªãã£äžã®æ©èœãšããŠãããŒãééä¿¡ã®æå·åãã»ãä¿ç®¡æã®æå·åããšããïŒã€ã®ãªãã·ã§ã³ãåããŠããŸãã ããŒãééä¿¡ã®æå·å Amazon ES ã®ãã¡ã€ã³ã¯ãããã©ã«ãã§ã¯ VPC å
ã®ããŒãéãã©ãã£ãã¯ã¯æå·åãããŸããããããŒãééä¿¡ã®æå·åãæå¹ã«ããããšã§ VPC å
ã®ãã¹ãŠã®éä¿¡ã§ TLS 1.2 æå·åãæå¹ã«ãªããŸãã docs.aws.amazon.com ãã®èšå®ãããŠããªããšã Resource 'aws_elasticsearch_domain.es' defines an Elasticsearch domain with plaintext traffic (missing node_to_node_encryption block). ãšããææãåããŸãã å
·äœçã«ã¯æ¬¡ã®ãããªã³ãŒãã«ãã£ãŠããŒãééä¿¡ã®æå·åã®èšå®ãå¯èœã§ãã resource "aws_elasticsearch_domain" "es" { elasticsearch_version = "6.3" # (çç¥) node_to_node_encryption { enabled = true # true ã«ããããšã§æå¹åãã } } ãããã AWSéçºè
ã¬ã€ã: Amazon Elasticsearch Service ã®ããŒãéã®æå·å ã«ããéããããã¯æ¢åãã¡ã€ã³ã«å¯ŸããŠã®èšå®ã®ã€ãå€ãã¯ã§ããªããããæ¢åã® Amazon ES ãã¡ã€ã³ã«å¯ŸããŠã¯å¥ã®ãã¡ã€ã³ãäœæããå¿
èŠããããŸãã ãŸããelasticsearch_version ã 6.0 以éãæ±ããããŸããæ¢åãªãœãŒã¹ã«å¯ŸããŠäœãçŽãã®ã³ã¹ããæžããã®ã¯ããã©ããšãã倿ããããtfsec:ignore ããŒãã³ã°ãããšããã§ãããã ä¿ç®¡æã®æå·å Amazon ES ãã¡ã€ã³ã§ã¯ãAWS KMS ã䜿çšããŠã€ã³ããã¯ã¹ããã°ã»ã¢ããªã±ãŒã·ã§ã³ãã£ã¬ã¯ããªã®ããŒã¿ãªã©ãä¿ç®¡æã«æå·åããæ©èœãæäŸãããŠããŸãã docs.aws.amazon.com Terraform ã§ã¯ encrypt_at_rest ãšããèšè¿°ã§æå®ããŸãã resource "aws_elasticsearch_domain" "my_elasticsearch_domain" { domain_name = "domain-foo" encrypt_at_rest { enabled = trueã# ä¿ç®¡æã®ããŒã¿æå·åãæå¹å } } ãããããã¡ããæ¢åãã¡ã€ã³ã§ã¯æå¹ã«ã§ããŸããããŸããç¹å®ã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã®å Žåã¯ãµããŒãããŠããªãããšããããŸãã docs.aws.amazon.com R3 ã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã¯ãä¿ç®¡æã®ããŒã¿ã®æå·åãŸãã¯ãã现ããªã¢ã¯ã»ã¹ã³ã³ãããŒã«ããµããŒãããŠããŸããã ãµããŒã察象å€ã®å Žå tfsec:ignore ããŒãã³ã°ããããšã«ãªããŸããããã®ãããªæå·åã®æ€èšãææã«ãã£ãŠèããããã®ã¯ tfsec ã®è¯ãç¹ã§ããã Redis çš Amazon ElastiCache ã®ããŒã¿ä¿è· ãã¡ãã Amazon ES ã«ããããããŒãééä¿¡ã®æå·åãã»ãä¿ç®¡æã®æå·åããšé¡äŒŒããã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ãååšããŸããåè
ããIn-Transit Encryption (TLS)ããåŸè
ããAt-Rest Encryptionãã«ãŠèšå®ããŸãã In-Transit Encryption (TLS) tfsec ãã㯠Resource 'aws_elasticache_replication_group' defines an unencrypted Elasticache Replication Group (missing transit_encryption_enabled attribute ãšããã¡ãã»ãŒãžã§ææãããŸãã Amazon ElastiCache ã«ã¯ããããã¯ãŒã¯è»¢éæã®æå·åãªãã·ã§ã³ãçšæãããŠããŸãã docs.aws.amazon.com å
·äœçã«ã¯ã transit_encryption_enabled ãšãããªãã·ã§ã³ã true ã«ããŠããããšã§èšå®å¯èœã§ãã resource "aws_elasticache_replication_group" "my-resource" { # ïŒçç¥ïŒ transit_encryption_enabled = true } ãã¡ãã®èšå®ã¯ãRedis ã®å¯Ÿå¿ããŒãžã§ã³ïŒ3.2.6, 4.0.10 or laterïŒã察å¿å¯èœãªããŒãã¿ã€ããéããããšãã£ã å¶çŽæ¡ä»¶ ãäºåã«ç¢ºèªããå¿
èŠããããŸãã ãŸããæå·åã®å®è£
ã«ããããã¯ã¢ãããªãã¬ãŒã·ã§ã³ã»ããŒãåæãªãã¬ãŒã·ã§ã³ã®å®è¡ããã©ãŒãã³ã¹ãäœäžããå Žåãããããšã éçºè
ã¬ã€ã ã«ãŠç€ºããŠããŸãã ãªããæ¢åã®ã¬ããªã±ãŒã·ã§ã³ã°ã«ãŒãã®å Žåã¯æ°ããã¬ããªã±ãŒã·ã§ã³ã°ã«ãŒããäœæããå¿
èŠããããŸãããã¡ãã®æ¹æ³ã«ã€ããŠãã éçºè
ã¬ã€ã ã«ãŠå
·äœçãªæé ã説æãããŠããŸããå®éã«èªè
ã®äžã§æ°ãã€ããŠæ€èšããããæ¹ãããã£ãããã°ãæ¯éã芧ã«ãªã£ãŠãã ããã At-Rest Encryption tfsec ãã㯠Resource 'aws_elasticache_replication_group.bb-prd-auth' defines an unencrypted Elasticache Replication Group (missing at_rest_encryption_enabled attribute) ãšããã¡ãã»ãŒãžã§ææãããŸãã Amazon ElastiCache ã«ã¯ãããŒã¿ã®æå·åãªãã·ã§ã³ãçšæãããŠããŸãã docs.aws.amazon.com å
·äœçã«ã¯ã at_rest_encryption_enabled ãšãããªãã·ã§ã³ã true ã«ããŠããããšã§èšå®å¯èœã§ãã resource "aws_elasticache_replication_group" "my-resource" { # ïŒçç¥ïŒ at_rest_encryption_enabled = true } ãã¡ããããIn-Transit Encryption (TLS)ããšåæ§ã®å¶çŽäºé
ã»èæ
®äºé
ããããŸãã ã»ãã¥ãªãã£èгç¹ãšããã©ãŒãã³ã¹èгç¹ã®ãã©ã³ã·ã³ã°ã¯èªèº«ã®ã¢ããªã±ãŒã·ã§ã³èŠä»¶ã«æ²¿ã£ãŠæ€èšãå¿
èŠã§ãããtfsec ã«ãã£ãŠã»ãã¥ãªãã£èгç¹ã§ã®ææãçŽç²ã«åããããã®ã¯èšèšäžã®å©ç¹ã§ãããã ãã®ä» ãã®ä»ãå°ã现ããã§ãã管çäžå€§äºãªå
容ã玹ä»ããŸãã aws_security_group_rule' should include a description for auditing purposes Security group ã® INBOUND / OUTBOUND ã«ãŒã«ã«ã¯ã説æïŒdescriptionïŒãèšå®ã§ããŸãããç£æ»äžã¯èšå®ããããšãæšå¥šãããŸãã resource "aws_security_group_rule" "huga" { # ïŒçç¥ïŒ description = "BASE Office" } aws_cloudfront_distribution' does not have a WAF in front of it tfsec ã® v0.30.0 ã«ãŠè¿œå ããããã§ãã¯é
ç®ã§ãã docs.aws.amazon.com WARNING ã¬ãã«ã®ææãªã®ã§ãèŠä»¶äžç¥çµè³ªã«ãªãå¿
èŠããªããŠãŒã¹ã±ãŒã¹ã§ã® CloudFront ã®å©çšã§ããã° tfsec:ignore ããŒãã³ã°ã§å¯Ÿå¿å¯èœã§ãã ãããã« tfsec ã®å°å
¥ãšããã®ææé
ç®ãã AWS ã®ã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ã玹ä»ããŸããã ä»åã¯çŽé¢ã®éœåäžç޹ä»ããŠãããŸããããã¡ããã© 2020 幎 10 æã«äžæ°ã«éçºãé²ãã§ããã®ã ã«ã¹ã¿ã ãã§ã㯠ã§ããJSON 圢åŒã§ã«ãŒã«ãæå®ããããšã§èªåãã¡ã«ãšã£ãŠã®ã«ãŒã«ã tfsec ã®ãã§ãã¯å
ã«å°å
¥ã§ããŸãããã¡ãããŸãå¥ã®æ©äŒã«ç޹ä»ããããŸãã ããããã«äœ¿çšéå§ã§ããã®ã§ãã¡ãã£ãšã»ãã¥ãªãã£ã«é¢å¿ã»äžå®ããããã©äœãåºæ¥ãŠããªããšããæ¹ãããã£ãããã°ã詊ããŠã¿ãŠã¯ãããã§ããããã
BASE ã® Service Dev ã«ãŠäž»ã«æ±ºæžåšãã®ããã¯ãšã³ãéçºãããŠããç¿ å·ïŒ @midori44 ïŒã§ãã æšå¹Žã¯ PayPal決æžã®å°å
¥ ã®ãããžã§ã¯ãã§ã¡ã€ã³ãšã³ãžãã¢ãšããŠæºããããŠããã ããŸããã ä»åã¯æ±ºæžåšãã®éçºãããŠããäžã§ã瀟å
ã®éçºç°å¢ãæŽãã話ãããŸãã ããŒã«ã«éçºç°å¢ã§ã®èª²é¡ BASEã§ã¯çŸåšã BASEããããæ±ºæž ãšããŠ6ã€ã®æ±ºæžæ¹æ³ãæäŸããŠããŸãã æ¥ã
ã®æ©èœéçºãããŠããäžã§ããã¹ãŠã®æ±ºæžæ¹æ³ã«ãããŠåæ©èœãæ£ããåäœãããã確èªããããã«ãã¹ããŒãžã³ã°ç°å¢ã瀟å
æ€èšŒçšã®QAç°å¢ã ãã§ãªãéçºè
ã®ããŒã«ã«ç°å¢ã§ã決æžããã¹ãã§ããããã«ãªã£ãŠããŸãã æ°æ©èœã®ãªãªãŒã¹æã«ã¯ãã¡ããæ¬çªç°å¢ã§å®éã®æ±ºæžãéããŠåäœç¢ºèªããããã§ãããéçºäžã®ãã¹ãã®åºŠã«æ¬çªçžåœã®æ±ºæžãããããã«ã¯ãããªãã®ã§ãåæ±ºæžä»£è¡äŒç€Ÿæ§ã®ã»ãã§çšæããŠããã ããŠããæ€èšŒçšãµãŒããŒãsandboxç°å¢ã«æ¥ç¶ããŠãã¹ãããããšã«ãªããŸãã åºæ¬çã«ã¯ããã§åé¡ãªãã®ã§ããããã£ãªã¢æ±ºæžã«é¢ããŠã ãã¯ã¡ãã£ãšä»ã®æ±ºæžãšã¯ãããŒãç°ãªãããšãããããŒã«ã«ã§ã®ãã¹ã決æžãã§ããªãç¶æ
ã«ãªã£ãŠããŸããã ãã£ãªã¢æ±ºæžã®ãã㌠ãã£ãªã¢æ±ºæžã§ã¯ã賌å
¥è
ã¯äžåºŠã«ãŒããé¢ããŠæ±ºæžä»£è¡ãµãŒãã¹ã®ã»ãã§è³Œå
¥æç¶ããå®äºããŸãããã®ãããæ±ºæžã確å®ãããã©ããã¯webhookã§åãåãå¿
èŠãããã®ã§ãããå€éšã«ããæ±ºæžä»£è¡ãµãŒãã¹ã¯éçºè
ã®ããŒã«ã«ç°å¢ã«ããwebhookãµãŒããŒãžã¢ã¯ã»ã¹ã§ããŸããã ãã¡ãããå€éšã¢ã¯ã»ã¹ã§ããhttpãµãŒããŒãç«ãŠãŠãªã¢ãŒããã©ã¯ãŒããªã©ãããã°å¯èœã§ãããéçºçšã®å人ãã·ã³ã§ãããŸã§ããã®ã¯ãªã¹ã¯ãé«ãçŸå®çã§ã¯ãããŸããã ãšããããšã§ããã£ãªã¢æ±ºæžã®åäœç¢ºèªãããããšãã¯å
±çšã®æ€èšŒç°å¢ã§ç¢ºèªãããšããæ¹æ³ã§é·ããéçšãããŠããŸãããããã¯ãäžäŸ¿ã«æãã声ãå€ãã£ãã®ã§Dockeräžã§åãæ±ºæžä»£è¡ãµãŒãã¹ã®ã¢ãã¯ãµãŒããŒãäœã£ãŠè§£æ±ºããŸããã å€éšãµãŒãã¹ã®ã¢ãã¯å åŒç€Ÿã®ããŒã«ã«éçºç°å¢ã¯Dockerã§æ§ç¯ãããŠããŸããDocker Composeã®èšå®ãã¡ã€ã«ã¯GitHubã§ç®¡çããŠãããã«ãŒããåããŠããwebãµãŒããŒãã·ã§ããã³ã°ã¢ããªçšã®APIãµãŒããŒãããŒã¿ããŒã¹çšã®DBãµãŒããŒâŠâŠçã
ãåçš®ãµãŒããŒãã³ãã³ã1ã€ã§ç«ã¡äžããããšãã§ããŸãã ä»åã¯ããã®äžã®1ã€ã®ã³ã³ãããšããŠãã£ãªã¢æ±ºæžçšã®ã¢ãã¯ãµãŒããŒãç«ã¡äžããããããã«æºåããŸãã é©åœãªwebãµãŒããŒãçšæããŠãå®éã®æ±ºæžä»£è¡ãµãŒãã¹ãšåãã¬ã¹ãã³ã¹ãè¿ãã¢ãã¯ãµãŒããŒãäœããŸããä»åã¯è³Œå
¥äžã®ãªãã€ã¬ã¯ãå
ãšããŠãã©ãŠã¶ããã¢ã¯ã»ã¹ãããããæ£åžžç³»ã ãã§ãªãç°åžžç³»ããã¹ãã§ããããã«ãç»é¢äžã®æäœã«ãã£ãŠæå³çã«ãšã©ãŒãèµ·ãããããã«ããŠãããŸããã ã¢ãã¯ãµãŒããŒã®ãµã³ãã«ç»é¢ çŽç²ãªAPIãµãŒããŒã®å Žåã¯ãç°åžžç³»ã®ãã¹ããããããšãã¯ãç¹å®ã®ãªã¯ãšã¹ããæž¡ãããå Žåã«ã¯ãšã©ãŒãè¿ãããšããå®è£
ãäžè¬çããšæããŸãã ããšãã° PayPal ã®sandboxç°å¢ã§ã¯ããªã¯ãšã¹ãããããŒã« PayPal-Mock-Response ãæž¡ãããšã§ä»»æã®ãšã©ãŒãåãåãããšãã§ããããã«ãªã£ãŠããŸãã https://developer.paypal.com/docs/api-basics/sandbox/request-headers/ Docker Composeã«å®çŸ©ã远å ããŠãçšæããã¢ãã¯ãµãŒããŒãã³ã³ãããšããŠç«ã¡äžããããããã«ããŸããä»åã®ã¢ãã¯ãµãŒããŒæ§ç¯ã§æ³šæãããã®ã¯ã賌å
¥è
ã«ç¢ºèªç»é¢ã衚瀺ãããããã®ãã©ãŠã¶çµç±ã§ã¢ã¯ã»ã¹ãšãè£ã§webhookãµãŒããŒãžéç¥ãé£ã°ãããã®ã³ã³ããééä¿¡ã®2ã€ã®éä¿¡ãçºçããããšã§ãã åŒç€Ÿã®Dockerç°å¢ã§ã¯æ¬çªãšåãããã«ä»»æã®ãã¹ãåãã€SSLã§ã¢ã¯ã»ã¹ã§ããããDNSããªããŒã¹ãããã·ãéããŠããããã docker-compose.yml ã§ extra_hosts ãèšå®ããŠã¢ãã¯ãµãŒããŒããwebhookãµãŒããŒãžã®ã³ã³ããééä¿¡ã®ãšãã«ããªããŒã¹ãããã·ãéãããã«ããå¿
èŠããããŸããã æåŸã« å€éšãµãŒãã¹ã®ãµãŒããŒãäžžããšã¢ãã¯åããããšã§ãäžéãã®åäœç¢ºèªãDockerãããã¯ãŒã¯å
ã§å®çµãããããšãã§ããŸããã ä»åã¯ããŒã«ã«ã§ã®åäœç¢ºèªãæåŸãŸã§ã§ããªãããšããã®ã¢ãã¯åã§ããããå€éšãµãŒãã¹ã«å¯Ÿããåäœç¢ºèªïŒãã¡ãããã®ãªã¯ãšã¹ãã«å¯ŸããŠæ³å®ããã¬ã¹ãã³ã¹ãè¿ããã©ããïŒãšãèªãµãŒãã¹å
ã®åäœç¢ºèªïŒæ£åžžã¬ã¹ãã³ã¹ãããã¯ãšã©ãŒãåãåã£ããšãæ£ããåŠçããããïŒãåããŠèããããã«ããé©åãªã¢ãã¯åã¯åœ¹ã«ç«ã€ããšæããŸãã BASEã§ã¯éçºç°å¢ã®æŽåãäžé·æçãªæè¡åºç€ã®æ¹åãæ
ã£ãŠãããšã³ãžãã¢ãããã³120äžã·ã§ããã®æ±ºæžãæ¯ããŠãããšã³ãžãã¢ãåéããŠããŸãã binc.jp
ãã®èšäºã«ã€ã㊠ã³ãããŠã€ã«ã¹ã«ãã瀟äŒäžå®ã®åœ±é¿ã§ãã®å幎ã§ãªã¢ãŒãã¯ãŒã¯ã®æ©éãç¹ã«éœå¿éšãäžå¿ã«å€§ããé«ãŸã£ãŠããŸããã ã€ãå
æ¥ã€ããŒæ ªåŒäŒç€Ÿãå
šç€Ÿãã¬ã¯ãŒã¯ãžã®ç§»è¡ãæ£åŒçºè¡šããããšã¯èšæ¶ã«æ°ããã§ãã BASEã§ãã³ãããŠã€ã«ã¹ã®æææ¡å€§ã«äŒŽã£ãŠãã¡æ©ããªã¢ãŒãã¯ãŒã¯ã®å¶åºŠãæ§ç¯ãïŒ2020幎2æã«ã¯å
šç€Ÿçã«ãªã¢ãŒãã¯ãŒã¯ãéå§ïŒã ãã®å¶åºŠã¯çŸåšã§ããŸã éçšãããŠããŸãã ãŸããäžã®äžã®ååãããŒãºã®é«ãŸããããããªã¢ãŒãã¯ãŒã¯ãžã®é¢å¿ã®é«ãŸãã¯æ¡çšã®å Žé¢ã§ãæããããããã«ãªã£ãŠããŠããŸãã æã
ãåçš®æ±è·è
ã®ç޹ä»ãµãŒãã¹ãå©çšããŠããŸããããããã£ããµãŒãã¹ã§ã¯ãªã¢ãŒãã¯ãŒã¯å¯ã»äžå¯ãšããéžæè¢ããéžã¹ãªãå Žåãå€ãã çµå±é¢æ¥ã«æ¥ãŠããã ããæ¹ã«ãBASEã§ã©ã®ãããªãªã¢ãŒãã¯ãŒã¯å¶åºŠãåãããŠããããä»åŸã©ããªã£ãŠããäºå®ãã ãããã£ãå
å®¹ãæ¯åå£é ã§ãäŒããã圢ã«ãªã£ãŠããŸãã ããã§ãæ¯åã®ããã«è³ªåãåããã®ã§ããã°ãã£ãèšäºã«ããŠå
¬éãã çŸå Žããã¿ãBASEã®ãªã¢ãŒãã¯ãŒã¯ããäŒããããããšããã®ããã®èšäºã®è¶£æšã«ãªããŸãã ããªãã¯èª° ç§ã¯BASEã®ããã³ããšã³ãããŒã ã§ãšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒããã£ãŠããæŸå( @simezi9 )ã§ãã ãããŒãžã£ãŒã«ãªã£ãã®ã¯2020幎7æããã§ãããããŸã§ã¯ãšã³ãžãã¢ãšããŠåããŠããŸããã ãªã®ã§ãBASEããªã¢ãŒãã¯ãŒã¯ãå°å
¥ããäžã§ã©ãããè°è«ãè¡ãããŠããããçŽæ¥è³ã«ããããã§ã¯ãããŸãããã åœåã¯1ã¡ã³ããŒãšããŠäŒç€Ÿã®æ±ºå®ã«åŸã£ãŠè¡åããç«å Žã§ããããŸããã ãããŠä»ã§ã¯ãã®å¶åºŠãéçšããç«å Žãšãªã£ãŠãã®èšäºãæžããŠããŸãã BASEã§ã®ãªã¢ãŒãã¯ãŒã¯ã®äœçœ®ä»ã ãŸãæåã«BASEã®ãªã¢ãŒãã¯ãŒã¯ã«å¯ŸããŠçµè«ã ããè¿°ã¹ããšã ãBASEã§ã¯ãªã¢ãŒãã¯ãŒã¯ïŒä»¥äžãWFH = Working From Home)ã¯çŸç¶å¯èœã§ããããã«ãªã¢ãŒãã§åãã€ã¥ããŠããå¯èœæ§ãç©æ¥µçã«æš¡çŽ¢ããããšã¯çŸæç¹ã§ã¯æ³å®ããŠããªãããªã¢ãŒããšãªãã©ã€ã³ã®ãã©ã³ã¹ãæ¢ãã€ã€ããµãŒãã¹éå¶ã«æãæé©ãªåœ¢ã暡玢ããŠããã ãšããããšã§ãã ããã«ã€ããŠã¯æäžŠãªè¡šçŸãããããŸãããã察é¢ã§ãããã¯ç©ççã«äžç·ã«åãããšã§çãŸããé£åž¯æãã³ãã¥ãã±ãŒã·ã§ã³ãæåãšãã£ããã®ãBASEã§ã¯å€§äºã«ããããšããæããããããã§ãã 倧åæãšããŠBASEã§ã¯ãããããã¯ããéãåºãããŠãŒã¶ãŒã®çæ§ããµããŒããããšããç¹ã第äžã«èããŠããŸãã ãããŠãããããããã¯ããäœããå質ãé«ãããšããç¹ã«ãããŠãäžã§åã人éã®æ·±ãã³ãã¥ãã±ãŒã·ã§ã³ãæåã®éžæãšãã£ããã®ãå¿
èŠäžå¯æ¬ ã§ãããšèããŠããŸãã ãããŠãããã£ãé¢ä¿ãæ§ç¯ããããšã¯ãWFHã ãã§ã¯çŸæç¹ã§ã¯é£ãããã ãšãã倿ãããŠããããã§ãã ã³ããçŠã«ãããBASEã®æµã å
·äœçã«BASEã«ãããŠãWFHãã©ã®ããã«éçšãããŠãããããŸããã®äžã§èªåãå
·äœçã«ã©ã®ããã«æ¯ãèã£ãŠãããã玹ä»ããŸãã WFHç§»è¡åæïŒ2ã5æããïŒ å
šç€Ÿçãªåã BASEã§ã¯ã³ãããŠã€ã«ã¹ã®æææ¡å€§ã«äŒŽãæ¯èŒçæ©ã段éã§WFHå¶åºŠãæŽåããã2æäžæ¬ãäžæ¬ã«ã¯ã»ãŒå
šç€Ÿã®ã¡ã³ããŒãWFHãéå§ããŸããã ããŸãŸã§ã¯åºæ¬çã«WFHã®ããã®å¶åºŠã¯ãªãåºç€Ÿãåæã§ãã£ãBASEã§ããã ãæ©æã«ç§»è¡ã§ããã®ã¯æ
ã·ã¹ã®ã¡ã³ããŒã®åªåã®è³ç©ã§ããã ãããã®ä»çµã¿ã®æŽåãé²ããããŠãããšãšãã«ã瀟å
çã«ã³ãããŠã€ã«ã¹ãšåãæ¹ã®ããæ¹ãã©ã®ããã«å®çŸ©ããã®ããšããå
éšè³æãçšæããã éœã®çºè¡šããèŠæã¬ãã«ãªã©ãšç
§ããåãããªãã宿çã«éçšãã¢ããããŒããããŠããŸãã 瀟å
ã§éçšãããŠããã¬ã€ãã©ã€ã³ èªåã®åã ãã®ææã¯èªåã¯ãŸã ãã ã®ãšã³ãžãã¢è·ã§ãã£ãã®ã§åºæ¬çã«å®¶ã§äœæ¥ãããŠããŸããã 3æé ãš4æé ã«ããŒã ã«æ°ã¡ã³ããŒãå
¥ç€ŸããŠããŠãããã®ã§ããã®é¡åããã®ããã«æåã ã2ã3æ¥äŒç€Ÿã«è¡ã£ã以å€ã¯åºç€Ÿã¯ãããŸããã§ããã ããšããšå®¶ã®äœæ¥ç°å¢ãç¡æå³ã«æŽããã®ã倧奜ããªæ§åã ã£ãã®ã§ãWFHéå§æã«ã¯äŒç€Ÿã®æ
å ±å
±æããŒã«ã«è¬ã®ãšã³ããªãæäžããŠã¯ãããã ãããŠããŸããã äœæ¥çã«ã¯ç¹ã«å€§ããªåé¡ã¯ãªãç§»è¡ã§ãããšæã£ãŠããŸãã åœæã®ãã€ãã³ã·ã§ã³ã§æžããè¬ã®ãšã³ããªçŸ€ ãã ãããã³ããšã³ããšã³ãžãã¢ãšããä»äºæãäœã£ããã®ã宿çã«ãã¶ã€ããŒããã£ã¬ã¯ã¿ãŒã«çŽæ¥èŠããŠçžè«ãã€ã€åŸ®èª¿æŽãããã ãšãã£ãããšã®ã³ãã¥ãã±ãŒã·ã§ã³ã³ã¹ããé«ããªã£ãŠããŸã£ãããä»äºã®å¹çãšããæå³ã§ã¯ãªããšãèšããªãéšåããã£ãããšã¯åŠå®ã§ããŸããã WFHç§»è¡äžæïŒ6~8æé ïŒ å
šç€Ÿçãªåã äžã®äžçã«ã¯å°ããã€ä»¥åã®ãããªæŽ»åãåãæ»ãåãçµã¿ãå§ããäŒæ¥ãããããã¯ãããææã ãšæããŸããã BASEã§ã¯WFHã§äžååºç€Ÿããªãã¡ã³ããŒã倧åã§ããã äžéšã®ããªãã£ã¹ã§ãªããšä»äºãé£ããã¡ã³ããŒã ãã¯åºç€ŸããŠããŸãããããšã³ãžãã¢ã¯æ°åã®æ¹ãé€ããŠå®¶ã§ä»äºãããŠããŸããã ãªãã£ã¹ã®å©çšèªäœãçŠæ¢ããŠããããã§ã¯ãªããããªãã£ã¹ã䜿ãã»ããéœåãè¯ããã°äœ¿ã£ãŠè¯ãããšãããããªæè»ãªéçšã§ãã£ãããã è²å
ãªã©ã®å®¶åºã®éœåã§å®¶ã ãšäœæ¥ãé£ãããããªãšã³ãžãã¢ãåºç€ŸãããŠããŸããã æ¥åéœåã§åºç€ŸãèŠè«ããããšã³ãžãã¢ã¯åºæ¬çã«ã¯ããªãã£ãèšæ¶ããããŸãã èªåã®åã ç§èªèº«ã«ã8æã«èªåãæºãã£ãæ¯èŒç倧ããæ©èœã®ãªãªãŒã¹ããã£ããã 7æã«ãšã³ãžãã¢ãããšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒãžã®é
眮æããªã©ã®ã€ãã³ãããããŸãããã ãªãªãŒã¹ããããŒãžã£ãŒç ä¿®ãzoomãå©çšããŠãªã¢ãŒãã§è¡ãããããç¹ã«åºç€Ÿããããšã¯ãããŸããã§ããã çŸåš(2020幎9æã10æ) å
šç€Ÿçãªåã éœã®èŠæã¬ãã«ãå°ãäžãã£ãŠããããã«ããªãã£ã¹ãæ·±ãã³ãã¥ãã±ãŒã·ã§ã³ã®ã§ããå Žæã»äŒç€Ÿã®æåãçãåå£ãšããŠæãã é©åãªã¿ã€ãã³ã°ã§æŽ»çšããŠããããšããæ©éãé«ãŸã£ãŠããŸãã äŸãšããŠãäžéšã®ããŒã ã§ã¯é«åºŠãªæ¥åç¥èãå¿
èŠãªå Žé¢ã§ãã¡ã€ã³ã¢ããªã³ã°ã®ããã«é±ã«äžåºŠåºç€ŸããŠä»æ§ãç
®è©°ããŠãããã ãããŒãžã£ãŒé£ãä»åŸã®äœæ¥ã®ã¢ãµã€ã³ãçµç¹ã®æ§æãèããããã«æ¯é±åºç€ŸããŠããŒãã£ã³ã°ãããããšãã£ãå
·åã§ãã å人ã®äºæ
ã¯èæ
®ãããŠããŸãã®ã§ãã©ãããŠãåºç€Ÿã§ããªããšããæ¹ã«åŒ·å¶ãããã¯ããŠããŸããããå
šç€Ÿçã«åºç€Ÿæ¥ããã£ãããããŸããã ãã ããŒã åäœã§åºç€Ÿæ¥ã決ãããšãã£ã詊ã¿ãèŠãããããã«ãªã£ãŠããŸããã ãŸãæ¥åå€ã®ãšããã§ããæè¿ã§ã¯æ°ã¡ã³ããŒã®æè¿äŒãªã©ãè¡ãããŠããŸããã ïŒBASEã§ã¯åºãããªãŒã¹ããŒã¹ããããããã«ææå¯Ÿçã®è¡ç«ãªã©ãçšæããŠããããããã䜿ã£ãŠããŒãœãã«ã¹ããŒã¹ã確ä¿ããäžã§éå¬ããŠããŸãïŒ æè¿äŒã®æ§å å®¶ã§ã¯ãªãã ãä»äºãã¯ãã©ããªããšããã¡ã³ããŒã®èªçºçãªåºç€Ÿãå°ãã¥ã€å¢ããŠããŠããŸãã çŸåšBASEã§ã¯ç€Ÿå¡ãçŽ140åã»ã©åšç±ããŠããŸããã20åååŸããªãã£ã¹ã«åºç€ŸããŠããããã§ãã èªåã®åã ç§ããããŒãžã£ãŒäŒè°ã®ããã«æ¯é±éææ¥ã¯åºç€ŸããŠããŸãã ãŸããçŸåšã¡ã³ããŒãšã®1on1ãæ¯é±30åè¡ã£ãŠããŸãããBASEã§ã¯3ã¶æã«äžåOKRã§å人ã®ç®æšèšå®ãããæ©äŒãããã®ã§ããã®ã¿ã€ãã³ã°ã§ã®1on1ã§ã¯ã¡ã³ããŒã«åºç€ŸããŠããã£ãŠå¯Ÿé¢ã§ã¡ãããšè©±ããšããããšãè¡ããŸããã ãªã¢ãŒãã§æºè¶³ãªã³ãã¥ãã±ãŒã·ã§ã³ãåãåããŠããªãã£ããšããæ¹å€ã¯ããããšã¯æããŸãããèªåãå®éã«ãªãã£ã¹ã§ãã£ãŠäŒè©±ããããšã«ãã£ãŠåŸãããæ
å ±éãå
宿ãšããã®ã¯ããªã³ã©ã€ã³ããŒãã£ã³ã°ã ãã§ã¯è£ããããªããã®ã§ãããªãšæããŸããã æè§éæã«åºç€Ÿããã®ã§ããã°ãšããããšã§Mtgãªã©ã®çšäºããªãã¹ãéææ¥ã«åºããããããªã©ã®å·¥å€«ãããŠããŸãã çªçºçãªéè«ã®æéãªã©ãå€ããšã£ãŠãããéæã¯å®åžžæ¥åãããã³ãã¥ãã±ãŒã·ã§ã³ãåªå
ããæ¥ããšèªåã®äžã§ã¯ã¡ãã£ãšããå²ãåããããŠãããããŸãã ãããã ã³ãããŠã€ã«ã¹ã®æææ¡å€§ã¯çå°ç¹ãèŠãããå¬ãè¿ã¥ããŸãæææ¡å€§ãçºçããã®ã§ã¯ãªãããšããæ³å®ããããŸãã ãããªäžã§withã³ãããšããèšèã衚ããŠããããã«ããªã¹ã¯ãšã¡ãªããã®èœãšãæãæ¢ãåããç¶ããŠãããã®ãšæãããŸãã WFHãžã®èãæ¹ããã®ãã¡ã®1ã€ã§ãããšæããŸãã ãããŸã§çŸæç¹ã§ã®äºæž¬ã§ãããBASEã§ã¯æ¥ã«ãæ¥æããå
šå¡åºç€Ÿå¿
é ããšãããããªããšã«ã¯ãªããªãããã§ã¯ãããŸãã ãã ãæµããšããŠã¯ ãªãã¹ãåºç€Ÿã®æ©äŒã倧åã«ããŠãã ããšããè·¯ç·ã§ããããšã ãã¯ãŸã確å®ã§ãã åºç€Ÿããããšã«ããäžäŸ¿ã極åãªããããã®æŽåãé²ããããŠããŸãã äŸãã°ãªã¢ãŒãã§ã®ããŒãã£ã³ã°ãå¢ããããšã§äŒè°å®€ãæ¯æžæ°å³ã«ãªã£ãŠããŸããæ¥ã«åºç€Ÿããã¡ã³ããŒãå¢ãããšèããããªããªã£ãŠããŸããããªã®ã§ zoomã§ã®äŒè°ãããããã®å宀ã¹ããŒã¹ã®å°å
¥ãæ€èšãããŠãããããŸãã æåŸã« é·ããªããŸããããã³ãããŠã€ã«ã¹ã®æµè¡ã¯ç€ŸäŒæ§é ãè¯ããæªãã倧ããå€åãããŸããã ãŸãäžã®äžã®åãæ¹ã®åšãæ¹ã倧ããåèããããã£ããã«ããªããŸããã äŒç€Ÿããªãã£ã¹ãæšãŠãã«ãªã¢ãŒãã«ç§»è¡ãã話ããå人çã«æ±äº¬ãé¢ãè¿éã«ç§»ãäœã¿ãªã¢ãŒãã¯ãŒã¯ããããšãã£ããããªè©±ãçããã¯ãªããªã£ãŠããŸããã ã¯ãŒã¯ã©ã€ããã©ã³ã¹ãšããæå³ã§ã¯ãèªåèªèº«ã®ç掻ããªã¢ãŒãã«ãã£ãŠãããªã£ãç¹ãããã€ããããŸãïŒéå€ããªããªã£ãæéã§èªçãå§ãããããžã ã«è¡ã£ãŠã¿ãããšç²Ÿç¥çãªäœè£ãå¢ããïŒ ããã¯ãããªããããBASEã§ã®åãæ¹ã¯ç€ŸäŒæ
å¢ãèŠæ¥µãã€ã€æè»ã«éçšãããŠããããšãåœé¢ç¶ãããã«ãªã£ãŠããŸãã ããã¯ãªãã£ã¹ãå®å
šã«é¢ãããšããããšã¯ãããåã空éã§åãããšã®äŸ¡å€ã倧åã«ããªãããªã¹ã¯ãšã®ãã©ã³ã¹ããšãããšã§å®çŸãããŠããããšããããšã§ã ããæå³ã§ãªã¢ãŒãã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ã ãã§å
åã ãšãã人ã«ã¯BASEãšããäŒç€Ÿã¯åããªããããããŸãããã ãªã¢ãŒãç²ãããŠããŠããããåºç€ŸããŠã¡ãããšã³ãã¥ãã±ãŒã·ã§ã³ãšããªããä»äºãããããšããæ¹ã«ã¯åã£ãŠãããããããŸããã ããBASEã§ã®ãããªåãæ¹ã«èå³ããããŸãããã«ãžã¥ã¢ã«é¢è«ãšãã圢ã§ç€Ÿå
ã®ã話ããããŠããã ãæ©äŒãçšæããŠããã®ã§ããã²å¿åããã ããã°ãšæããŸãã æ¡çšæ
å ± | BASE, Inc. æ¡çšæ
å ±-ããã³ããšã³ããšã³ãžã㢠æ¡çšæ
å ±-Webã¢ããªã±ãŒã·ã§ã³ãšã³ãžãã¢
ããã«ã¡ã¯BASEæ ªåŒäŒç€Ÿåç· åœ¹EVP of Developmentã®ããµãã( @fshin2000 ïŒã§ãã ä»åã¯ã幎æ«ã®çµŠäžæ¹å®ããéçšãéå§ããè©äŸ¡ã°ã¬ãŒãå¶å°å
¥ã®ãè©±ãæžããŠã¿ãããšæããŸãã ãããŸã§äººææ¡çšæã®çµŠäžæ±ºå®ã瀟å¡ã®è©äŸ¡æã«ã¯ããããŒãžã£éã§çžè«ãåœ¹å¡æ¿èªã®äžã§çµŠäžã決ããŠããŸãããããã®åºæºãç©ºæ°æã¯è©³ãã瀟å
ã®ã¡ã³ããŒã«å
±æã§ããŠããŸããã§ãããçç±ãšããŠãäžéäž»äœã®æ¡çšã ãšã©ãããŠãåè·çµŠäžã«åœ±é¿ããã人ã«ãã£ãŠçµŠäžã«ã°ãã€ããã§ãŠããŸããããäœç³»ã ã£ãåœ¢ã«æŽããæ©äŒããªãã£ãã®ã§ãããä»åºŠã瀟å
ã«è©äŸ¡ã°ã¬ãŒãå¶ãšãããã®ãå°å
¥ããããšã«ãªããå絊äžã¬ã³ãžã®æ¹ã«æ±ããã¹ãã«ãæèã«ã€ããŠãŸãšããã®ã§ãã¡ãã§å
¬éããããŸãã è©äŸ¡ã°ã¬ãŒãå¶ãšããã®ã¯ãäžè¬çã«ççŽãšåŒã°ãããã®ã§ãäžå®ãµã€ãºä»¥äžã®äŒç€Ÿã®ãçµéšãããæ¹ãªããé¡ããå¶åºŠã¯ã©ãã§ããããšæããŸãã®ã§è©³çŽ°èª¬æã¯å²æããããŸãã ïŒæ¡çšé¢æ¥çã§è©³ããã説æå·®ãäžããããã°å¹žãã§ã ^^ ïŒ ä»¥åããããåœç€Ÿã®å ±é
¬äœç³»ã§ç¹åŸŽçãªã®ã¯ã幎å7ã800äžå以äžãšãã以äžã§çµŠäžã®äžããæ¹ãå€ãããšããããšãæããããŸãã瀟å¡ã®è©äŸ¡ã¯åææ¯ã«è¡ã£ãŠããã®ã§ããã700äžå以äžã®çµŠäžã®äººã¯ã¹ãã«åäžããã®ãŸãŸåœ¹å²åäžã«ã€ãªããã¬ã³ãžãšæããŠããŠãä»äºãé 匵ãåªåãæçµŠã«åæ ãããããã®ã«å¯ŸããŠã700äžå以äžã®äººã¯ãã®ãããªæŠå¿µããªãããŠããã®ä»£ããã 圹å²ãæåŸ
å€ã®å€æŽ ã«å¯ŸããŠå€§å¹
ãªçµŠäžã¢ãããç®æãããšã³ãžãã¢ãªã³ã°ãããŒãžã£ããããåæãšããŠæåŸ
ãèšå®ããŠãããšããèãæ¹ããããŸãã 700äžå以äžã®äººã¯ãåœå
ã®è»¢è·åžå Žã«ãããŠãçµéšè±å¯ãªãã€ã¹ãã«å±€ãšã¿ãªããããšæããŸãããããžã¡ã³ãåŽã®è²¬åãšããŠãè©äŸ¡é¢è«ãOKRã®èšå®ãéããŠã倧ããªæåŸ
ãããã倧ããªææããããŠãããã倧ããªæçµŠãå®çŸããããšãä»äºã§ãããšã³ãžãã¢ãªã³ã°ãããŒãžã£ã¯ãããŒã ã¡ã³ããŒããããã¥ãŒã¹ãããšããä»äºã®çµæãèªåèªèº«ã®è©äŸ¡ãšæçµŠã«ãã€ãªãããŸãã ãã®ä»¥åããåã£ãŠãã絊äžã®æ§é ãèžè¥²ããã°ã¬ãŒããå®ããŸããããããŸã§ãã£ãŠããçµŠäžæ±ºå®ããã»ã¹ãèšèªåãããšããã®ããäœæ¥ã«ããã£ãŠãã£ãããšã§ãã è©äŸ¡ã°ã¬ãŒãå¶ã«è³ããŸã§ã®éçš æŽå²ããå€§äŒæ¥ãèèäŒæ¥ã§åããŠãã人ãã¡ã¯ãççŽå¶åºŠãè©äŸ¡å¶åºŠãåœããåã«ååšããŠãããšæããŸãã®ã§ãããŸãæèããããšã¯ãªããããããŸããããã¹ã¿ãŒãã¢ããäŒæ¥ãè©äŸ¡ã°ã¬ãŒãå¶ãå°å
¥ããåæ©ã«ã¯çµç¹ã®æ¡å€§ã«ããããããŒãžã£ãžã®æš©éç§»è²ã®æèãååšããŸãã æ°å¹ŽåãŸã§æçµŠé¡ã圹å¡ã§æ±ºããŠãã圹å¡ããããŒãžã£ããå ±åãããã¡ã³ããŒã®æŽ»èºãæããããçµç¹ãµã€ãºã§ããã£ããã圹å¡ããããŒãžã£ãå
Œããã±ãŒã¹ãå€ãã£ãã®ã§ãäžå®ã®çŽåŸæã¯åŸãããŠãããšæãããã 圹å²ãæåŸ
ã«å¯Ÿãã絊äžã¬ã³ãžãæçµŠé¡ã®ãããªåºæºã¯ã圹å¡ãšãããŒãžã£éã«ã¯ååšããŠããŠãæ¡çšæŽ»åãå幎ããšã«è¡ãããè©äŸ¡äŒè°ãéãããã³ã«ãã©ãã·ã¥ã¢ãããããŠãã£ã çµç¹ã倧ãããªããããŒãžã£ãå¢ãããªãããã®åºæºãèšèªåããããšã§ãã©ãããã絊äžãäžããã®ãããã¬ãŒã ã¯ãŒã¯åããç®æšèšå®ãšè©äŸ¡ãã¹ã±ãŒã«ããããã«ãããã® äžè¬ã«ãããŒãžã£ã«çµŠäžã®ææ¡æš©éãç§»è²ããã«ããã£ãŠãè©äŸ¡ã¯ãªãªãã£ãç¶æããè©äŸ¡ãžã®çŽåŸæãšäºæ¥æé·ãå®çŸããããã®åãçµã¿ãšããŠå°å
¥ããããã®ãè©äŸ¡å¶åºŠãççŽå¶åºŠãšããããšã«ãªããŸãã è©äŸ¡ã°ã¬ãŒãã®åé¡ è©äŸ¡ã°ã¬ãŒãã¯ã A1ã»A2ã»Ex1ã»Ex2ã»Ex3ã»Ex4ã®6段é ã«åé¡ãããŸãã â»AïŒãšãŒïŒïŒAssociateãExïŒã€ãŒãšãã¯ã¹ïŒïŒExpert æ°åããã£ãªã¢ãæµ
ãæ¹ã¯A1ããå§ãŸã£ãŠãã°ã¬ãŒããäžãã£ãŠããã°è¡ãã»ã©ããµãŒãã¹ãäŒç€Ÿã«å¯Ÿãã圱é¿ç¯å²ã¯åºããæªæ¥ãèŠæ®ãã課é¡è§£æ±ºã課é¡èšå®åã«å¯ŸããæåŸ
ãèšå®ãããŸãã ã°ã¬ãŒãã«å¯ŸããŠã¯å ±é
¬ã®äžéé¡ãèšå®ãããŠããŸããäžèšäŸã«æãã700äžåã®ã©ã€ã³ã¯Ex2ã®äžéå€ã«èšå®ãããŠããŸãã ãŸããçããã«èŠªãã¿ããã圹å²åãšããŠã¯ãªãŒãè·ããããŸãããçŸåšãåœç€Ÿã§ã¯ããã¯ãªãŒããšåŒã°ãã圹å²ã®äººãããŸãã圌ãã¯Ex3ã®æ ã«è©²åœããŸããåœç€Ÿã§ã¯ããã«ããã¯ãªãŒã of ããã¯ãªãŒããšããŠã®ããªã³ã·ãã«ããã¯ãªãŒããèšå®ãããŠããããããæäžäœã®Ex4ã«äœçœ®ã¥ããããŸããå®å
šã«BASEã®æªæ¥ãäœãæåŸ
ã«å¯ŸããŠèšå®ãã圹å²ã§ãã åã°ã¬ãŒãã«å¯Ÿããå ±é
¬ã®äžéé¡ã¯èšå®ãããŠããŸãããã°ã¬ãŒãããŸããã éé¡ã®è¢«ãã¯ååšããŠããŸãã ããã¯äžéæ¡çšã«ãããŠãå®çžŸã®ããæ¹ã¯ãã¡ãããæåŸ
å€èŸŒã¿ã§è¥ããŠãé«ã絊äžã§æ¡çšããããšãæ³å®ããå
¥ç€ŸåŸã«åœç€Ÿã®ãµãŒãã¹ã®çµéšãç©ãã§ããã ãäžã§ãé©åãªã°ã¬ãŒãã«åãããã«ãããžã¡ã³ãããŠããããã®é«ééè·¯ã®åæµè»ç·çãªãããã¡ãšããŠååšããŠããŸãããã®èŸºãããŸãå³å¯ã«ãããããšæ¡çšæŽ»åã«åœ±é¿ãåºãŠããŸãã®ã§æè»æ§ãããããŠããŸãã ãšããããå眮ããæžããŸããããæœè±¡çã«ã¯ä»¥äžã®ããã«ã°ã¬ãŒãã«å¯ŸããæåŸ
ãèšå®ãããŠããŸãã A1 ïŒæ°å
¥ç€Ÿå¡ãçµéšã®æµ
ã瀟å¡ïŒ æç€º/æå°ãåããªããæ¥åãéè¡ãã èªãã®æ¥åé åã«ã€ããŠãæ¥åæ¹åã課é¡è§£æ±ºã®ææ¡ããã A2 ç¹å®é åã«ãããŠèªç«ããæ¥åéè¡ããã æå±ããŒã ã®æ¥åã«ã€ããŠãæ¥åæ¹åã課é¡è§£æ±ºã®ææ¡ããã³å®è¡ãã Ex1 ç¹å®é åã«ãããŠã æå±ããŒã ããªãŒã ããæ°Žæºã®äºæ¥ææãçã Ex2 ç¹å®é åã«ãããŠãæå±ããŒã ããªãŒã ããæ°Žæºã®äºæ¥ææãçã æå±Divisionå
šäœã®èª²é¡è§£æ±º ã«åœ±é¿åãæã€ åè·çš®ã«ããã瀟å
æ¯èŒã§ é«ãå°éæ§ã課é¡è§£æ±ºèœå ãæãã Ex3 ïŒããã¯ãªãŒããªã©ã®ãªãŒãè·çžåœïŒ å
šç€ŸããªãŒã ããæ°Žæºã®äºæ¥ææãçã å
šç€Ÿã®å°æ¥çãªèª²é¡ ã解決ããäºæ¥ææãçã åæ¥çš®ã«ããã å
šç€Ÿãããã¬ãã«ã®é«ãå°éæ§ã課é¡è§£æ±ºèœå ãæãã Ex4ïŒããªã³ã·ãã«ããã¯ãªãŒããªã©ïŒ å
šç€ŸããªãŒãããæ°Žæºã®äºæ¥ææãçã å
šç€Ÿã®å°æ¥çãªèª²é¡ã解決ããäºæ¥ææãçã å
šç€Ÿã®èª²é¡è§£æ±ºã«åœ±é¿å ãæã€ åæ¥çš®ã«ããã æ¥çãããã¬ãã«ã®é«ãå°éæ§ã課é¡è§£æ±ºèœå ãæãã Webç³»ãšã³ãžãã¢ã®å
·äœäŸ 以äžã¯ãåã°ã¬ãŒããWebç³»ãšã³ãžãã¢ã«æ¯èŒçå
·äœäŸãšããŠå²ãåœãŠããã®ã«ãªããŸãããã¹ãŠãæºãããªããŠã¯ã°ã¬ãŒããäžãããªããšããããã§ã¯ãããŸããããã®äººã®åæ§ãšæåŸ
ãã圹å²ã«ããããŠè©äŸ¡ããŸãããã°ã¬ãŒããäžããã°äžããã»ã©ã æªæ¥ãã€ããããšãžã®ããžã§ã³ããããã¯ãã¯ãªãªãã£ã®å®çŸãäžç¢ºå®æ§ãžã®ãã£ã¬ã³ãžãæ±ãã ããšã«ãªããšããéšåã¯ãå
±éããŠæåŸ
ããããšã«ãªããŸãã A1 ïŒæ°å
¥ç€Ÿå¡ãçµéšã®æµ
ã瀟å¡ïŒ éåžžãããžã§ã¯ãã®éçºã¡ã³ããŒãšããŠåå ããéçºããã¹ããä»»ããããšãã§ãã æ¯èŒçå¹³æãªé£æåºŠã®ã客æ§ã®ãåãåãããäžå
·å察å¿ã®è§£æ±ºãä»»ããããšãã§ãã åšå²ã®å©èšãåããªãããæã
ã®åé¡ã解決ã§ãã A2 éåžžãããžã§ã¯ãã®éçºè
ãšããŠåå ããäžäººã§ãéçºããã¹ãããªãªãŒã¹ãä»»ããããšãã§ãã ã客æ§åãåãããäžå
·åã«ã€ããŠã解決ãä»»ããããšãã§ãã æ¬çªéçšã®å®å®æ§å®çŸã®ããã®é害察å¿ãé«è² è·å¯Ÿå¿ã®ãªãã¬ãŒã·ã§ã³ã«åå ã§ãã Ex1 éåžžãããžã§ã¯ãã®æè¡è²¬ä»»è
ãšããŠã¡ã³ããŒããªãŒãããããšãã§ãã ïŒæè¡è²¬ä»»è
ãšã¯äž»ã«ãããžã§ã¯ãã®èšèšã¬ãã¥ãŒãäž»å°ããäººïŒ åœç€Ÿã«ãŠæ±ããããŠãããœãŒã¹ã³ãŒãããããã¯ãçã®å質åäžãèªãå®çŸããã¡ã³ããŒã«åºããããšãã§ãã æ¬çªéçšã®å®å®æ§å®çŸã®ãããé害察å¿ãé«è² è·åé¡çãçå
ããŠçºèŠã察å¿ã解決ã«å°ãã çµéšã®å°ãªãã¡ã³ããŒã«å¯Ÿããæè¡æå°ãæ¥åžžçã«ä»»ãããã WebãµãŒãã¹ãéå¶ãããšã³ãžãã¢ãšããŠPJãšæ¥åžžçãªæ¹åã䞊è¡ããŠè¡ãããã«ãé©åãªæ®µåããã¹ããŒããã¯ãªãªãã£ãå®çŸã§ãã Ex2 é£æåºŠã®é«ãæè¡èª²é¡ããããžã§ã¯ãïŒæ±ºæžã®è¿œå ãååãªãã·ã§ã³æ©èœãæœéžè²©å£²ãªã©ïŒã®éçºã®èšèšãæ¹åã«ã€ããŠãèŠç©ãããã¹ã±ãžã¥ãŒã«éãã®å®çŸãä»»ããããšãã§ãã æè¡çè² åµã®è¿æžãèªãå
å°ãã解決ããããšãã§ãã çŸç¶ã®ãœãŒã¹ã³ãŒãããããã¯ãã«ã€ããŠãããŒã ã§ã®å質åäžãçå
ããŠãªãŒãã§ãã åžžã«çšŒåããŠãããµãŒãã¹ã«ç®ãåããŠãæè¡çãªåé¡ã解決ãç¶ãã èªåãã¹ãããããã€æ¹åçãéããŠããããã€åŸã®åé¡çºèŠãéçšäžã®ãµãŒãã¹æ¹åããªãŒãã§ãã äžã€ã®æè¡ã«äŸåãããèªåãé¢ããäºæ¥é åã§æ±ããããæè¡ãžã®é©å¿åããããéçºèšèªãããã³ããšã³ãããµãŒããµã€ããã€ã³ãã©ãªã©ã®æè¡æŠå¿µã«åããããè¿æ¥é åã®æè¡ãåŠã³ç¶ããŠåé¡è§£æ±ºã«è²¢ç®ã§ãã ã·ã¹ãã æ¹åãå¿
èŠã«ãªãé£æåºŠã®é«ãé害察å¿ãçå
ããŠãªãŒããã¯ããŒãºã«å°ãã Ex3 ïŒããã¯ãªãŒããªã©ã®ãªãŒãè·çžåœïŒ é£æåºŠã®é«ãPJãå®çŸããããã«ã¢ãŒããã¯ãã£èšèšãäœæ¥æ®µåããèŠç©ãããè¡ããã¡ã³ããŒãåŒã£åŒµãããšã§ã¹ã±ãžã¥ãŒã«ãšå質ãå®çŸãã èšç»ã®æç¡ã«é¢ããããçæçãäžæçãªäºæ¥æé·ãèŠæ®ããªãããçŸç¶ã®ãµãŒãã¹ãæè¡ã®åé¡ã«ç®ãåããŠãæ¹åææ¡ããã³æ¹å宿œãã§ãã æè¡ææ¡ããµãŒãã¹ã®åé¡æèµ·ãç ç©¶çãåžžã«è¡ã£ãŠãã èªåã«ãšã£ãŠæªç¥ã®æè¡ãçŸç¶ã«ãã£ããããããã«åãå
¥ãããµãŒãã¹ã®æé·ãå®çŸããããšãã§ãã åè³ªãæ©èœãã¹ã±ãŒã©ããªãã£ãã»ãã¥ãªãã£çãæ¹åããæè¡ç課é¡ãæèµ·ããã¡ã³ããŒãã¢ãã©ã¯ãããªããæ¹åããªãŒãã§ãã Ex4 ïŒããªã³ã·ãã«ããã¯ãªãŒããªã©ïŒ äŒç€Ÿã®äžæç®æšãæè¡ã§å®çŸããããã®æè¡æ¹éãçµç¹æ¹éã®ç«æ¡ããã³éè¡ãã§ãã éçºçµç¹ã«èµ·ããåé¡ç¹ãçºèŠããæè¡åã®åºäžãã«å¯Ÿããææ¬çãªæœçãçç£æ§ã®æ¹åãä»»ããããšãã§ãã ã»ãã¥ãªãã£ãããžãã¹ãã¹ã±ãŒã©ããªãã£çã®ãªã¹ã¯ã«ç®ãåãç¶ããæ¹åææ¡ãè¡ããçµç¹èšç»ãéçºèšç»ã«çµã³ã€ãã ä»åŸã圹å²ã«å¯Ÿããè©æžããé顿§æããããã©ã€ã³ã®çµŠäžã®äžéé¡ãªã©ã¯å€ããŠãããããšæã£ãŠããŸããWebãµãŒãã¹ãæ¯ãããšã³ãžãã¢ã¯äžäººäžäººã®äž»äœçãªæŽ»èºããã¹ãŠã§ããéã»åŽåéçŽçãªåœ¹å²ã®åãæ¹ã«å¯Ÿããå¶åºŠãšããŠãããã§æ±ºããå¶åºŠãä»åŸãåºå®çã§ããããã§ã¯ãªããæµåçã«èŠçŽããŠãããããã«æ¥çžŸãäžããŠãããããšæã£ãŠããŸãã ããããEx3ãEx4ã®ã°ã¬ãŒãã®äººãã¡ã掻èºãããµãŒãã¹ã¯ãªãªãã£ãæ¥çžŸãžã®å¯äžãè¡ã絊äžã®ãããã©ã€ã³ãåäžãããããšããå
šãšã³ãžãã¢ã®ã¹ãã«ã瀟äŒçè©äŸ¡ãçµŠäžæ°Žæºã®åºäžãã«ãã€ãªãããšèããŠããŸãããããããããããçµç¹æ§é ãåžžã«æš¡çŽ¢ããŠãããããšæã£ãŠããŸãã ãšã³ãžãã¢ãªã³ã°ãããŒãžã£ã®ã°ã¬ãŒãèšå®ã«ã€ã㊠ãšã³ãžãã¢ãªã³ã°ãããŒãžã£ã«ãè©äŸ¡ã°ã¬ãŒãã®åºæºãèšå®ãããŠããŸããããã ãããã€ã³ãã ãæç²ããŸããšã以äžã®ç¹åŸŽããããŸãã ã»æ¡çšåè£è
ã®é©åãªçµŠäžææ¡ãã§ãã ã»æ°èŠããžãã¹çã®éã«éãåºãããããŒãžã£ããªãŒãåè£ã®è²æãã§ãã ã» çµç¹æ¡å€§ãåå²ãåæãšãããããŒãžã£ã®è²æãã§ãã ã€ãŸãã人ãè²ãŠãŠãããæ°èŠäºæ¥ãçµç¹å€æŽã«äŒŽã£ãŠãäžçªã§ããéšäžãéãåºãããšãåæãšãããããžã¡ã³ããããŠãã ãããšããããšã§ããå®å®ããèªåã®åãäœãã®ã§ã¯ãªããåžžã«äžç¢ºå®ã§ããåæã§äŒç€Ÿå
šäœãæé·ããããã«æ¡çšãšããŒã ãäœãããšã«å°å¿µããŠãã ããã ãããŒãžã£ã¯æ°ãã«äººãæ¡çšããæé·ããããã¥ãŒã¹ããŠãæ°ãã«éãåºãããšã§BASEãšãããµãŒãã¹ã®ãã¡ã€ã³ç¥èãå²åŠãå
Œãåãã人æããæ°èŠäºæ¥ãæ°ããçµç¹ã®ãããŒãžã£ãšããŠæ°ããæŽ»èºããããšããã«ãŒããæããŠãããããšæã£ãŠããŸããç¹ã«æ°äººãããŒãžã£ã¯ãæ¢åã¡ã³ããŒã®ããå
貎ãããŒã ãªãŒããŒãšããŠã¯ç©ã¿äžããçµéšã䜿ããã®ã§ãããæ¡çšãšãªããšçµéšã®ãªãæ°ããåãçµã¿ã«ãªãã®ã§ãæéã®äœ¿ãæ¹ãšããŠäž»äœçã«åããããã«ãªãã«ã¯æéãããããŸããæ¡çšã«å¯ŸããŠãèªåäºãã€äž»äœçã«åããããã«ãªã£ãŠåããŠãããŒãžã£ãšããŠäžäººåãšã¿ãªãããŸããããã¯ãŸãå
šäœèŠç¹ã§äºæ¥ãæããããããã«ãªããæªæ¥ãèŠæ®ããããã«ãªã£ããšããæå³ã§ããããŸãã ãããŠãããå€§äŒæ¥ã®æ°èŠäºæ¥ã§èšãããããšãšããŠããšãŒã¹ã¯æž©åãããããã§ãªã人æãæ°èŠäºæ¥ã«ããŠãããããšãã話ããããŸããããã¯ããã§å€§äŒæ¥ã«ãããŠè¥æããã£ã³ã¹ãåŸããšããæ§å³ã«ãªã£ãŠãããšæããŸãããåœç€Ÿã®ããã«å¹Žååºåã§ã¯ãªãè¥æãã¬ã³ã¬ã³éçšããŠããããçµç¹ã«ãããŠã¯ããªããªãäžçªã§ãã人ãæããŠããŸãããšãåæãšãããããžã¡ã³ããæ±ããŠããŸãã äŸãã°åäŒç€Ÿã®BASE BANKç€Ÿãæ¯ãããããã¯ããããŒãžã£ãšããã¯ãªãŒãã¯ãå
ã
ãBASEã®æ±ºæžããŒã ã®ã©çãäžãæ¯ããŠããè¥æã¡ã³ããŒã§ãããæ°èŠäºæ¥ã«æãäžããŠãããŠã圌ãã¯ä»ãBASE BANKããŒã ã§ãããããšä»äºãããŠããŸãããããã§ã®ãã£ã¬ã³ãžããŸãBASEã®ããŒã ã«ãã£ãŒãããã¯ããŠããããããšæã£ãŠããŸãããããã£ãããšã®åçŸãä»åŸããã£ãŠãããããšæã£ãŠããŸãã çŸç¶ã®ãšã³ãžãã¢çµç¹ã®èª²é¡ çŸç¶ãWebæè¡ã«é¢ããŠã¯ãCTOãšããªã³ã·ãã«ããã¯ãªãŒãã®2ãããããµãŒãã¹ã®æå
端ã®é²åããªãŒãããŠããŸããããããå¢ãããGMVãæ¯ããªãããæ©èœæ§åäžããããã¯ãå質ã®åäžçãè¡ã£ãŠããã«ã¯ãšãŠããšãŠãæãè¶³ããŸããã ãã¡ãã®èšäº ã«ããéããæ¥å¹Žä»¥éãCakePHP2.xããªãããŠããããšããµãŒãã¹ãç¶æãæé·ãããªããè¡ããšããé£ãããããžã§ã¯ãã«ãæã¿ããã§ããããããDDDçã®ããŠããŠã掻çšããŠåèšèšãããããšã«ãªããšæããŸãããããããæ¯ããŠããååéã®ãšãã¹ããŒãã§ããããã¯ãªãŒãåè£ããã€ã¹ãã«ãšã³ãžãã¢å±€ãçµç¹ã®äœãæã§ãããšã³ãžãã¢ãªã³ã°ãããŒãžã£åè£ãåéããŠããããšã«ãªããŸãã äžã®ã°ã¬ãŒã衚çŸã§èšããšããšã³ãžãã¢çµç¹ããªãŒãã§ããEx2以äžã®äººãã¡ãå¢ãããªãããè¥æã®æææ ªã§ããEx1åè£ãæ¡çšããŠãçµç¹ãšããŠã¹ã±ãŒã«ãããŠããããã§ãããã®ããã«ããããšããããæ¹çãåã£ãŠã瀟å
ã®ãšã³ãžãã¢ã®ã¹ãã«åäžã¯ãã¡ããã®ããšãæ¡çšãæšé²ããŠãããããšèããŠããŸãã ãããBASEã®æªæ¥ãäœãããšã«èå³ãæã£ãŠããã ããæ¹ãããã£ããã£ããæ¯éã話ããŸãããããšã³ãžãã¢ãšããŠã®æé·ããã£ã¬ã³ãžã§ããç°å¢ãçšæããããšæã£ãŠããŸããã人ææè³ãã§ããç°å¢ã¯æŽã£ãŠããŸãã®ã§ãäžç·ã«ä»äºãããŸãããïŒ binc.jp
ServiceDevæå±ããµãŒããµã€ããšã³ãžãã¢ã®æ ç°ã§ãã çŸåšç§ã¯ãServiceDevã®ããŒã ã«æå±ãããããã·ã§ããäœæãµãŒãã¹ãBASEãåã³ã·ã§ããã³ã°ã¢ããªãBASEãã®æ©èœéçºãæ
åœããŠããŸãã BASEã§ã¯äž»ã«Qæ¯ã«ãããžã§ã¯ãããŒã ãç·šæããããŒã ã§äž»äœãšãªã£ãŠæ©èœéçºãè¡ã£ãŠãããŸãã ããŒã ã¡ã³ããŒæ§æã¯ãããžã§ã¯ãã®ç¹æ§ãèŠæš¡ã«ããæ§ã
ã§ãããå€ãã®å Žåãåãã°ã«ãŒããã1ã2åããããžã§ã¯ãã«ã¢ãµã€ã³ãããŸãã ä»åã¯ãšããé·æéãããžã§ã¯ãã§æããäºãã»å®éã«ãã®ããã«é²ããããšãããšããããµãŒããµã€ããšã³ãžãã¢ã®èŠç¹ãã玹ä»ããããšæããŸãã ã©ããªãããžã§ã¯ãã ã£ãã ä»å玹ä»ãããããžã§ã¯ãã¯ãBASEãã®æ¡åŒµæ©èœã§ãããBASE Appsãã®1ã€ã§ãããååãªãã·ã§ã³ Appããéçºãããããžã§ã¯ãã§ããã ãååãªãã·ã§ã³ Appãã¯ååã«ã®ããã©ããã³ã°ããªãŒããŒã¡ã€ãã§äœ¿ãããªãã·ã§ã³ãèšå®ã§ããæ¡åŒµæ©èœã§ãã詳现ã¯äžèšããã芧ããã ããã°ãšæããŸãã baseu.jp ãããžã§ã¯ãã¡ã³ããŒæ§æ ãããžã§ã¯ããããŒãžã£(PM) & ãã£ã¬ã¯ã¿ãŒ 1人 ããã³ããšã³ããšã³ãžã㢠1人 ãµãŒããµã€ããšã³ãžã㢠3人 (éå§ 1人, æçµçã«3人) ãã€ãã£ãã¢ããªãšã³ãžã㢠2人 ãã¶ã€ã㌠1人 ããã¯ãªããããªãªãŒã¹ãŸã§ã®æé 10ã¶æãããã»ã© ç§ã®ç«ã¡äœçœ® ãµãŒããµã€ããšã³ãžãã¢ã®ãŸãšã圹çãªç«ã¡äœçœ®ã§ããã åãã¯ãµãŒããµã€ããšã³ãžãã¢ã¯1人ã§ããããæçµçã«3人ã«å¢å¡ã ç§ã¯éçºãã£ã¬ã¯ã·ã§ã³ãããã€ã€ãä»ã®ã¡ã³ããŒãšå
±ã«éçºãããŠãããŸããã ãšã³ãžãã¢ãªã³ã°ãããŒãžã£(EM)ããç§ãžæåŸ
ãããŠããäºã¯ ããšã«ããäžç¢ºå®æ§ãäžããŠããããžã§ã¯ããã³ã³ãããŒã«ã§ããç¶æ
ã«ããŠæ¬²ãããã§ããã å
·äœçã«ã¯ æ¥ã
ã®éçºã®é²æãææ¡ããŠããããžã§ã¯ãã¡ã³ããŒãEMã«å
±æããããš äžç¢ºå®ãªé åãã©ãã©ãè§Šã£ãŠããæ³å®å€ãªããšãå°ãªãããŠããããš äžå®èŠçŽ ãåãé€ããããéšåçãªæ¬çªåãããŠããããŸãåãã§ãŒãºã®ãªãªãŒã¹ã®èšç»ã建ãŠãããš ãªãªãŒã¹ã«åããçŸå®çãªé²æãææ¡ããŠãEMãšäººå¡èšç»ã®çžè«ãããããš ãªã©ãè¡ããªãããããžã§ã¯ããé²ããŠãããŸããã ã©ããªç¹è²ã®ãããããžã§ã¯ãã ã£ãã ååãªãã·ã§ã³ã¯ãç¡æã»ææã®ååãªãã·ã§ã³ãååã«è€æ°åçŽä»ãããããšãã仿§ã§ãä»ãŸã§ãBASEãã§ã¯æ³šæã®äŸ¡æ Œã®æŒç®ã®æŠå¿µãå¢ãããšããäºäŸã¯ã»ãŒãªããæ³šæã®äŸ¡æ Œã¯ããããç®æã«åœ±é¿ããã®ã§ããµãŒããµã€ããšã³ãžãã¢ã®ç§ãããããšãã·ã¹ãã ã®å
šäœã«é¢ããããªãã®å·¥æ°ããããããã ãªïŒã©ããããããªïŒããšããã®ããããžã§ã¯ããå§ãŸã£ãåœåã«æã£ãŠããäºã§ããã å®éã«åœ±é¿ããã£ãã¢ããªã±ãŒã·ã§ã³ã¯ç€Ÿå
çšã®ç®¡çç»é¢ããããåŠçãªã©ãå«ããŠ9ã€ã»ã©ãããŸããã ãªãªãŒã¹ã«ã€ããŠã¯è€æ°ã®ãã§ãŒãºãããäºãåœåããããã£ãŠãã ãã¶ã€ã³ããŒãåã(ãããã·ã§ããäœæãµãŒãã¹ãBASEãã®ãã¶ã€ã³ããŒããäœæããŠããã ããŠãããã£ãããããŒåã) ã·ã§ããã³ã°ã¢ããªãBASEãåã ãããã·ã§ããäœæãµãŒãã¹ãBASEãåã ã®3ã€ã®ãã§ãŒãºãããäºãèŠããŠãããŸããã ããããã«ã¯ãªãã£ã«ã«ãã¹ãååšããã®ã§ãã¿ã¹ã¯ã®ããã«ããã¯ãçºçããªãããã«ãããžã§ã¯ããé²ããå¿
èŠããããŸããã3ã€ã®ãã§ãŒãºã®é²è¡ã«ã€ããŠã¯ ãããžã§ã¯ãå
ã§é±æ¬¡ã§å®äŸMTGãè¡ããPMãäžå¿ã«ãªã£ãŠé²æç¢ºèªãããŸãã«è¡ãé²ããŠãããŸããã èŠç©ããã»èšèšãã§ãŒãºã«ã€ã㊠以åãããã®æ©èœããªãªãŒã¹ããããšããæ³ãã¯ç€Ÿå
ã«ãããèŠä»¶ã¯ããçšåºŠåºãŸã£ãŠããŸããã ã®ã§èŠä»¶å®çŸ©ãã§ãŒãºã¯ããŸããªããèŠç©ããã»èšèšãå§ãŸããŸããã 仿ãã°ãç§ã¯ãããžã§ã¯ãéå§åœåãå
¥ç€ŸããŠ1幎ãçµã£ãŠããªãã£ãã®ã§ ãµãŒããŒãµã€ãã®ã·ã¹ãã ã®å
šäœåã¯æ£çŽããããªãæããããŸãããããšãããããã£ãŠã¿ãäºã«ããŸããã èŠç©ããã®å©ããäœæããã®ã§ãããèŠæš¡ã倧ãããæªããç®æãå€ãã®ã§èªå1人ã§é²ããã®ã¯å±éºã ãšå€æããŠãEMã«çžè«ããŠ1人ã®ã·ãã¢ãšã³ãžãã¢ã«èŠç©ããã»èšèšã®ãµããŒã圹ãšããŠã¢ãµã€ã³ããŠãããããšã«ãªããŸããã ãããŠãèŠç©ããã»èšèšãããçšåºŠé²ãã æã§ããŒã ã¬ãã¥ãŒã»CTOã¬ãã¥ãŒãžã®æµãã«ãªããŸããã èšèšã¬ãã¥ãŒã«ã€ããŠã¯ãåãããŒã ã®å®®æãèšèŒããèšäºããããŸãã®ã§ããã¡ããã芧ããã ããã°ãšæ³ããŸãã devblog.thebase.in äœè«ã§ããã·ãã¢ãšã³ãžãã¢ã¯äºå®ããŠããè²äŒã®ã¿ã€ãã³ã°ãšè¢«ã£ãŠããŸããå®è£
ã«ã¯äžåé¢ãããªãããšãšãªããŸããããã³ãïŒïœ éçºåæãã§ãŒãºã«ã€ã㊠åæã¯1人ã§é²ããŠããŸããããå°ãªãèŠç©ãã£ãŠã6ã¶æä»¥äžããããããšèŠããŠããã1人ã§ããã®ã¯é£ãããšEMãšå
±æèªèããã£ãã®ã§ãEMã«2人ç®ã®ãšã³ãžãã¢ãã¢ãµã€ã³ããŠãããããã«åããŠããããŸããã (BASEã§ã¯ã以åã¯ãããžã§ã¯ãã«ãµãŒããµã€ããšã³ãžãã¢ã1人ã§ã¢ãµã€ã³ãããäºããã£ãã®ã§ãããæè¿ã¯ãµãŒãã¹ã®æé·ããããã·ã¹ãã ãè€éåããŠãã£ãŠãã®ã§ã2人以äžã®ã¢ãµã€ã³ã«ãªãããšãå€ãã§ã) 2人ç®ã®ãšã³ãžãã¢ã®ã¢ãµã€ã³ã確ä¿ã§ããæã¯ãããçšåºŠãããžã§ã¯ããé²ãã§ããã®ã§ããªãªãŒã¹ã¿ãŒã²ããæã決ããå¿
èŠããããŸãããç¹ã«ã©ã®Qã«åããã®ãã©ããã¯ãBASEã®éçºçµç¹ãšããŠå€§ããªé¢å¿äºã§ããã èŠç©ããã¯çµãã£ãŠããã®ã§ãã¿ã¹ã¯äžèŠ§è¡šã¯ã§ããŠããŸãããæ£çŽã粟床ãæãæŒãããããã©ããäžå®ã ã£ãã®ã§ãæ°ããã¢ãµã€ã³ããããšã³ãžãã¢ãš2äººã§æéããããŠå
šé確èªããäºã«ããŸããã é·æãªãããžã§ã¯ãã ã£ãã®ã§ãããã§2人ã®ç®ç·ãåãããäºãåŸã
ã«é¿ããŠãã£ãŠãšãŠã倧åã ã£ããšæããŸããã éçºãã§ãŒãºã«æããäºãã»å®éã«ãã®ããã«é²ããããš ä»ã®ããŒã ãåããããããã«ãããŒã¿ã®çæã®æµãã«æ²¿ã£ãŠéçºãé²ããäºãå¹ççã ã£ãã äžé£ã®æµãã§éçºã§ããæ¹ãéçºã®é²æã宿ã§ãããããã³ããšã³ãã»ãã€ãã£ãã¢ããªã®éçºããããããªããŸãã å
šéšãªãã¡ã¯ã¿ããèš³ã«ã¯ãããªãã®ã§ãéšåçã«æ¹ä¿®ããŠå
ã«æ¹ä¿®ãšãã¹ãã ããããã€ããã å¬ããæ²é³Žã§ä»ã®ãããžã§ã¯ãããªãã¡ã¯ã¿ãšConflictããäºããã£ããéã«æŽã«çºçããªãããã«ç©æ¥µçã«æ¬çªåããã ãµãŒããµã€ããšã³ãžãã¢ããŒã ã§æ¥æã§çžè«äŒãMTGãããŠçžè«ããããç°å¢ãäœã£ãã ãããžã§ã¯ãéäžã§ã³ããæéãžå
¥ã£ãã®ã§ããé »åºŠã®é«ãã³ãã¥ãã±ãŒã·ã§ã³ãåãããã«ããã å¿
èŠã«å¿ããŠãªã¢ãŒãã§ã¯ãªãäŒç€Ÿã«éãŸã£ãã ãªãªãŒã¹ã¿ãŒã²ããã«éçºãåããäºãé£ãããšããã£ãã®ã§ãã©ã¹ã3ã¶æã¯EMãšé£æºããŠ3人ç®ã®ãµãŒããµã€ããšã³ãžãã¢ãã¢ãµã€ã³ããŠããã£ãã â» åæïŒBASEã§ã¯äžŠè¡ããŠè²ã
ãªãããžã§ã¯ããèµ°ã£ãŠããŠããããè² åµãæ®ã£ãŠããã³ãŒããååšããŸãã QAãã¹ãã»ãªãªãŒã¹ãã§ãŒãºã«æããäºãã»å®éã«ãã®ããã«é²ããããš å質ãä¿ãŠããã®ãããæ¢åã®äžå
·åãã§ãªãããã«ã¬ã³ã¬ã³ãããã€ããŠãã£ã å
šéšã§9ã€ã¢ããªã±ãŒã·ã§ã³ãã£ããã³ã¢ãšãªãã«ãŒããæ±ºæžã®åŠçãé€ããŠãã»ãŒå
åºãã§ãªãªãŒã¹åã«æ¬çªåããäºã«æåãã ãªãªãŒã¹ã«ãã£ãŠããŒã¿ãç Žå£çã«ãªããªãããã«ããŠããã€ã§ããªããŒãã§ãããããªèšç»ããã QAãã¹ã3ã€ã®ãã§ãŒãºããã£ãã®ã§ãããããã§å¿
èŠãªæå°éãäœæããŠQAãã¹ããé²ããŠãã£ã QAãã¹ãã§å¿
èŠãªããŒã¿äžåŒãPMãçšæããŠãããçºãéçºã§ãã¿ãã¿ããŠããããå¹çã«é²ããäºãã§ãã 3ã€ã®ãã§ãŒãºã«åãããŠããã®ã§ã段éçã«å質ãäžãã£ãŠãããäžå
·åããã£ãå Žåã§ãæ©æé®ç«ãããäºãã§ãã CTOãšã®æ¬çªåã«ã€ããŠã®äº€æžããã BASEã§ã¯æ§ã
ãªäºæ
ããããã¹ããŒãžã³ã°ç°å¢ã§è€æ°æ¥æ€èšŒããäºãèš±å¯ããŠãããŸãã ä»åã¯ãªãªãŒã¹ã®èŠæš¡ãšå€©ç§€ã«ãããŠç¹äŸãããã ããè€æ°æ¥æ€èšŒãããäºã«ãã£ãŠå®å
šãªãªãªãŒã¹ãå¯èœã«ãã ãªã¹ã¯ã忣ãããçºã«åãã§ãŒãºã®æ©èœã®æ¬çªãããã€ã®æ¥ãšãŠãŒã¶ãŒå
¬éæ¥ãåãã ãŸãšã ä»å10ã¶æãšé·ãã¹ãã³ã§ããããäžèšã§ãäŒããããããªäºãèããªããããŒã éçºãããŠãããŸããã BASEã«ãããé·æãããžã§ã¯ãã®ããŒã éçºã®é°å²æ°ã¯äŒãããŸããã§ããããïŒ æåŸã«é·æéãããžã§ã¯ããšãªãèŸãæããããŸããã ãã®æ©èœããªãªãŒã¹ããŠãå€ãã®ã·ã§ãããªãŒããŒãããã声ãããã ããç¡äºã«æ©èœãå±ããäºãã§ããŠæ¬åœã«è¯ãã£ããšæããŸããã
ã¯ãããŸããŠã BASEæ ªåŒäŒç€Ÿ SRE Groupã«æå±ããŠããå¯å¡( @tomy103rider )ã§ãã å
æ¥ãåŒç€ŸCTOã ããããã°ãåããªããã¢ã¯ã»ã¹ãæ¿å¢ããECãã©ãããã©ãŒã ã«ãããè² è·å¯Ÿç https://devblog.thebase.in/entry/bsucon ãšããèšäºãå
¬éããŸããã 瀟å
ã§ã¯ãã®ã¢ã¯ã»ã¹æ¿å¢ããã£ããã«ããµãŒãã¹ã®ç£èŠãã©ãããŠããããããµãŒãã¹/ã·ã¹ãã ã®ã¢ã©ãŒãã«å¯ŸããŠã®ã¢ã¯ã·ã§ã³ã¯ã©ãããã¹ããããšãã£ããããªç£èŠã«é¢ãã話é¡ãæ¹ããŠçãäžãã£ãŠããŸãã ãããªäžã§ãµãš1幎ãããåã«BASE BANK æ ªåŒäŒç€Ÿã®æ±å£ ( @hgsgtk )ã瀟å
ã§äž»å¬ãããå
¥é ç£èŠã茪èªäŒã«åå ããããšãæãåºãããã®èŒªèªäŒãã©ãããäŒã ã£ãããªã©ãæ¹ããŠèŒªèªäŒãæ¯ãè¿ã£ãŠã¿ãããšæããŸãã ãå
¥é ç£èŠã茪èªäŒã®ç®çã¯äœã ã£ãïŒ ãã®èŒªèªäŒãéå¬ããã«ããã£ãŠäž»å¬è
ããã£ãããšæ®ããŠãã瀟å
ããã¥ã¡ã³ãããããããã«ã¯ä»¥äžã®3ã€ã®ç®çãæžãããŠããŸããã - ãªãŒããŒãºã«å®å®çãªãµãŒãã¹ãæäŸããã - ã€ã³ãã©ç£èŠãçè§£ããçŽ å°ã圢æããŠé¢å¿ã匷ãã - ã¢ããªã±ãŒã·ã§ã³ç£èŠã®çŽ å°ã圢æããŠé¢å¿ã匷ãã ããªãŒããŒãºã®ã¿ãªããã«å®å®çãªãµãŒãã¹ãæäŸãããããšãã匷ãæããæã¡ãSRE Groupãäž»ã«å¯Ÿå¿ããã¡ãªç£èŠãšããåéã«ãããããããã¯ãšã³ããšã³ãžãã¢ãé¢å¿ãæã€æ©äŒã«ãããã£ããšããããšãæããããŠããŸããã ã©ããã圢åŒã®èŒªèªäŒã ã£ãïŒ é±ã«1åã1æéãåå ã¯èªç±ïŒæ¥ååªå
ïŒãåå è
ã¯éçºã¡ã³ããŒãSREã¡ã³ããŒããããŒãžã£ãŒããµãã£ãšåå ããããšããããããšããé°å²æ°ã®äŒã§ããã æ¥æ æ¯é±æšææ¥ 15:00ã16:00 é²ãæ¹ å
š12ç« (ä»é²å«ã)ãååã§2ç« ããããããããèªã ã¿ã€ã ã¹ã±ãžã¥ãŒã« 30åïŒåœæ¥ã®å¯Ÿè±¡ç« ãèªã¿ãæ°ã¥ãã»çåãå
±æããã¥ã¡ã³ãã«æžãçãã 25åïŒ æžãçããæ°ã¥ãã»çåãå
±æã»è°è« 5åïŒãŸãšãã»æ¬¡å察象ã®ç« ãæ±ºããŠè§£æ£ æžç± ãO'Reilly å
¥é ç£èŠ ââã¢ãã³ãªã¢ãã¿ãªã³ã°ã®ããã®ãã¶ã€ã³ãã¿ãŒã³ã( https://www.oreilly.co.jp/books/9784873118642/ ) www.oreilly.co.jp â»åœæã®å®éã®æ§å(ãããªããšããããããšæ®ã£ãŠãããåç) ããããèªãã§ããæéã¯äž»å¬è
ãå¿å°ãã鳿¥œãæµããŠãããŠããŸãããããããé°å²æ°ãç°å¢äœããå
宿ã«ç¹ãã倧äºãªãã€ã³ããªã®ã ãªãšæããã®ãèŠããŠããŸãã 茪èªäŒãã1幎以äžãçµéããŠã»ã»ã» ããŠããããŸã§ã¯èŒªèªäŒã®æ§åããäŒãããŸããããã茪èªäŒã«åå ããŠãã人ãã¡ããã®åŸäœãç£èŠã«å¯Ÿããæ°æã¡ãè¡åã«å€åããã£ããããšããç¹ãäžçªç¥ããããªãã Q. 1幎åã«å®æœããå
¥éç£èŠæ¬ã®èŒªèªäŒã«åå ããŠããã®åŸãç£èŠã«å¯ŸããŠæèãè¡åã«å€åã¯ãããŸãããïŒ ãšãã質åãåå ããŠãã人ãã¡ã«æããããããããã®åçããŸãšãããšä»¥äžã®ããã«ãªããŸããã è¡åã«å€åããã£ã é¢ä¿ãããããªã¢ã©ãŒãã«å¯ŸããŠäœãããã¢ã¯ã·ã§ã³ãããããã«å¿æããããã«ãªããŸããã ã¢ããªã±ãŒã·ã§ã³ç£èŠã®ãã¿ãŒã³ãšã㊠Health ãšã³ããã€ã³ããã¿ãŒã³ãç¥ã掻çšããŸããã https://devblog.thebase.in/entry/2019/03/06/110000 Mackerelã§ã®ããžãã¹ç£èŠ(ãšããæ°å€ã®å€åããã§ãã¯)ãå®éã«å
¥ããŠã¿ãŸããã æèã«å€åããã£ã Zabbixã§ç£èŠã·ã¹ãã ãæ§ç¯ããŠããçµéšãããã®ã§ãããåæ§ã®ãã®ãæ§ç¯ããŠããŸãããã«ãªãããæãããŠãããäŒæ¥ã«ãšã£ãŠæ¬åœã«ããããšãªã®ãã©ãããã匷ãèããããã«ãªããŸããã æ§é åãã°ã«ããéèŠæ§ã¯ãElasticsearch/Kibanaã§å¯èŠåããããšãããããŸã§ããããããã¯ãšã³ãã®ãšã³ãžãã¢ãèªåã§ãããšå¿
èŠæ§ã身ã«ãã¿ãŠãããªãšæè¿æããŸãã ããã»ã©å€ãã£ãŠãªãã§ãããã¢ããªã±ãŒã·ã§ã³ãšã©ãŒèŠçŽããèããŠããäžã§ãšã©ãŒè¿œè·¡ãç£èŠã«å
¥ãããªãšæã£ãŠããã®ã§åèã«ãªã£ããšããã¯ãããããããªãã§ãã å€åã¯ãªãã£ã ãã®åŸãç£èŠã«å¯ŸããŠç¹ã«åŒ·ãã¢ã¯ã·ã§ã³ããšããŠããªããšæããŸãã å®åã§ãã®æ¬ãæèããããšã¯ä»ãŸã§ãªãã£ããšæããŸãã 茪èªäŒãéäžé¢è±ããŠããŸãä»ãç©ãèªç¶æ
ã§ãïŒ ãã®åŸãäœãããã¢ã¯ã·ã§ã³ãŸã§èµ·ãããŠãã人ã3å²ãæèã«å€åããã£ã人ã4å²ãç¹ã«å€åã¯ãªãã£ããšæã£ãŠãã人ã3å²ããããšããçµæã§ããã ãŸãšã ãã®çµæãèŠããšã茪èªäŒã®åœåã®ç®çã§ãããé¢å¿ã匷ããããšããç¹ã§ã¯åæ°ä»¥äžã®åå è
ãäœãããã®å€åããã£ããš(ååãã«)æãããšææçŸ©ãªäŒã ã£ãã®ã§ã¯ãªãã§ããããã ãŸããç§å人ãšããŠã¯ãéå»ã«ä»ç€Ÿã§éçšããŠããæ¥ã
ã®ã€ã³ãã©éçšçµéšããç£èŠã«ã€ããŠè²ã
ç¥ã£ãã€ããã«ãªã£ãŠããŸããããæ¹ããŠåå¿ã«ããã£ãŠæžç±ãä»ã®ã¡ã³ããŒããåŠãã ããšãå€ãã£ãããç¹ã«ããŠãŒã¶èŠç¹ã§ã®ç£èŠãã®å€§åãã®æèã匷ããªã£ãã®ã¯åç©«ã§ããã ãšã¯ãããä»åŸããè¯ããµãŒãã¹ãæäŸããŠããããã«ã¯ãç£èŠãéçšã«ã€ããŠããŸã ãŸã æ¹åããå¿
èŠããããšããã®ãçŸå®ã®çµç¹èª²é¡ãšããŠãããŸããBASEã®ãšã³ãžãã¢çµç¹ã§ã¯ç£èŠãéçšã®é¢ã«ã€ããŠãæŽã«æ¹å/匷åããŠããèšç»ãããããã®ãããã®è©±é¡ã¯ä»åŸèšç»ãé²ãã§ãã£ãéã«èšäºãäžããããšæããŸãã®ã§ã楜ãã¿ã«ïŒ
ããã«ã¡ã¯ãBASE BANKæ ªåŒäŒç€Ÿ Dev Division ã«ãŠã Software Developer ãããŠããæ°žéïŒ @glassmonekey ïŒã§ãã åŒç€Ÿã§ã¯AWS LambdaãæŽ»çšããæ©äŒãå¢ããŸããŠã æè¿ã¡ãžã£ãŒã¢ããããŒãã®ãã£ããAWS SAM CLIãã䜿ã£ãŠãªãªãŒã¹ãããŒã®æ¹åã«ãã£ã¬ã³ãžããŠã¿ãŸããã ããã§ãsamã³ãã³ãã§äœæãããµã³ãã«ãããžã§ã¯ããããŒã«ã«ã§å®è¡ããããã€ããæ¹æ³ã玹ä»ããŸããããã«å ããŠãçŸç¶BASE BANKããŒã ã§è¡ã£ãŠãã代衚çãªéçšèšå®ãã玹ä»ããŸãã ä»åèšäºäœæã«éããŠã ãµã³ãã«ããã°ã©ã ãçšæããŠããã®ã§ãããããã°æå
ã§ã確èªãã ããã ãªããä»åLambdaã«ã¯Goãæ¡çšããŸãããæ€èšŒã«äœ¿çšããç°å¢ã¯ä»¥äžã®éãã§ãã macOS: 10.15.x (Catalina) SAM CLI: version 1.2.0 AWS CLI: aws-cli/2.0.50 Python/3.7.4 Darwin/19.6.0 exe/x86_64 Go: go1.15.2 darwin/amd64 SAM CLIãšã¯ SAMãšã¯ Serverless Application Model ã®ç¥ç§°ã§ã AWS Lambda ã®ãããã€ç®¡çã«äœ¿ãããããŒã«ã§ã ããŒã«ã«äžã®ãããã° ã ãã«ã ã ããã〠ããµããŒãããŸãã å
¬åŒã®ã¢ããŠã³ã¹ ã«ãããš7æã« ããŒãžã§ã³1 ããªãªãŒã¹ãããŸããã ç»å㯠AWS SAM LocalïŒããŒã¿çïŒ â ãµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã«ã«æ§ç¯ããŠãã¹ããã ããåŒçšããŸããã ãŸããã®æããããªã¹ã®ãã£ã©ã¯ã¿ãŒã¯ å
¬åŒã®èª¬æ ã«ãããš "SAM the Squirrel (ãªã¹ã® SAM)" ã«ã€ã㊠SAM the Squirrel ã¯ããµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããããªãœãŒã¹ãå®çŸ©ããã¢ãã«ã§ãAWS Serverless Application Model (AWS SAM) ããåä»ããããŸãããSAM ã¯ãAWS ãŠãŒã¶ãŒããµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã广çãã€ç°¡åã«æ§ç¯ã§ãããããããªãŒ (æš) ã®äžã§å±
å¿å°ã®ããçæŽ»ãåŸã«ããŸããã ãšã®ããšã§ããªãã ãæçãæ¹§ããŠããŸããã ç°å¢æ§ç¯ samã³ãã³ããå®è¡ããããã«å¿
èŠãªèšå®ãããŠãããŸãã 1. AWS SAM CLIã®ã€ã³ã¹ããŒã« æåã« AWS SAM ãåããããã®CLIãã€ã³ã¹ããŒã«ããŸãã macOSã®å Žå㯠å
¬åŒ ã«ç޹ä»ãããŠããéãã Homebrew ã䜿ã£ãŠç°¡åã«ã€ã³ã¹ããŒã«ããããšãã§ããŸãã $ brew tap aws/tap $ brew install aws-sam-cli ãŸãã¯ã å
¬åŒã§æäŸãããŠããpipããã±ãŒãž ãå©çšããæ¹æ³ããããŸãã CIç°å¢ãªã©ã§brewãå
¥ããããªãå Žåã¯ãã¡ããããããã§ãã $ pip install aws-sam-cli sam --version ã§ããŒãžã§ã³ãè¿ã£ãŠãããã€ã³ã¹ããŒã«æåã§ãã $ sam --version SAM CLI, version 1.2.0 2. AWS CLIã®ã€ã³ã¹ããŒã« çŽæ¥SAMã®å®è¡ã«ã¯é¢ä¿ãããŸããããåäœç¢ºèªãªã©ã§å¿
èŠã«ãªã£ãŠããã®ã§ãã¡ãã å
¬åŒ ã®æ¹æ³ã«åŸã£ãŠå
¥ããŠãããŸãã $ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" $ sudo installer -pkg AWSCLIV2.pkg -target / ãã¡ãã aws --version ã§çµæãè¿ã£ãŠãããã€ã³ã¹ããŒã«å®äºã§ãã $ aws --version aws-cli/2.0.50 Python/3.7.4 Darwin/19.6.0 exe/x86_64 3. samå®è¡ãŠãŒã¶ãŒã®äœæ AWSã³ã³ãœãŒã«ãªã©ããsamã³ãã³ããå®è¡ãããŠãŒã¶ãŒã远å ããŠãããŸãã å¿
èŠãªããªã·ãŒãªã©ã¯åŸã»ã©è§£èª¬ããã®ã§ããã®æ®µéã§ã¯ AdministratorAccess ãèšå®ããŠãããŸãã ãŸããcliãããè§Šããããã«èšå®ããŠãããŸãã aws configure 4. dockerãã€ã³ã¹ããŒã«ããŠãã ããŒã«ã«å®è¡ãè¡ãå Žåã®ã¿ãdocker daemonãåããŠãªããšãããªãã®ã§ã€ã³ã¹ããŒã«ãããŠãããŠãã ããã docker for mac 㯠ãã¡ã ããã€ã³ã¹ããŒã«ã§ããŸãã SAMã䜿ã£ãéçºå
¥é ãŸãæåã«å
¬åŒãæäŸããŠãããHello, Worldãªapiãsamã䜿ã£ãŠãããã€ããããšãããããŠã¿ãŸãã 1. ãããžã§ã¯ããäœæãã sam init ãè¡ããšsamçšã®ãããžã§ã¯ãã®åæåãè¡ãããšãã§ããŸããä»åã¯ãµã³ãã«ããã°ã©ã ãæµçšããã®ã§å¯Ÿè©±åã®èšå®ãè¡ããŸãããæ¢ã«ãã£ã¬ã¯ããªæ§æãªã©ã宿ããŠããå Žåã¯äžèŠãªãããŒã§ãã sam init ä»åã¯å
¥éçšã®APIãã±ã±ã£ãšäœãã®ã§1ãéžã³ãŸãã Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Goã䜿ãã®ã§4ãéžã³ãŸãã PHPãéžæè¢ã«æ¥ãªãããªãŒ Which runtime would you like to use? 1 - nodejs12.x 2 - python3.8 3 - ruby2.7 4 - go1.x 5 - java11 6 - dotnetcore3.1 7 - nodejs10.x 8 - python3.7 9 - python3.6 10 - python2.7 11 - ruby2.5 12 - java8.al2 13 - java8 ãããžã§ã¯ãåã¯ããã©ã«ãã® sam-app ã®ãŸãŸã§è¡ããŸãã Project name [sam-app]: ä»åã¯åçŽãªapiãäœæããã®ã§1ãéžã³ãŸãã AWS quick start application templates: 1 - Hello World Example 2 - Step Functions Sample App (Stock Trader) ãããš ãããžã§ã¯ããã³ãã¬ãŒããããã©ã«ãã® https://github.com/aws/aws-sam-cli-app-templates ã䜿çšãã圢ã§ãããžã§ã¯ããåæåãããŠããŸãã âââ Makefile <-- Make to automate build âââ README.md <-- This instructions file âââ hello-world <-- Source code for a lambda function â âââ main.go <-- Lambda function code â âââ main_test.go <-- Unit tests âââ template.yaml AWS SAM ãšããŠLambdaã®æ§æç®¡çããŠããã®ã¯ template.yml ã«ãªããŸãã ããã¯Cloud Formationã®ã©ãããŒãšãªã£ãŠãããåºæ¬çãªææ³ã¯ Cloud Formation ã«æºæ ããŸãã ãŸããå
容ã«é¢ããŠã®è©³çŽ°ã¯ SAMã®ããã¥ã¡ã³ã ã Cloud Formationã®ãã³ãã¬ãŒããªãã¡ã¬ã³ã¹ ãäžèªããããšãããããããŸãã 2. ããŒã«ã«ã§å®è¡ããŠã¿ãã 2.1 ãã«ãå®è¡ å®è¡ã®åã«ãã«ããããŠã¿ãŸãã $ sam build å®è¡åŸã«äžèšã®ããã«bundleå«ããŠãããã€çšã®ãã¡ã€ã«çŸ€ãäœæãããã âââ .aws-sam â  âââ build â  âââ HelloWorldFunction â  â  âââ hello-world(ãã€ããªïŒ â  âââ template.yaml çæå
容ã®èšå®ã«é¢ããŠã¯template.ymlã«èšè¿°ãããŠãã CodeUri: hello-world/ Handler: hello-world ãšå¯Ÿå¿ããŠããã®ã§ãçæãããhandleråããœãŒã¹ãã£ã¬ã¯ããªã倿Žãããå Žåã¯ããã倿ŽããŸãã 2.2 ããŒã«ã«å®è¡ 次ã«ããŒã«ã«ã§å®è¡ãè¡ã sam local invoke ãå®è¡ããŸãã ãããšAWSãªãœãŒã¹ãä»ããã«ããŒã«ã«ã§å®çµããŠçµæãè¿ã£ãŠããã¯ãã§ãã $ sam local invoke {"statusCode":200,"headers":null,"multiValueHeaders":null,"body":"Hello, $å®è¡ç°å¢IPã¢ãã¬ã¹\n"} ãŸã -eãªãã·ã§ã³ãã€ããããšã§ã€ãã³ãæ
å ±ã®jsonãæž¡ãããšãå¯èœã§ãã ç¹ã«APIã³ãŒã«ä»¥å€ïŒSQSçµç±ãªã©)ã§åŒã³åºãããLambdaã®å Žåã ãšãããã°çšã®ã€ãã³ããéœåºŠäœæããã®ãæéã ã£ããããã®ã§ãã€ãã³ãæ
å ±ãæ¥µåGit管çããŠããããšãããããããŸãã 坿¬¡ç广ãšããŠãããŒã å
ã«ã©ã®ãããªã€ãã³ãã®ãããšããçºçãããã®å
±æã«ãã€ãªãããŸãã $ sam local invoke -e path/to/event.json` ãªããé圢㯠sam local generate-event $ãªãœãŒã¹å $APIå ã§äœæããããšãã§ããŸãã äŸãã°ã SQSã®receiveMessage ã®ã€ãã³ãã®Jsonã¯äžèšã®ãããªåœ¢åŒãšãªããŸãã $ sam local generate-event sqs receive-message { "Records": [ { "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78", "receiptHandle": "MessageReceiptHandle", "body": "Hello from SQS!", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1523232000000", "SenderId": "123456789012", "ApproximateFirstReceiveTimestamp": "1523232000001" }, "messageAttributes": {}, "md5OfBody": "7b270e59b47ff90a553787216d55d91d", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:MyQueue", "awsRegion": "us-east-1" } ] } 3. ãããã€ããŠã¿ãã 3.1 ãããã€ãã¡ã€ã«ã®äœæ ååãããã€ã®å Žå㯠--guided ãªãã·ã§ã³ã䜿çšããŠå¯Ÿè©±åœ¢åŒã§ãããã€èšå®ãã¡ã€ã« samconfig.toml ãäœããŸãã $ sam deploy --guided Stack Name [sam-app]: AWS Region [us-east-1]: ap-northeast-1 #Shows you resources changes to be deployed and require a 'Y' to initiate deploy Confirm changes before deploy [y/N]: n #SAM needs permission to be able to create roles to connect to the resources in your template Allow SAM CLI IAM role creation [Y/n]: Y HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y Save arguments to samconfig.toml [Y/n]: y åé
ç®ã«é¢ããŠã§ãã Stack Name ⊠å
éšçã«äœ¿çšããcloud formationã®stackåãsamãå®è¡ãããŠãŒã¶ãŒã¯ãã®stackåã«é¢ããŠã®æš©éãäžè¶³ããŠãããšãããã€ã«å€±æããã®ã§ãå¿
èŠãªã®ã§æ³šæãå¿
èŠã§ããæäœé以äžã®æš©éãå¿
èŠãªããšã¯ç¢ºèªããŠããŸãã "cloudformation:DescribeStackEvents", "cloudformation:CreateChangeSet", "cloudformation:DescribeChangeSet", "cloudformation:ExecuteChangeSet", "cloudformation:GetTemplateSummary", "cloudformation:DescribeStacks", Confirm changes before deploy: deployåã«ç¢ºèªãå¿
èŠãšããããCIäžã§åããæ³å®ãªã n ã«ããŠãããšè¯ãã§ãã Allow SAM CLI IAM role creation: ãããã€ããlambdaã«ä»äžããããŒã«ãèªåäœæããããèªåäœæããå Žåã¯äœèšãªæš©éãã€ãããšãããã®ã§èŠæ³šæã§ãã Save arguments to samconfig.toml: y ãªããã®å¯Ÿè©±åæäœã®èšå®å
容ãä¿åããŸãã ãããšä»¥äžã®ãããªãã¡ã€ã«ãçæãããŸããæ¬¡å以éã® sam deploy å®è¡æã¯ãã®èšå®ãã¡ã€ã«ãèŠãŠãããã®ã§ãå¿
èŠã«å¿ããŠèšå®ãæžãæãããšè¯ãã§ãããã version = 0.1 [default] [default.deploy] [default.deploy.parameters] stack_name = "sam-app" s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-6qa86tkchc0g" s3_prefix = "sam-app" region = "ap-northeast-1" capabilities = "CAPABILITY_IAM" ãªãã capabilities ã§æå®ã§ããå€ã¯ä»¥äžã®ãããããèšå®ããããšãã§ããŸãã CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_RESOURCE_POLICY CAPABILITY_AUTO_EXPAND 詳现㯠AWS Serverless Application Repositoryéçºè
ã¬ã€ã ã«èšèŒãããŠããŸããã template.yml 管çäžã®ãªãœãŒã¹ã®è€éãã§èšå®ã®åãæ¿ããå¿
èŠãªããã§ããIamããŒã«ãtemplate.ymlã§ç®¡çããå Žåãªã©ã®ã±ãŒã¹ã§ã¯èŠæ³šæã§ãã ä»åã¯ã·ã³ãã«ã«lambdaã®ã¿ã®ãªãœãŒã¹ç®¡çåãªã®ã§ããã©ã«ãã® CAPABILITY_IAM ã§è¯ãããã§ãã 3.2ãããã€ã®å®è¡ samconfig.toml ãååšããŠããã° sam deploy ã§ãããã€ãããã¯ãã§ãã ãããã€çµæã®ã¹ã¯ã·ã§ ç¡äºã«ãããã€ãããŸãã  ð lambdaã®ã³ã³ãœãŒã«ãèŠã«è¡ããšAPI Gatewayã®é
ç®ãããšã³ããã€ã³ãã確èªã§ããã¯ãã§ãã ã³ã³ãœãŒã«ç»é¢ãç¢ºèª ç¢ºèªã§ãããšã³ããã€ã³ãã仮㫠https://hogehoge.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/ ãšãããšçµæãè¿ã£ãŠããã°æåã§ãã $ curl https://hogehoge.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/ {"statusCode":200,"headers":null,"multiValueHeaders":null,"body":"Hello, $å®è¡ç°å¢IPã¢ãã¬ã¹\n"} ãšã³ããã€ã³ãã«curlãæããŠã¿ããšããŒã«ã«å®è¡ãšåããããªã¬ã¹ãã³ã¹ãè¿ã£ãŠããã¯ãã§ãã ããããããŒã«ã«å®è¡æãšã¯å
éšçã«ã¯ãããã¯ãŒã¯æ§æãç°ãªã£ãŠããã®ã§è¿ã£ãŠããIPã¯éããŸãã ãã®ä»èšå®é
ç®ã«ã€ã㊠次ã«çŸç¶BASE BANKããŒã ã§è¡ã£ãŠããéçšèšå®ã®äžéšãã玹ä»ããŸãã ç°å¢ããšã®èšå®ã®åãæ¿ã ãªãœãŒã¹ã®arnã®åãæ¿ããªã©ãç°å¢ããšã«åãæ¿ãããèšå®ãå€éšããæ³šå
¥ã§ããããã«ããŸãã ä»åã¯ã·ã³ãã«ã« APP_NAME ãš ENV ãç°å¢å€æ°çµç±ã§åãåã衚瀺ããããã«æžãæããŠã¿ãŸãã name := os.Getenv("APP_NAME") env := os.Getenv("ENV") return events.APIGatewayProxyResponse{ Body: fmt.Sprintf("%s@%s", name, env), StatusCode: 200, }, nil ãã®ç°å¢å€æ°ãåãåãããã«ã以äžã®ããã«ãããã¬ãã«ã« Parameters ã远å ããFunctionãªãœãŒã¹é
äžã« Environment.Variables ã远å ããŸãã ããã®æå³ãšããŠã¯templateããã©ã¡ãŒã¿ãšããŠåãåã£ãå€ã¯ç°å¢å€æ°ãšããŠFunctionãªãœãŒã¹ã«åãæž¡ããšãã圢ã«ãªããŸãã !Ref 㯠Cloud Forrmationã®é¢æ° ã§ãã»ã¯ã·ã§ã³éã®åç
§ã衚ããŸãã Parameters: ENV: Type: String AppName: Type: String Resources: HelloWorldFunction: ~~~ çç¥ ~~~~ Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object Variables: ENV: !Ref ENV APP_NAME: !Ref AppName ãã®ããã«ããŠãããšå®è¡æã« Key=Value ã®åœ¢åŒã§ãã©ã¡ãŒã¿ãæž¡ãããšãã§ããŸãã $ sam local invoke \ --parameter-overrides 'ENV=local AppName=Hello' $ sam deploy \ --parameter-overrides 'ENV=dev AppName=Hello' å€ãæž¡ãæ¹æ³ã¯ä»ã«ããã£ããã¯ããŸãããããŒã«ã«å®è¡ãšdeployæã®å¯Ÿç
§ãåããŠããã®ãšããããããããªãã€ã³ãã§ãã è¥å¹²ããã£ããã€ã³ããšããŠãã©ã¡ãŒã¿ããŒã«ã¯ _ ãªã©ã®èšå·ãå«ããã©ã¡ãŒã¿ã¯èªã¿èŸŒãã§ãããªãããã§ APP_NAME ã§ã¯ãªã AppName ãšããŠããŸãã ç°å¢ããšã®ãããã€èšå® ç¹ã«CIäžã®ã§å®è¡ãå å³ããå Žåãç°å¢å€æ°ã®æ³šå
¥çšã® parameter-overrides ã®ä»ã«ãèšå®ããŠãããããã©ã¡ãŒã¿ããããŸãã $ sam deploy \ --s3-bucket dev-sam-stacks \ --parameter-overrides 'ENV=dev AppName=Hello' \ --force-upload \ --no-fail-on-empty-changeset s3-bucket : cloud formationã®ã¢ããããŒãå
ã®ãã±ãããåºæ¬çã«ç°å¢ããšã§ãåãæ¿ããããšã«ãªãæãã®ã§ samconfig.toml ããèšè¿°ãæ¶ãããã©ã¡ãŒã¿ã§åãåããããã«ããŠãããŸãã force-upload: ãœãŒã¹ã³ãŒãã®å€æŽã䌎ããªãLambdaã®èšå®å€ã®ã¿ã®å€æŽã®éã«ãæ£ãããããã€ãããªãã±ãŒã¹ããã£ãã®ã§ãã©ã°ã远å ããŠãããŸãã no-fail-on-empty-changeset: å
容ã®å€æŽããªããŠããšã©ãŒã«ãªããªããã©ã°ã§ããCIã§åããå Žåãèãããšã倿Žããªããšããæ£åžžç³»ãšèããŠè¯ãã¯ããªã®ã§ãã®ãã©ã°ãç«ãŠãŠãããŸãã Makefileã®çšæ 以äžãèžãŸããŠç°å¢ããšã®èšå®ã«åãæ¿ãã¯ãããããMakefileå
ã«èšè¿°ããŠãããŸãã Makefileã®çšæãçšæããŠãããšãããŒã å
ã«ã³ãã³ãã®å
±æãã§ããã®ãšãCI äžã§äœããã£ããšãã«æå
ã§ã®æ€èšŒããããããªãã®ã§äŸ¿å©ã§ãã .PHONY: build test local-run local-up dev-deploy build: sam build # ãã¹ãã®å®è¡ test: @cd ./hello-world/ && \ go test -v ./... # ããŒã«ã«ã§lambdaãå®è¡ãã local-run: build sam local invoke \ --parameter-overrides 'ENV=local AppName=Hello' # apiãšããŠèµ·åããå Žå local-up: build sam local start-api \ --parameter-overrides 'ENV=local AppName=Hello' # ãããã€ãã dev-deploy: build sam deploy \ --s3-bucket sam-app-stack \ --parameter-overrides 'ENV=dev AppName=Hello' \ --force-upload \ --no-fail-on-empty-changeset ãŸãšã AWS SAM ã䜿ã£ãå
¥éãšéçšèšå®ã®äžéšã玹ä»ããŸããã ãããããã AWS SAM ã䜿çšãããæ¹ã
ã®å©ãã«ãªããã°å¹žãã§ãã åŸæ¥ã®éœåºŠdeployããŠç¢ºãããæ¹æ³ã ãšã©ãããŠã1åã®æ€èšŒã«æéãããã£ãŠããŸããLambdaã«æãåºãã¥ããç¶æ³äžã ã£ãã®ã§ãä»åŸã®éç£äœå¶ã«ç¡äºã«ç¹ãããããã§ãã ããŒãžã§ã³1 ã«ãªã£ãããšã«ãã倧忱ãããããªã£ãå°è±¡ããããŸããã ãŸããä»åã¯æéã®é¢ä¿ã§å°å
¥ãŸã§ã¯ã§ããŠãªãã®ã§ãã local stack ã䜿ãã°AWSãªãœãŒã¹äŸåã®ãã¹ããã§ããããªã®ã§ãæ©äŒãããã°ãã¡ããææŠããŠã¿ãããšæããŸãã