ã¯ããã« ããã«ã¡ã¯ããµãŒãã¹ã·ã¹ãã ã°ã«ãŒãã®äœã
æšã§ãã æè¿ãå€ãã®éçºããŒã ã§ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã話é¡ã«ãªã£ãŠããŸãããå®éã«å°å
¥ããŠã¿ããšãæã£ãŠããã倧å€ã ã£ã…ããšãã声ãããèããŸãããããªäžã§æ³šç®ãããŠããã®ãã ã¢ãžã¥ã©ãŒã¢ããªã¹ ããšããèãæ¹ãä»åã¯å匷äŒãèªäž»åŠç¿ã§åŠãã ããšããŸãšããŠã¿ãŸããã ã¢ãžã¥ã©ãŒã¢ããªã¹ãšã¯ ã¢ãžã¥ã©ãŒã¢ããªã¹ã¯ããœãããŠã§ã¢ã¢ãŒããã¯ãã£ã®äžã€ã®ã¢ãããŒãã§ãã åŸæ¥ã®ã¢ããªã·ãã¯ã¢ãŒããã¯ãã£ãšãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã®äžéçãªäœçœ®ã¥ããšããŠèããããŠããŠã ãã€ã¯ããµãŒãã¹ãåãå
¥ããäžã§èª²é¡ãããã®ã§ã¢ãžã¥ã©ãŒã¢ããªã¹ããã¯ãããããšãã£ãéžæè¢ ã§ããããŸãã ãŸãã¯ããã€ã¯ããµãŒãã¹å°å
¥ã«ããã£ãŠã®èª²é¡ã«ã€ããŠè§ŠããããšæããŸãã ãã€ã¯ããµãŒãã¹ã®çŸå®ïŒçæ³ãšçŸå®ã®ã®ã£ãã ãã€ã¯ããµãŒãã¹ã解決ããŠãããããš ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã«ã¯ç¢ºãã«é
åçãªå©ç¹ããããŸãã ã¹ã±ãŒã©ããªã㣠: ãµãŒãã¹ããšã«å¿
èŠãªåã ãã¹ã±ãŒã«ã§ãã æè¡ã®èªç±åºŠ : ãµãŒãã¹ã«æé©ãªæè¡ãéžã¹ã ããŒã ã®ç¬ç«æ§ : åããŒã ãèªåã®ããŒã¹ã§éçºã»ãããã€ã§ãã ã§ãããæ°ããæ©ã¿ãçãŸããŠããŸã… 忣ã·ã¹ãã ãªãã§ã¯ã®é£ãã ãããã¯ãŒã¯éä¿¡ã«ããè€éã ãã€ã¯ããµãŒãã¹ã§ã¯åãµãŒãã¹éã®éä¿¡ããããã¯ãŒã¯ãä»ããŠè¡ããããããã¢ããªã¹ã«ã¯ãªã課é¡ãçãŸããŸãã ãããã¯ãŒã¯é害ãžã®å¯Ÿå¿ : éä¿¡ãšã©ãŒãã¿ã€ã ã¢ãŠãããã±ãããã¹ãªã©ãžã®å¯ŸåŠãå¿
èŠ ã¬ã€ãã³ã·ã®å¢å : ãµãŒãã¹éã®åŒã³åºãã«ãããã¯ãŒã¯é
å»¶ãçºç éå®³ã®æ³¢å : 1ã€ã®ãµãŒãã¹ã®é害ãä»ã®ãµãŒãã¹ã«é£éçã«åœ±é¿ããå¯èœæ§ ãã©ã³ã¶ã¯ã·ã§ã³ç®¡çã®è€éã ã¢ããªã¹ã§ã¯ç°¡åã ã£ãåŠçãããã€ã¯ããµãŒãã¹ã ãšé端ã«è€éã«ã ãã¢ããªã¹ã®å Žåã æ³šæç¢ºå® â åšåº«ç¢ºä¿ â æ±ºæž â âïŒå€±æïŒ â ããŒã«ããã¯ããŠãªãã©ã€ããã°OK ããã€ã¯ããµãŒãã¹ã®å Žåã æ³šæç¢ºå® â åšåº«ç¢ºä¿ â âïŒå€±æïŒ â æ±ºæž â åçŽãªããŒã«ããã¯ãã§ããªããå°çšã®ãªã«ããªåŠçãå¿
èŠ ãã€ã¯ããµãŒãã¹å°å
¥åã«ã¯ç®çãæç¢ºã« ãããªçç±ã¯ã¡ãã£ãšå±éº ãææ°æè¡ã䜿ã£ãŠã¿ããããã ãä»ã®äŒç€Ÿããã£ãŠãããã ãããªç®çãªãè¯ããã æ©èœããšã«ç¬ç«ããŠã¹ã±ãŒã«ããã ããŒã éã®éçºãµã€ã¯ã«ãç¬ç«ãããã ç¹å®ã®æè¡èŠä»¶ã«å¯Ÿå¿ããã ãã€ã¯ããµãŒãã¹ãåããªãå Žé¢ããã ãããªç¶æ³ã ãšããã€ã¯ããµãŒãã¹å°å
¥ã¯æ
éã«èããæ¹ãè¯ãããã§ãã ã¹ã¿ãŒãã¢ããã®åææ®µé ã·ã¹ãã ããŸã ã·ã³ãã«ãªææã¯ããã€ã¯ããµãŒãã¹ã®éçšã³ã¹ãã®æ¹ãéã èŠä»¶ãã³ãã³ãå€ããææã«ã¯ããµãŒãã¹å¢çã®èšèšãé£ãã ãã¡ã€ã³ããŸã ææ§ãªæ ãµãŒãã¹ã®å¢çãäžæç¢ºã ãšãé »ç¹ã«å¢çã倿Žããããšã«ãªã ãããã¯ãŒã¯éä¿¡ã§ããã©ãŒãã³ã¹ãæªããªãã ãã«ãªããã¡ ã¢ãžã¥ã©ãŒã¢ããªã¹ïŒãããšãåãã®ã¢ãããŒã ã¢ãžã¥ã©ãŒã¢ããªã¹ã¯ããã€ã¯ããµãŒãã¹ãšã¢ããªã¹ã®ããããšãåãããç®æããã¢ãããŒãã§ãã ãããªç¹åŸŽããããŸã: åãã¢ããªã±ãŒã·ã§ã³ã®äžã§ã¢ãžã¥ãŒã«ãšããŠåå² ãµãŒãã¹éã®éä¿¡ã¯ãããã¯ãŒã¯ã䜿ããªã åã¢ãžã¥ãŒã«ã®ç¬ç«æ§ã¯ä¿ã¡ã€ã€ã忣ã·ã¹ãã ã®è€éãã¯é¿ãããã åºæ¬çãªèãæ¹: DDDïŒãã¡ã€ã³é§åèšèšïŒãšçžæ§ãè¯ã ãµãŒãã¹ã»ãã¡ã€ã³ããã¡ããšåé¢ é«åéã»ççµåãç®æã ã¢ãžã¥ã©ãŒã¢ããªã¹ã®è¯ããšããã»æ°ã«ãªããšãã è¯ããšãã éçºã®ç¬ç«æ§ãä¿ãŠã ã¢ãžã¥ãŒã«å¢çãã¯ã£ããããŠããã°ãç¬ç«ããéçºãã§ãã å°æ¥ãã€ã¯ããµãŒãã¹ã«ããããªã£ãæã®åå°ã«ããªã éçšãã·ã³ãã« ãããã¯ãŒã¯éä¿¡ã®ãšã©ãŒåŠçã§æ©ãŸãªããŠæžã åäžDBãªã®ã§ãããŒã¿ã®æŽåæ§ç¢ºä¿ã楜 段éçã«é²ãããã å¿
èŠã«å¿ããŠåå¥ã¢ãžã¥ãŒã«ããã€ã¯ããµãŒãã¹åã§ãã æ°ã«ãªããšãã ã¹ã±ãŒãªã³ã°ã«å¶çŽããã ãªãœãŒã¹ãå
±æããã®ã§ãåå¥ã¢ãžã¥ãŒã«ã ãã¹ã±ãŒã«ããã®ã¯é£ãã å
šäœã®ã¹ã±ãŒã©ããªãã£ã«ã¯éçããã æè¡ã¹ã¿ãã¯ãçµ±äžããã ã¢ãžã¥ãŒã«éã§åãæè¡ã䜿ãå¿
èŠããã å®éã«ãã£ãŠã¿ããšãããïŒç§»è¡æŠç¥ãèããïŒäŸïŒ 段éçã«é²ããã®ããã€ã³ã ãã§ãŒãº1: ãŸãã¯å€§ããåãã 1. ããã³ããšã³ã ããã¯ãšã³ãã§åé¢ 2. æè¡ã¬ã€ã€ãŒå¥ã«åé¢ïŒJava/PHPçïŒ 3. ã»ãã¥ãªãã£ã¬ãã«ã§åé¢ ãã§ãŒãº2: ãã¡ã€ã³ã§åãã 1. ããžãã¹ãã¡ã€ã³ãæŽç 2. ã¢ãžã¥ãŒã«å¢çãèšèš 3. ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ© ãã§ãŒãº3: ããŒã¿ããŒã¹ãåãããã©ããæ€èš 1. ã¢ãžã¥ãŒã«ã®å©çšç¶æ³ãåæ 2. ããã©ãŒãã³ã¹èŠä»¶ãè©äŸ¡ 3. å¿
èŠã«å¿ããŠDBåå²ã宿œ åå²ã®é åºïŒã³ãŒãããïŒDBããïŒ ããããã¯ãã³ãŒããããã®ã¢ãããŒã ãªãã³ãŒããããè¯ãã®ïŒ å®éã®å©çšç¶æ³ãèŠãŠããDBåå²ã倿ã§ãã 倱æããæã«å
ã«æ»ãããã ãªã¹ã¯ã段éçã«ç®¡çã§ãã é²ãæ¹ã®ã€ã¡ãŒãž: 1. ããžãã¹ããžãã¯ãã¢ãžã¥ãŒã«ã«åå² 2. ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŠå®è£
3. éçšç¶æ³ãç£èŠã»è©äŸ¡ 4. å¿
èŠãããã°DBåå²ã宿œ DBå
è¡ã¯ã¡ãã£ãšãªã¹ã㌠é©çšã§ããããªã±ãŒã¹: åäžããŒãã«ã ãåç
§ããå Žå æç¢ºã«ããã©ãŒãã³ã¹ãæ¹åããããªå Žå 泚æãããããš: çæçãªã¡ãªããã¯å°ãªã è€éæ§ãå¢ããªã¹ã¯ããã ã©ãããæãã€ããïŒåªå
é äœã®èãæ¹ 广çã«é²ããã«ã¯ããããªåªå
é äœã§èããŠã¿ããšè¯ãããã§ãã 1. ãæåªå
ãåãããã à ã¡ãªããã倧ããç®æ 2. åãã«ãã à ã¡ãªããã倧ããç®æ 3. åãããã à ã¡ãªãããå°ããç®æ 4. åãã«ãã à ã¡ãªãããå°ããç®æ ãã£ã±ããç°¡åã§å¹æã®é«ããšãããããå§ããã®ãéåã§ããã ã¢ãžã¥ã©ãŒã¢ããªã¹ãåŠãã§ã®ãŸãšããšä»åŸã®å±æ ããŒã¿ããŒã¹åå²ãžã®æ°ããèŠç¹ åŸæ¥ããã€ã¯ããµãŒãã¹åã«ãããæå€§ã®æžå¿µã¯ããŒã¿ããŒã¹åå²ã§ãããããããã¢ãžã¥ã©ãŒã¢ããªã¹ã¢ãããŒãã«ããããã®èª²é¡ã段éçã«è§£æ±ºã§ããéžæè¢ãããããšãåŠã³ãŸããã ã¢ãŒããã¯ãã£éžæã®å€æåºæº åŠã³ãéããŠåã¢ãããŒãã®é©çšå Žé¢ãæç¢ºã«ãªããŸããã ãã€ã¯ããµãŒãã¹ : 倧éãªã¯ãšã¹ãåŠçãæ°Žå¹³ã¹ã±ãŒãªã³ã°ãäž»ç®çã®å Žå ã¢ãžã¥ã©ãŒã¢ããªã¹ : éçºã®ç¬ç«æ§ç¢ºä¿ã段éçç§»è¡ãæ€èšããå Žå ã¢ããªã¹ : ã·ã³ãã«ãªã·ã¹ãã ãæç¢ºãªåå²ã¡ãªããããªãå Žå æ¬¡ã®ã¹ããããšããŠèããããããš å®éã«å°å
¥ãããšãªã£ãã以äžã®ããšããå§ããŠã¿ãããšæããŸããã ä»ã®ã·ã¹ãã ãæŽçããŠã¿ã ãã¡ã€ã³å¢çã®åè£ãæŽãåºããŠã¿ã ä»å°ã£ãŠããããšãæŽçãã å°ãã詊ããŠã¿ã 圱é¿ã®å°ãªãéšåããå®éšçã«å°å
¥ å¹æãæž¬ãææšãæ±ºããŠãã ããŒã ã®ã¹ãã«ã¢ãã DDDïŒãã¡ã€ã³é§åèšèšïŒã«ã€ããŠåŠãã§ã¿ã ã¢ãžã¥ãŒã«èšèšã®ãã¿ãŒã³ãå匷ããŠã¿ã åèè³æ CloudNative Days 2024: ã¢ãžã¥ã©ãŒã¢ããªã¹é¢é£è¬æŒ Modular Monoliths (Simon Brown) MonolithFirst (Martin Fowler) Microservice Premium (Martin Fowler) StranglerFigApplication Pattern Monolith vs Microservices (InfoQ) ãã®èšäºã¯å®éã®å匷äŒãèªèº«ã®åŠã³ãåºã«ãã¢ãžã¥ã©ãŒã¢ããªã¹ãšããéžæè¢ã«ã€ããŠæŽçãããã®ã§ããå®éã®å°å
¥æ€èšæã«ã¯ãåãããžã§ã¯ãã®ç¹æ§ãå¶çŽãååã«èæ
®ããããšã倧åã§ãã
ããã«ã¡ã¯ããããã£ã® ããã ã§ãã ä»åã¯Amazon ECSã®çµã¿èŸŒã¿Blue/Greenãããã€æ©èœã掻çšããŠãAWS Lambdaã«ããèªåãã¹ãã宿œããããšã§ãå®å¿ããŠAPIããªãªãŒã¹ã§ããããã«ããŠã¿ãŸããã ã¯ããã« 2025/7/17ã«ãªãªãŒã¹ãããECSã®çµã¿èŸŒã¿Blue/Greenãããã€ã§ããããããã€ã®éäžã§èªåã®Lambda颿°ãå®è¡ããããšãã§ãããã®é¢æ°ãç¹å®ã®å€ ( SUCCESSFUL ã FAILED ã IN_PROGRESS ã®ãããã) ãè¿ãããšã§ãããã€ã®å¶åŸ¡ãããããšãã§ããŸãã ãã®æ©èœã䜿ã£ãŠLambda颿°ã«ããèªåãã¹ããçµã¿èŸŒãããšã«ãããå®å¿ããŠAPIããªãªãŒã¹ã§ããããã«ããŠã¿ãŸããã®ã§ãã®äºäŸãã玹ä»ããŸãã ã¢ãŒããã¯ãã£æŠèŠ ä»åæ§ç¯ãããã®ã¯ä»¥äžã®èŠçŽ ã§æ§æãããŠããŸãïŒ ECSãµãŒãã¹ïŒBlue/Greenãããã€ã¡ã³ãæŠç¥ãèšå® Application Load BalancerïŒæ¬çªçšãšãã¹ãçšã®ãªã¹ããŒãããŒãéãã§èšå® ã¿ãŒã²ããã°ã«ãŒãïŒã¡ã€ã³çšãšä»£æ¿çšã®2ã€ãçšæ Lambda颿°ïŒãã¹ããã©ãã£ãã¯ç§»è¡åŸã®èªåãã¹ãå®è¡åŠç S3ãã±ããïŒãã¹ãã±ãŒã¹ã®å®çŸ©ãã¡ã€ã«ãæ ŒçŽ ãã€ã³ã ä»åã®ãã¢ãšãªãã®ã¯ Lambda颿° ãšS3ãã±ããã«æ ŒçŽããã ãã¹ãã±ãŒã¹ã®å®çŸ©ãã¡ã€ã« ã®2ã€ã§ãã ãŸããã¹ãçšã®ãã¬ãŒã ã¯ãŒã¯ã¯å©çšããããªãã¹ãã·ã³ãã«ã«ãã¹ããã§ããããã«ããŸããã ãã¹ãã±ãŒã¹ã®å®çŸ©ãã¡ã€ã« ä»åã¯tomlã§èšè¿°ããŸãããtomlãéžãã çç±ã¯äžèš2ç¹ã§ãã åŸè¿°ã®Lambda颿°ãPythonã§æžããã®ã§ç¹å¥ãªã©ã€ãã©ãªç¡ãã§ããŒã¹ãã§ãããã å¯èªæ§ãé«ã人éãå®çŸ©ããã®ã«é£åããªããã äŸ) [general] base_url = "https://api.example.com:8443/v1" charset = "UTF-8" [[test_cases]] title = "ç¹å®ãŠãŒã¶ã®æ
å ±ãåç
§ã§ããããš" target_endpoint = "/users/existent-user-id" [[test_cases.assertions]] target = "resultCode" expected = "0" [[test_cases.assertions]] target = "courseId" expected = "1" [[test_cases]] title = "ååšããªããŠãŒã¶ã®æ
å ±ã§ãšã©ãŒã«ãªãããš" target_endpoint = "/users/inexistent-user-id" [[test_cases.assertions]] target = "resultCode" expected = "1" [[test_cases.assertions]] target = "message" expected = "該åœãããŠãŒã¶æ
å ±ããŒã¿ãååšããŸããã§ãã" [general] ãããã¯ã«ã¯ãã¹ãå
šäœã§å©çšããåºæ¬çãªèšå®ãã [[test_cases]] ãããã¯ã«ã¯ã¿ã€ãã«ãšãã¹ã察象ã®ãšã³ããã€ã³ããã [[test_cases.assertions]] ãããã¯ã«ã¯ã©ã®é
ç®(â target )ãã©ãããå€ã§ããããšãæåŸ
ããã(â expected )ã®èšå®ãæžããŠããŸãã Lambda颿° ãã®é¢æ°ã¯ECSã®çµã¿èŸŒã¿Blue/Greenãããã€äžããã¹ããã©ãã£ãã¯ç§»è¡åŸã«å®è¡ããããã«èšå®ããŸãã å
容ãšããŠãç¹å¥ãªããšãããŠãããã S3ãã±ãããããã¹ãã±ãŒã¹ã®å®çŸ©ãã¡ã€ã«ãæã£ãŠãã ãã¡ã€ã«ã®å
容ãèªã¿åã ãã¹ãã±ãŒã¹ã®æ°ã ãAPIãªã¯ãšã¹ããå®è¡âã¢ãµãŒã·ã§ã³ãç¹°ãè¿ã ãšåŠçããããã«æžããŠããŸãã ãã ãã®é¢æ°å®è¡åŸã«ãããã€ãã©ãããã¹ãããæ±ºããªããã°ãããŸããã®ã§ã倱æãããã¹ãã±ãŒã¹ã®ã¿ã€ãã«ãé
åãšããŠæã£ãŠãããŠãæçµçã«ãã®é
åã空ã§ããã° {"hookStatus": "SUCCEEDED"} ãè¿ããŠæ¬çªãã©ãã£ãã¯ãGreenç°å¢ã«æµãããã«ãé
åã«èŠçŽ ãããã° {"hookStatus": "FAILED"} ãè¿ããŠãããã€ãããŒã«ããã¯ããããã«ããŸããã ããã«å€±æãããã¹ãã±ãŒã¹ã®ã¿ã€ãã«ãæã€ããã«ããã®ã§ããã°åºåã«ãã£ãŠå€±æãããã¹ããäœãªã®ããCloudWatch Logsãã確èªã§ããæ¬¡ã«äœããã¹ããããããããã«ãªãã®ããããããã€ã³ãã§ãã CI/CDãšã®é£æº GitHub Actionsã®äžã§ ãã¹ãã±ãŒã¹ã®å®çŸ©ãã¡ã€ã«ãS3ãã±ããã«ã³ã㌠ECSãµãŒãã¹ã®æŽæ° ã®2ç¹ãè¡ãããã«å®è£
ããã°ãã¯ãŒã¯ãããŒãèµ·åããã ãã§å®å¿ããŠãããã€ãã§ããããã«ãªããŸãã ãããã« ECSã®çµã¿èŸŒã¿Blue/Greenãããã€ãšLambda颿°ã«ããèªåãã¹ãã®çµã¿åããã«ãããããŸã§ãããæ¥œãªAPIã®ãªãªãŒã¹ãå®çŸã§ããŸããç¹ã«ããã¹ããã©ãã£ãã¯ç§»è¡åŸã«Lambda颿°ãå®è¡ããããšã§ãæ¬çªåœ±é¿ãäžããªãã§æ°ããŒãžã§ã³ã®å質ã確ä¿ã§ããç¹ã倧ããªã¡ãªããã§ãã ECSã®çµã¿èŸŒã¿Blue/Greenãããã€ã¯ãªãªãŒã¹ãããŠããæéããã£ãŠããããææ¢ãã®ç¶æ
ã§æ§ç¯ããŠã¿ãŸãããæ°ããäºäŸã®äžã€ãšããŠåèã«ããŠããã ãããå¬ããã§ãã
ãããã£ã®äž»åãµãŒãã¹ã®äžã€ããããã£ãã€ã³ãã¯ã©ãããããšããšã¯ãã©ã€ãã¡ãã£ã¢ãã®åç§°ã§20幎以äžéçšãããŠããŸãããã2021幎ã«çŸåšã®ãããã£ãã€ã³ãã¯ã©ããžåç§°ã倿Žããã客æ§ã«ããã«å¯ãæ·»ã£ããµãŒãã¹ãžãšçãŸãå€ãã£ãŠããŸãã ãšã¯ããã20幎ç¶ããµãŒãã¹ã ãã«ãå€ãã·ã¹ãã ã®å·æ°ã¯æ¥åãæè¡çãªè² åµãè§£æ¶ãããããã顧客äœéšãå®çŸããããã«å¥®éããŠããã®ããã€ã³ãããŒã ã®è¥ããšã³ãžãã¢ãã¡ã§ããäž»åãµãŒãã¹ã®å·æ°ãšããéèŠãªåœ¹å²ãæ
ãã¡ã³ããŒãã¡ã«æ¥åå
容ãçŸç¶ã®èª²é¡ãä»äºã®åã³ãªã©ã«ã€ããŠèããŸããã èªå·±çŽ¹ä» çŽ°é ä¿å¹³ãã 2023幎9æã«äžéå
¥ç€Ÿãâ¬ã¡ã€ã³æ¥åã¯ãããã£ãã€ã³ãã¯ã©ãïŒlifemedia.jpïŒã®éçºãéçšãå·æ°ãäŒæ¥ã®æ¥œãã¿ã¯ããã¹ãæç¬ã®ãããã¥ã¢ããã¯ã¹ãšéã¶ããšã è¥¿æ ¹ åæŽãã 2023幎4æâ¬å
¥ç€Ÿãã¡ã€ã³æ¥åã¯ãããã£ãã€ã³ãã¯ã©ãïŒlifemedia.jpïŒã®éçºãéçšãå·æ°ãâ¬è¶£å³ã¯æ
è¡ãšã©ã€ããšããŒãã²ãŒã ãâ¬â¬ é¢ æ©æŠãã 2021幎4æâ¬ã«æ°åå
¥ç€Ÿãã¡ã€ã³æ¥åã¯ãããã£ãã€ã³ãã¯ã©ãïŒlifemedia.jpïŒã®éçºãéçšãå·æ°ãè¶£å³ã¯è²ã
ãªã³ãŒããŒè±ã詊ãããããã³ããŒã¬ãŒå±ãå·¡ãããšãæè¿ã¯ãµãŠãå·¡ããã 20幎ç¶ããã€ã³ããµã€ãã®å
é§ãããããã£ãã€ã³ãã¯ã©ãã ã¿ãªãããéçºãéçšãå·æ°ãæ
åœããŠããããããã£ãã€ã³ãã¯ã©ããã¯ãã©ã®ãããªãµãŒãã¹ãªã®ã§ããããïŒ çŽ°éãã 20幎以äžã®éå¶å®çžŸããããã€ã³ããµãŒãã¹ã§ããã客æ§ããããã£ãã€ã³ãã¯ã©ãææºäŒæ¥ã®ãµãŒãã¹ãå©çšããããç¡æã²ãŒã ãã¢ã³ã±ãŒãã«çããããšã§ãã€ã³ããä»äžãããŸãã貯ãããã€ã³ãã¯1PïŒ1åã§ãçŸéãé»åãããŒã«äº€æã§ããã»ãã@niftyã®å©çšæéã«äœ¿ãããšãå¯èœã§ãã ãŸããä»åŸã®ããžã§ã³ãšããŠã¯ãããã£ãã€ã³ããåºç€ã«ããŠããããã£ã®åãµãŒãã¹ããã£ãšå€ãã®äººã«æŽ»çšããŠãããããããªç¶æ
ãã€ãããããšèããŠããŸãããããã£çµæžåãšãŸã§ã¯ãããªããŠãããã€ã³ããæœ€æ»æ²¹ã«ãªã£ãŠãããã£ã®ãµãŒãã¹å
šäœãããŸãã€ãªãã§ãããããä»ã¯ãã®ããã®æœçãããŒã ã§æ€èšããŠããŸãã ãããã£ãã€ã³ãèªäœã¯20幎以äžç¶ããµãŒãã¹ãšããããšã§ãããã¿ãªããã¯ã©ã®ã¿ã€ãã³ã°ãã©ããªçµç·¯ã§ãã€ã³ãããŒã ã«ã¢ãµã€ã³ãããŸãããïŒããŸããããããã®åœ¹å²ãæããŠãã ããã 现éãã åã¯2023幎ã®9æã«ãããã£ã«äžéå
¥ç€Ÿãããã€ã³ãããŒã ã«é
å±ãããŸãããããããã¯äž»ã«ãæ§æ¥ã®ã¯ã©ãŠããµãŒãã¹ã«çœ®ãããŠããããŒã¿ããŒã¹ãªã©ã®ã€ã³ãã©ã®äžéšãAWSãžç§»è¡ãããããžã§ã¯ãã«æºãã£ãŠããŸãã é¢ãã 2021å¹Žã«æ°åã§ãããã£ã«å
¥ç€ŸããŠãè€æ°ã®ãµãŒãã¹ã§ããã³ããšã³ããããã¯ãšã³ãã®éçºãçµéšããåŸã«ã2幎åãããã€ã³ãããŒã ã«å
¥ããŸããããã€ã³ãããŒã ã§ã®åœ¹å²ã¯éçºãéçšãå·æ°ã§ãå
·äœçã«ã¯ã客æ§ã察象ã«ãã€ã³ãã®éå
ãæ¡å€§ããããã®éçºãã现éãããšåãAWSãžã®ç§»è¡ãããžã§ã¯ããªã©ã«æºãã£ãŠããŸãã â»2人ãé¢ãã£ãAWSç§»è¡ãããžã§ã¯ãã®æŠèŠ https://aws.amazon.com/jp/blogs/news/amazon-aurora-migration-nifty/ è¥¿æ ¹ãã ç§ã¯2023å¹Žã«æ°åã§ãããã£ã«å
¥ãã1幎éã®ç ä¿®ãšãžã§ãããŒããŒã·ã§ã³ãçµãŠãæçµçã«ãã€ã³ãããŒã ã«é
å±ãããŸãããçŸåšã®äž»ãªåœ¹å²ã¯éçºãšéçšã§ãã 3人ã®ãªãã§ã¯è¥¿æ ¹ãããæãåŸèŒ©ã«ããããšãè¥¿æ ¹ããã«ãšã£ãŠã现éãããšé¢ããã¯ã©ããªå
茩ã§ããïŒ è¥¿æ ¹ãã ããã¯ãããå倧ãªå
茩ã§ãã é¢ãã åã£ãœãïŒç¬ïŒã è¥¿æ ¹ãã ãããæ¬åœã«ãäºäººã¯AWSãžã®ç§»è¡ãšããè² è·ã®å€§ãããããžã§ã¯ããæ
ã£ãŠããŠãèŠåŽããªãããããåãå§¿ãè¿ãã§èŠãŠããŸãããããã¹ã±ãžã¥ãŒã«ãã¿ã€ããªãªãã§å€§å€ãªæ¥åã ã£ããšæããŸããããã€ã2äººã§æèŠã亀ãããªããã仲è¯ããååãã«åãçµãŸããŠããå°è±¡ããããŸããã é¢ãã 確ãã«ããã®ææã¯æ¬åœã«å€§å€ã§ãããã现éãããšäžç·ã«ãªããšãä¹ãè¶ããŸããã现éããã®ã»ããæ¥çæŽã¯é·ãã®ã§ãããåã¯åæã«æŠåã ãšæã£ãŠããŸãã 4000ãã¡ã€ã«ã«ãåã¶âè¿âãåºãåããéæ¹ããªãäœæ¥ AWSãžã®ç§»è¡ã«ããããç¹ã«èŠåŽããç¹ãæããŠãã ããã é¢ãã 20幎ç¶ããããã£ãã€ã³ãã¯äŒç€Ÿã«ãšã£ãŠè²¡ç£ãšãããããµãŒãã¹ã§ãããäžæ¹ã§æè¡çã«ã¯â20幎åã®è² åµâãèç©ããŠããç¶æ
ã§ãããããšãã°ãããŒã¿ããŒã¹ã以åã®ã¯ã©ãŠãããAWSã«ç§»è¡ããã«ããã£ãŠãæ°ããã·ã¹ãã ã«åœ±é¿ãåºãªãããäžèº«ãå
šãŠæŽãåºãå¿
èŠããã£ããã§ãã4000ãã¡ã€ã«ã«ãåã¶âè¿âã綺éºã«åºãåãã®ã¯ããªããªã倧å€ãªäœæ¥ã§ãããã 现éãã ããŸãã«ãæ§æ¥ã®ããŒã¿ãŒããŒã¹ã§äœ¿ãããŠããã·ã¹ãã ã¯ããªãå€ããã®ã§ãããã°ã©ã ãããŒã ã®ã¡ã³ããŒã¯ã»ãŒè§Šã£ãããšããªãCèšèªã䜿ãããŠããŸããããããªç¶æ
ã§è² åµãå
šãŠæŽãåºããä»®ã«æŒãããŸãŸç§»è¡ããŠããŸã£ãå Žåã§ãã客æ§ã«åœ±é¿ãåºãªãããã«ããªããã°ãããªããã¹ã±ãžã¥ãŒã«çã«ãããŸãäœè£ã¯ãªãã£ãã®ã§ãAIãæŽ»çšãããªã©ããŠç¥èäžè¶³ãè£ããªããé²ããŠãããŸããã ãã®æŽãåºããšããã®ã¯ãé¢ãããšçްéããã®ãäºäººã§ããããŠããã®ã§ããããïŒ é¢ãã ããã§ããããã ãéäžããã¯ç¥èŠãæã£ãå¥ããŒã ã®æ¹ããããžã§ã¯ãã«å
¥ã£ãŠãããŸããããã®ãããã®åãã¯ããã€ã³ãããŒã ã«éãããããšæè»ã§ããããããžã§ã¯ãã«å¿
èŠãªäººæãå©ã£äººã®ãããªåœ¢ã§è£å
ããŠãããããšã¯çãããããŸããã è¥¿æ ¹ããã¯ãããã§ããããïŒããã€ã³ãããŒã ã®æ¥åã§ç¹ã«èŠåŽããããšãæããŠãã ããã è¥¿æ ¹ãã ãã€ã³ãããŒã ã«é
å±ãããŠå幎ã»ã©çµã£ãé ã«ãããŸããŸå
茩ã®ç°åã転è·ãéãªã£ãŠãç§1人ã§éçšãæ
ã£ãŠããææããããŸããããŸã åãããªãããšãå€ãã£ãã§ãããåœæã¯äžå®ã§ãããã ãã ãéçšæ
åœã1人ã«ãªãããšãåãã£ãã¿ã€ãã³ã°ã§äžåžãé¢è«ã®æ©äŒãã€ãã£ãŠãããŸããã人ã®è£å
ã«ã€ããŠç§ã®æèŠãèããŠãããŠããã®åŸããã«æŽŸé£ç€Ÿå¡ã®æ¹ãã¢ãµã€ã³ãããã®ã§ãæ©ã段éã§äžå®ãªç¶æ
ã¯è§£æ¶ãããŸãããã è² è·ãããã£ãæã«ãäžé·ã«å¯ŸããŠã¢ã©ãŒããåºããæ©äŒãããã®ã¯ããã§ããã è¥¿æ ¹ãã ããã§ãããé¢è«ã®æ©äŒãå€ãã§ãããæã«è§ŠããŠã倧äžå€«ïŒããšèããŠãããã®ã§ãçžè«ããããç°å¢ã§ã¯ãããšæããŸãã ãšã³ãžãã¢ã®ééå³ã¯ã倧ããªãããžã§ã¯ããä¹ãåã£ãæã®éææ ä»äºãããŠããŠåã³ãéææãæããã®ã¯ã©ããªæã§ããïŒ é¢ãã ä»åã®AWSç§»è¡ãããã§ããã倧ããªãããžã§ã¯ããäžåºåãã€ããæã§ãããéææãšãããããéæŸæã«è¿ããããããŸãããïŒç¬ïŒã ç¹ã«ã现éãããš2人ã§ãã£ãŠãããããžã§ã¯ãã«é¢ããŠã¯ããªãªãŒã¹åŸã«äœãããé害ãçºçããã ãããšæã£ãŠãããã§ããã§ããæ°ã¶æçµã£ãŠããããšãã£ãåé¡ã¯èµ·ãããªããŠã 现éãã ãã€ã¯ãã²ãšã€åã«ãªãªãŒã¹ããæ¡ä»¶ã§é害ãé »çºããŠããŸã£ãããšããã£ãŠãåãèœãèžãŸãªãããã«é²ããŠããŸãããããé£æåºŠã®é«ãæ¡ä»¶ã§ãé害ãåºããªããšããç®æšãã¯ãªã¢ã§ããã®ã¯å€§ããªèªä¿¡ã«ãªããŸãããã è¥¿æ ¹ãã ç§ã¯2人ã»ã©è² è·ã®å€§ãããããžã§ã¯ãã«æºãã£ãçµéšã¯ããŸã ãããŸããããã ã以åã«äŒç»åŽããæ¥ãã®éçºäŸé ŒãåããŠãçŽ1ã¶æã§èª¿æ»ããäŒç»ãšã®èª¿æŽããªãªãŒã¹ãŸã§äž»å°ããããšããããŸãããç¡äºã«ãªãªãŒã¹ã§ããæã¯åã³ãšåæã«ãããšã³ãžãã¢ã«ãªã£ããã ãªããšããæ°æã¡ãèœçããã®ãèŠããŠããŸãã é£æåºŠã®é«ãããã·ã§ã³ã ãã«ãããåãã°å¿
ãåãä»ã ãã€ã³ãããŒã ã®çŸç¶ã®èª²é¡ãããã°æããŠãã ããã é¢ãã æ¥åã«é¢ããŠã¯ãå
ã»ã©ãã話ããã20幎ã®è² åµã§ãããæªã ã«è§£æ¶ã§ããŠããªãéšåãå€ããåŒãç¶ãçæããŠããå¿
èŠããããŸããçŸç¶ã¯ã·ã¹ãã ãå€ãããªããã€è€éãªããããããã倿Žãããšãã©ãã«åœ±é¿ãåºããåãããªãããšããæžå¿µããéçºã«èžã¿åããªãã±ãŒã¹ããããã§ããäœèšãªäŒè°ãå¢ããŠãéçºã®ã¹ããŒããèœã¡ãŠããŸããããããè€éæ§ããªãããŠããã°ãããã客æ§åãã®éçºã«æ³šåã§ããã®ã§ã¯ãªãããšæããŸãã 现éããã¯ãããã§ããïŒ çŽ°éãã åãã§ãããå€ãããã®è² åµãããããšã§ãæ¬æ¥ãªãèªåã¢ããããŒãã§äºè¶³ãããããªäœæ¥ã§ããã¡ã³ããŒãåå¥ã«ãµãŒããŒã®ç®¡çãããŠã¢ããããŒããããªããã°ãããªããããªç¶æ³ãçºçããŠããŸãããã以å€ã«ãåé¡ãå±±ç©ã¿ã§ãæ©æ¥ã«è² åµã®è§£æ¶ãšã¯ã©ãŠãç§»è¡ãé²ããŠãããªããŠã¯ãããŸããã ãã ããããããã«ãä»ã¯äººå¡ãäžè¶³ããŠããŠããªããªãçæã§ããŠããªããæè¡çè² åµãè§£æ¶ããããè²ããªéçºã®ããã«ããã¯ã«ãªã£ãŠããŸã£ãŠããã®ãçŸç¶ã§ãããããŸãã«ã課é¡ãå€ãããããŸãã¯å
šäœåãææ¡ãåªå
é äœã決ããŠçæããŠããå¿
èŠããããšæããŸãã ã話ã䌺ã£ãŠããã ãã§ãããªãé£æåºŠã®é«ãããã·ã§ã³ã§ããããšãåãããŸãã 现éãã ãã ãããããã£ããããåãããšãã§ããã°ãå人ãšããŠãããªãåãä»ãã¯ãã20å¹Žã®æè¡çè² åµã«æããªããŠããã·ã§ã³ã¯ãããããäžãããããã®ãããªãããšã³ãžãã¢ãšããŠãããªã貎éãªçµéšãã§ããŠãããšæããŸããä»ã¯å€§å€ã§ãããåŸã§æ¯ãè¿ã£ãæã«å¿
ãããã£ããšæããã¯ãã§ãã ããã«ãé¢ããã話ããŠãããããã«ããã®å€§ããªèª²é¡ãã¯ãªã¢ã§ããã°ãã客æ§ã«æ°ãã䟡å€ãå±ãããããªéçºã«ãçæã§ããŸãããã®ã¹ããŒãžã«å°éããããã«ããã§ããããšãã確å®ã«é²ããŠããããã§ããã åŸç·šã«ç¶ããŸãïŒ ä»åã¯ãããã£ã®ãã€ã³ãããŒã ã®ã€ã³ã¿ãã¥ãŒã®æ§åããå±ãããŸãããç¶ãã¯è¿æ¥å
¬éäºå®ã®åŸç·šã®èšäºãã芧ãã ããã ãã®ã€ã³ã¿ãã¥ãŒã«é¢ããæ±äººæ
å ± /ããã°èšäº ãã€ã³ãããŒã æ±äººæ
å ± ãã€ã³ãããŒã æ±äººæ
å ±ïŒãªãŒããšã³ãžãã¢åè£ïŒ ãããã£ãã€ã³ãã¯ã©ã AWSç§»è¡ãããžã§ã¯ãïŒAmazon Web Services ããã°æ²èŒèšäºïŒ
ã¯ããã« ããã«ã¡ã¯ãç§å±±ã»æ·»éã§ãã æ¬èšäºã¯ãInnerSource Commonsãã9/12ã«äž»å¬ããInnerSource Gathering Tokyo 2025ã®åå ã¬ããŒãã«ãªããŸãã InnerSource Gathering Tokyo 2025ãšã¯ InnerSource Commonsãšããã€ã³ããŒãœãŒã¹ã«é¢ãããã¬ããžã®åµåºãšå
±æã«ç¹åããã³ãã¥ããã£ãããããã®ã³ãã¥ããã£ã®æ¥æ¬æ¯éšã9/12ã«docomo R&D OPEN LAB ODAIBAã§å®æœããã€ãã³ãã«ãªããŸãã åŒç€Ÿã®ã¡ã³ããŒãInnerSource Commonsã«æå±ããŠãããæ¬ã€ãã³ãã§ã¯éå¶ãé
ä¿¡æ©åšã«é¢ããã¹ã¿ãããšããŠãåå ããããŸããã ã€ãã³ãã®HPã¯ãã¡ã https://gatherings.innersourcecommons.org/tokyo-2025/ é
ä¿¡æ©åšã«é¢ããã¹ã¿ããã¯ãã¡ã ããããããã£ã®æ©æãé
ä¿¡çã§ãïŒ ä»åã®ã€ãã³ãã®è£æ¹ã§æŽ»èºããŠããã人ãã¡ã§ãïŒæè¬ïŒ #ISGT2025 pic.twitter.com/UnJWtdZ9sf — rashikawat (@ryo19790510) September 12, 2025 ãªãåå ããã®ã ç§å±±ïŒç§ã¯ãŸã ã€ã³ããŒãœãŒã¹ãå®è·µã§ããŠããªãã®ã§ãã€ã³ããŒãœãŒã¹ã®ãã¹ããã©ã¯ãã£ã¹ã«èå³ããããŸããããŸãããããã£ãéè·ãããæ¹ãäžè¬åå ãããŠããã®ã§ãåçŽã«ãã®æ¹ã«äŒããããšããçç±ããããŸããã æ·»éïŒç§ã¯ãçŸåšç€Ÿå
ã§ã€ã³ããŒãœãŒã¹ãæšé²ããã¡ã³ããŒã®äžäººã§ãæ¬ã€ãã³ãã®ã¹ã¿ããã§ãã£ãäžåžãååãããèªãããŠåå ããããŸããã æ¬é¡ ã€ãã³ãåå ç¹å
ž æ¬ã€ãã³ãã«åå ãããšããã以äžã®ãã®ãããã ããŸããã ã€ã³ããŒãœãŒã¹ããŒããŒã®ã¹ããã«ãŒÃ2 ã€ã³ããŒãœãŒã¹ããŒããŒã®ãã³ã«ã InnerSource Commonsã®ããŽã¹ããã«ãŒÃ2 æ°Ž â»ã€ã³ããŒãœãŒã¹ããŒããŒãšã¯ãInnerSource Commons Japanã§çãŸãããã£ã©ã¯ã¿ãŒã§ãã 詳现ã¯ãæšå¹Žã®ãã¡ãã®ã»ãã·ã§ã³ãã確èªãã ããã https://youtu.be/ynlGpNnTCkc?si=K5nXXPnOwaKvB5Mi ã»ãã·ã§ã³ Welcome to InnerSource Gathering Tokyo 2025 ã€ãªã³ã¹ããŒããã¯ãããžãŒæ ªåŒäŒç€Ÿ / InnerSource Commons Foundation ä¹
ä¿ ç¿éЬ (Shoma Kubo) æ§ ãã€ã³ããŒãœãŒã¹ãšã¯ãªã«ãããããã£ã¿ã ããŠã¹ã«ãŒã«â»ãã®èª¬æããããŸããã â»ãã£ã¿ã ããŠã¹ã«ãŒã«ãšã¯ãäŒè°ã§åŸãæ
å ±ãèªç±ã«å©çšã§ããããçºèšè
ã®èº«å
ãæå±ãåå è
ã®èº«å
ãæããã«ããããšã¯ã§ããªããšãããè°è«ã®èªç±ãªåå ãä¿ãããã®äŒè°ã«ãŒã«ã§ãã äŒå Žãæ¡å
[äŒå Žã¹ãã³ãµãŒ] æ ªåŒäŒç€ŸNTTãã³ã¢ æ¬ã€ãã³ãã®äŒå Žã§ããdocomo R&D OPEN LAB ODAIBAã«ã€ããŠã®èª¬æããããŸããã æ¬äŒå Žã¯ãå·çæç¹ïŒ2025幎9æïŒã§ã¯ããã³ã¢ã°ã«ãŒã瀟å¡ãšäžç·ã§ããã°ãä»åã®ãããªãªãŒãã³ãªã€ãã³ããå¹³æ¥ã«å®æœã§ããã€ãã³ãäŒå Žãšã®ããšã§ããã ãŸãéã€ãã³ãæã§ã¯ãã³ã¯ãŒãã³ã°ã¹ããŒã¹ãšããŠãå©çšã§ããããã§ãã 詳ããã¯HPãã確èªãã ããã https://docomo-openlab.jp/about/ æ¬ã€ãã³ãã宿œãããšãªã¢ã§ã¯ãå£äžé¢ã«ãã£ã¹ãã¬ã€ãããããŸã座åžã®äžéšæ°ã«æã«ãã¢ãã¿ãŒãçšæãããŠãããéåžžã«èŠãããäŒå Žã§ããã ã€ã³ããŒãœãŒã¹ã§æªæ¥ãç¯ãã ã¯ã€ã¯ã«æ ªåŒäŒç€Ÿ 代衚åç· åœ¹ è§ åŸå
ž (Masanori Kado) æ§ è³æ ïŒ https://kdmsnr.com/slides/20250912_innersource/ ã€ã³ããŒãœãŒã¹ãžã®èªèåããããå§ãŸããã€ã³ããŒãœãŒã¹ã«åå ããåæ©ããçµç¹ã«å¹æçã«æ®åãããããã®å®è·µçãªã¢ãããŒãã«ã€ããŠè§£èª¬ãããŸããã ã€ã³ããŒãœãŒã¹ãžã®èªèåããã®ããŒãã§ã¯ããã¡ã€ã«ãè§Šããªãè²¢ç®ã®äŸã話ãããŠãããè²¢ç®ã®ã¬ãã¥ãŒãè²¢ç®ã®ãã¹ããã€ã·ã¥ãŒã®ããªã¢ãŒãžãäŸãšããŠåºãŠããŸããã â»ç»å£è
ã®è§ããã®æžç±ã¯ãã¡ãã«ãªããŸãã ææ³ ç§å±±ïŒ OSSããã€ã³ããŒãœãŒã¹ãžãšç¹ããæŽå²ãè峿·±ãã£ãã§ãã åèæç®ã倿°ç޹ä»ãããŠãããOSSãã€ã³ããŒãœãŒã¹é¢é£ã®æžç±ã§å匷ããŠã¿ãããšæããŸããã æ·»éïŒ è²¢ç®ã®ã¬ãã¥ãŒã§åºãŠãããéä¿¡ã¯å³å¯ã«ãåä¿¡ã¯å¯å®¹ã«ããšãããã¹ãã«ã®æ³åãé¿ããŸããã ãŸãã€ã·ã¥ãŒã®ããªã¢ãŒãžã¯ãæ®æ®µã³ãŒããè§Šããªãæ¹ã§ãç°¡åã«å®è·µã§ãããã§ããã®ã§ã瀟å
ã§ãå®è·µããŠã¿ãããšæããŸãã çµç¹ã«å¹æçã«æ®åãããããã®å®è·µçãªã¢ãããŒãã«ã€ããŠè©±ãããŠããäœéšè«ã§ã¯ãææ
ãå«ããå
±æãè¯ããšããå
容ã§ãåèã«ãªããŸããã InnerSource掻åãxPaletteïŒã¯ãã¹ãã¬ããïŒããè§£ãæŸã€ãšã³ãžãã¢ã®åµé æ§ãšäž»äœæ§ éæç·åç ç©¶æ çç£é©æ°ã»ã³ã¿ãŒ ãã©ãããã©ãŒã ãµãŒãã¹éçºäºéš æŒé è²Žå® (Takahiro HIRUMA) æ§ xPaletteã¯ãéçºçŸå Žãæ¥åããžãã¯ã®éçºã«éäžã§ããå¿«é©ãªç°å¢ã«ããããšãç®çãšããéçºã³ãã¥ããã£ã§ããç«ã¡äžãæ1人ãã16人ãŸã§æé·ããéçšã§å¹ã£ãããšã³ãžãã¢ã®äž»äœæ§ãåŒãåºãã³ãã¥ããã£éå¶ã®å·¥å€«ããã€ã³ã»ãã·ã§ã³ããããæŽ»çšããå
±é³Žã®åŒ·åãªã©ã®å®è·µçãªåãçµã¿ã玹ä»ãããŸããã ææ³ ç§å±±ïŒ 瀟å
ã®è€æ°ãããžã§ã¯ãã§äœ¿ãã¬ã€ãã©ã€ã³ãå
±éãã³ãã¬ãŒãã®ãããªãã®ãã€ã³ããŒãœãŒã¹ã«åã£ãŠããã®ããªãšæããŸããã æ·»éïŒ äž»äœçã«æŽ»åããããªãã³ãã¥ããã£ãç®æããšããæ¹åæ§ã¯éåžžã«çã«ããªã£ãŠãããšæããŸããã ãŸããã€ã³ã»ãã·ã§ã³ãããã宿çã«å®æœãããŠããã®ãçŽ æŽãããåãçµã¿ã ãšæããŸããã äžè±é»æ°ãæšé²ããInnerSourceã®æªæ¥ äžè±é»æ©æ ªåŒäŒç€Ÿ èšèšæè¡éçºã»ã³ã¿ãŒ ãªãŒãã³ãœãŒã¹å
±åµæšé²éš éšé· è¿œç« çåŸ (Shingo Oidate) æ§ äžè±é»æ©ã§ã¯ãOSSã®éçºãå©çšãªã©ã管çã»æšé²ããçµç¹ã2025幎4æã«æ°èšããããšã®ããšã§ããããªãŒãã³ãœãŒã¹ãšã€ã³ããŒãœãŒã¹ã®äž¡æ¹ãæšé²ããããšã§çžä¹å¹æãç®æãããŠããããã§ãã ãŸã瀟å
ã§ã¯ã次ã®ã»ãã·ã§ã³ã§ãç»å£ãããå°ææ§ããInnerSource Commons japanã®æéšæ§ãã²ã¹ãã«ãæãããã€ã³ããŒãœãŒã¹Dayãéå¬ããããšããããšã§ããã ææ³ ç§å±±ïŒ OSSãã€ã³ããŒãœãŒã¹ãæšé²ããå°éã®éšçœ²ãããã®ã¯ããããšæããŸããããªããªããããŸã§ãã£ãŠããäŒç€Ÿã¯ãªããšæããŸãã æ·»éïŒ ãªãŒãã³ãœãŒã¹ãšã€ã³ããŒãœãŒã¹ã®äž¡æ¹ãæšé²ããã¢ãããŒãã¯éåžžã«è峿·±ããšæããŸããã ãŸãå€éšã®ã²ã¹ãããæãããŠç€Ÿå
ã§ã€ã³ããŒãœãŒã¹ã®ã€ãã³ããéå¬ããŠã¿ãã®ãè¯ãã¢ã€ãã¢ã ãšæããŸããã InnerSourceå¯Ÿè« ican.lab代衚 (å質管çãšãã¹ããŒã) çå· äžå¹³ (Ippei Kumagawa) æ§ æ ªåŒäŒç€Ÿ æ±è ããžã¿ã«ã€ãããŒã·ã§ã³æè¡ã»ã³ã¿ãŒ å°æ è¯å²³ (Yoshitake Kobayashi) æ§ å€§äŒæ¥ã§ã€ã³ããŒãœãŒã¹ãæšé²ããçµéšãšãã®æŽ»çšæ¹æ³ã«ã€ããŠã察è«åœ¢åŒã§èªãããã»ãã·ã§ã³ã§ããã çå·æ§ããã¯ãã©ã®ããã«ããŠã€ã³ããŒãœãŒã¹ã®èãæ¹ã«èŸ¿ãçããã®ããšããçµç·¯ã玹ä»ãããŸãããéçºæšæºãããžãã¹æšæºãªã©ã®èŠçšé¡ã®ããã¥ã¡ã³ãäœæã«ãããŠãã€ã³ããŒãœãŒã¹ã®ç¥èŠã掻çšããæ¹åäºäŸã«ã€ããŠãã話ããããŠããŸããã ãŸããå質ã®èгç¹ããèŠãã€ã³ããŒãœãŒã¹ã®å¹æã«ã€ããŠãèšåãããŠããŸããã ææ³ ç§å±±ïŒ éçºæšæºãèŠå®ã®ãããªãã®ã¯ã¿ããªå«ããã ããå©çšè
èªèº«ã䜿ããããããã«ã³ã³ããªãã¥ãŒããããšããã®ã¯é¢çœãã£ãã§ãã æ·»éïŒ èŠçšé¡ã¯ç¢ºãã«ã€ã³ããŒãœãŒã¹ã®ææ³ã广çã ãšæããŸããã ãã¡ãŒã¹ããã³ã®ã³ã ãã§ãªãããã¡ãŒã¹ããã©ãã¯ãŒïŒæŽ»åã«è³åããŠãããæåã®äººïŒã倧åã«ããããšããèãæ¹ã«æ·±ãå
±æããŸããã ã€ã³ããŒãœãŒã¹ããŒããŒããã®ã¡ãã»ãŒãž KDDIã¢ãžã£ã€ã«éçºã»ã³ã¿ãŒ ã€ã³ããŒãœãŒã¹ããŒã㌠/ äžå³¶ æºåŒ æ§ ã€ã³ããŒãœãŒã¹ããŒããŒãããããªã¡ãã»ãŒãžãå±ãããããèŠèŽããã»ãã·ã§ã³ã§ããã äžäººã²ãšããæå±çµç¹ãéžæããæä»£ã«âããããã¯ãªãããã«ããã®ãâãã®è¡šçŸãžã®ãã ãããšããã»ã¹ KDDIã¢ãžã£ã€ã«éçºã»ã³ã¿ãŒæ ªåŒäŒç€Ÿã¹ã¯ã©ã ãã¹ã¿ãŒ æ³æ¬ åªèŒ (Yuki Izumoto) æ§ ç»å£è³æ ïŒ KAGreementãšã¯ãKAGïŒKDDIã¢ãžã£ã€ã«éçºã»ã³ã¿ãŒïŒãæ²ç« ã瀟å¡ããããã§åè§£ã»è§£éããèªåãã¡ã®åãæ¹ãšããŠåå®çŸ©ããŠããåãçµã¿ã§ããã®ææ³ããKAG + Working Agreementããç¥ããŠãKAGreementããšåŒãã§ããããã§ãã ãã®KAGreementã«ãããããã»ã¹ãšãã€ã³ããŒãœãŒã¹ã®ãã¿ãŒã³ãæ¯ã¹ãŠã¿ãéã«ãæå€ãšå
±éç¹ããã£ããããã§ãã ææ³ ç§å±±ïŒ 瀟èšãè¡åæéã®ãããªãã®ã¯åœ¢éªžåããŠããŸãããšãå€ãã§ãããå
šç€Ÿå¡ãåãçµãããããªä»çµã¿ãã§ããŠããã®ãããããšæããŸããã æ·»éïŒ éææ§ãé«ãä¿ã¡ããªãŒãã³ãªã³ãã¥ãã±ãŒã·ã§ã³ã®æåãç¯ããŠããç¹ãçŽ æŽããããšæããŸããã ã¹ã±ãŒã«ããçµç¹ã®å®çŸã«åããã€ã³ããŒãœãŒã¹è²æè¡ ããŒã ã©ãæ ªåŒäŒç€Ÿ ããã±ãŒãžããŒã ãšã³ãžãã¢ æŸæ¬ ç²é³å¥ (Leona Matsumoto) æ§ ç»å£è³æ ïŒ ç»å£è
ã®èªç€Ÿã®ããŒã ã©ãã§ã®ã€ã³ããŒãœãŒã¹æŽ»åãäŸã«ããŠã瀟å
ã§ã©ã®ãããªSTEPã§ã€ã³ããŒãœãŒã¹ãåºããŠããæ¹æ³ã玹ä»ããã»ãã·ã§ã³ã§ããã ææ³ ç§å±±ïŒ ãããŸã§ã¯æ¢åãªããžããªãã€ã³ããŒãœãŒã¹åãããã¿ãŒã³ãå€ãããšæã£ãŠããŸããããæ°èŠã®äŸ¿å©ããŒã«ã®ãããªãã®ãã€ã³ããŒãœãŒã¹åããã®ã¯ãããªãšæããŸããã æ·»éïŒ ããã®ããŒã«ãå©çšäžã®ãªããžããªãã®ãªã³ã¯ãèšããã®ã¯ãéåžžã«å¹æçã ãšæããŸãããã©ã®ããã«å©çšãããŠãããã¯ãã³ã³ããªãã¥ãŒã¿ãŒç®ç·ã§ã¯æ°ã«ãªããã€ã³ãã§ãããããããããå¯èŠåã«ããè²¢ç®ãžã®ã¢ãããŒã·ã§ã³åäžã«ç¹ãããšæããŸãã æ¬¡ã®OSTã®åã«æ¬ã€ãã³ãã§ã®ãã¹ãã¹ããŒã«ãŒè³ã®æç¥šããããŸããã ãã¹ãã¹ããŒã«ãŒè³ã®è³åãšããŠãŠã£ã³ããŒãšãã¹ã¿ãŒããœãŒã¹ãèŽãããŠããŸããã InnerSource OST (Open Space Technology) åå è
ããããã®ããŒãã«ã€ããŠä»ã®äººã®æèŠãèããŠã¿ããããæ¬ã€ãã³ãã§ãã£ãšæ·±ã話ãåãããããæ¬¡åã®ã€ãã³ãã§åãæ±ã£ãŠã»ããããšãã£ã8ã€ã®ããŒããåéããããããã®ããŒãããšã«äŒå ŽãåããŠOSTã®ååã«åŸã£ããã£ã¹ã«ãã·ã§ã³ã»ãã·ã§ã³ã宿œããŸããã ãŸãããã£ã¿ã ããŠã¹ã«ãŒã«ããé©çšãããŠãããããè°è«ã®å Žã§ã¯èªç±ã«çºèšãã§ããŸãã ææ³ ç§å±±ïŒ ç§ã¯ãŸã ã€ã³ããŒãœãŒã¹ãå®è·µã§ããŠããŸãããããã§ã«ããªãå®è·µãããŠããæ¹ã®è©±ãèãã®ã¯é¢çœãã£ãã§ããåå¿è
ã®çåã話é¡ã«ããããšãã§ããŸããã æ·»éïŒ OSTã¯åããŠåå ããŸããããè²ã
ãšããŒãã«ã€ããŠä»ã®äŒç€Ÿã®ç¶æ³ãªã©ã亀ããªãã話ããŠãšãŠã楜ããè¯ãçµéšã«ãªããŸããã å
šäœãéããŠã®ææ³ã»åŠã³ã»æ°ä»ã ç§å±±ïŒ 瀟å€ã€ãã³ãã«åå ããã®ã¯ä¹
ãã¶ãã§ããããç±éãæããã»ãã·ã§ã³ã°ããã§ãšãŠãåºæ¿ãåããŸããã瀟å
ã§æ°ã«ãªãã€ã³ããŒãœãŒã¹ã®ãªããžããªãèŠã€ããŠãå®éã«ã³ã³ããªãã¥ãŒãããŠã¿ãããšæããŸããã æ·»éïŒ ã€ãã³ãã«åå ããŠã¿ãŠãã€ã³ããŒãœãŒã¹æŽ»åã®æ°ãã芳ç¹ã§ã®æ°ä»ãããã£ãããäŒå Žã®é°å²æ°èªäœããšãŠãé°å²æ°ãè¯ãã£ããããæ¬¡åéå¬ãããã®ã§ããã°ããã²ããããã®ã€ãã³ãã§ãã çµããã« åŒç€Ÿã§ã¯ãå€éšã®ã€ãã³ããã»ãããŒã§åŠã³ãåŸãããåŸãåŠã³ãæã¡åž°ã£ãŠåšå²ã«å
±æã§ããã®ã§ããã°äžåžã®èš±å¯ã®ããšèªç±ã«åå ããããšãã§ããŸãã
ã¯ããã« ããã«ã¡ã¯ãåºå¹¹ã·ã¹ãã ã°ã«ãŒãã®ç§å±±ã§ãã AWSã¯æ°èŠã¢ã«ãŠã³ãäœæãã1幎éç¹å®ã®ãµãŒãã¹ã§å©çšã§ããç¡ææ ããããŸããã絶察ã«èª²éãããªããšããèšå®ã¯ã§ããŸããã ããã§ç§ãå®éã«ééããèœãšã穎ã«ã€ããŠè§£èª¬ããããšæããŸãã ç¡èª²éã§äœ¿ããã¯ãã課éãããïŒ EC2+RDSãšããã·ã³ãã«ãªæ§æã¯ãAWSã¢ã«ãŠã³ãäœæãã1幎éå©çšã§ããç¡ææ å
ã§ãæ§ç¯ã§ããŸãã æ¬åœã®æå°æ§æã ãš1å°ã®EC2ã«ã¢ããªãšDBãçžä¹ããããæ¹æ³ã§ãããæ¬çªéçšãèŠéã«å
¥ãããªãã¢ããªãšDBã¯åããæ¹ãããããšæããŸãã ç§ãåŠç¿ç®çã§EC2+RDSæ§æãå人ã¢ã«ãŠã³ãã§äœã£ãŠããã®ã§ããã0.10ãã«ãšããããããªéé¡ã§ã¯ãããŸãããæå³ããªã課éãçºçããŠããŸããŸããã 課éã®åå ãšå¯ŸåŠæ¹æ³ AWSã³ã³ãœãŒã«ã®ãBilling and Cost ManagementãïŒè«æ±ãšã³ã¹ã管çïŒã確èªãããšã課éãããŠãããµãŒãã¹ã¯RDSã§ããã å
·äœçã«ã¯ã ãAmazon Relational Database Service Backup Storage – $0.095 per additional GB-month of backup storage exceeding free allocation running PostgreSQLã ãšããé
ç®ã§èª²éãããŠããŸããã åå ïŒããã¯ã¢ããæéã®èšå® åå ã¯ãRDSã®ããã¯ã¢ããæéã7æ¥ã«èšå®ãããŠããããšã§ãã ããŒã¿ããŒã¹äœææ¹æ³ããç°¡åã«äœæããªãã·ã§ã³ã«ãããšãããã¯ã¢ããæéã7æ¥ã§äœæãããŠããŸããŸãã ããã¯DBã€ã³ã¹ã¿ã³ã¹ãµã€ãºããç¡æå©çšæ ãã«èšå®ããŠãå€ãããŸããã§ããã ããŒã¿éã¯ããªãå°ãªãã£ãã®ã§ãããããã¯ã¢ããæéã®é·ãã«ããç¡æã®ã¹ãã¬ãŒãžãµã€ãºãè¶
éããŠããŸãããã§ãã å¯ŸåŠæ¹æ³ïŒããã¯ã¢ããæéã®å€æŽ ãã®ããã¯ã¢ããæéã1æ¥ã«ãããšã課éã¯æ¢ãŸããŸããã DBäœææ®µéã§ãããé²ãããã«ã¯ãããŒã¿ããŒã¹äœææ¹æ³ããæšæºäœæããªãã·ã§ã³ã«ããããã¯ã¢ããæéã1æ¥ãŸãã¯0æ¥ã«èšå®ããå¿
èŠããããŸãã ãããã« RDSãç¡ææ ã§å©çšããéã«ã¯ãRDSã®ããã¯ã¢ããæéã«æ³šæãå¿
èŠã§ãã æå³ããªã課éãçºçããªãããã«ããBilling and Cost Managementãã¯ããŸãã«ãã§ãã¯ããããšãããããããŸãã ãŸãä»åã¯å人ã¢ã«ãŠã³ãã§ã®è©±ã§ããããããã£ã§ã¯å®åŒŸæŒç¿å Žãšããå¶åºŠããããåŠç¿ç®çã§èªåçšã®AWSã¢ã«ãŠã³ããäœæããŠæ100ãã«ãŸã§ãç®å®ã«äœ¿ããŸããïŒç§æPCã§ã䜿ããŸãïŒïŒ ãã®ä»ã«ãç§ãæå±ããŠããåºå¹¹ã·ã¹ãã ã°ã«ãŒãã§ã¯ç¬èªã«AWSã®PoCïŒæŠå¿µå®èšŒïŒçšã¢ã«ãŠã³ãããããæ¥åã§æ°æè¡ãæ¡çšããåã®æ€èšŒãã§ããŸãã AWSã¯æãåãããŠãªãœãŒã¹ãäœãããšã§çè§£ãé²ãé¢ã倧ããããšæããŸãã®ã§ãå人/äŒç€Ÿã¢ã«ãŠã³ãåããå®éã«è§Šã£ãŠã¿ãã®ãããããšæããŸãã
ã¯ããã« ããã«ã¡ã¯!æ°å1幎ç®ã®é«å£ããªã¹ããŸããã¯ãã¯ã§ãã æ°äººç ä¿®ã®äžç°ãšããŠãããã£2025幎床æ°åå
¥ç€Ÿã®9åãAWS JumpStart2025ã«åå ããŠããŸãã!ãã®èšäºã§ã¯ 2æ¥éã®ããã°ã©ã å
容ã«å ããŠãåŠãã AWSãµãŒãã¹ãã°ã«ãŒãã¯ãŒã¯ã§äœæããã¢ãŒããã¯ãã£èšèšå³ã玹ä»ããŸã! AWS JumpStartãšã¯ AWSååŠè
ã®ãšã³ãžãã¢ã察象ãšããå®è·µçãªç ä¿®ããã°ã©ã ãäºååŠç¿åç»ãš2æ¥éã®éäžçãªãªã³ã©ã€ã³ã¯ãŒã¯ã·ã§ãããéããŠãAWSãžã®çè§£ãæ·±ããã åãªãAWSãµãŒãã¹ã®åŠç¿ã ãã§ãªããèŠä»¶ã«åãããŠã¢ãŒããã¯ãã£ãæ€èšã»èšèšããããšãè¡ãã æ¬ããã°ã©ã ã®ãŽãŒã« äžè¬çãªãªãã¡ã¬ã³ã¹ã¢ãŒããã¯ãã£ã®çè§£ AWSã®ã³ã¢ãµãŒãã¹ã®æŠèŠãšãã®éžå®åºæºã®çè§£ AWSã®ã¢ãŒããã¯ãã£å³ãäœæãããŸã§ã®æµããç¥ã 宿œæ¥æ åå2æ¥é(9:00~18:00) 2025 幎 3 æ 13 æ¥ïŒæšïŒ~ 3 æ 14 æ¥ïŒéïŒ 2025 幎 5 æ 27 æ¥ïŒç«ïŒ~ 5 æ 28 æ¥ïŒæ°ŽïŒ 2025 幎 8 æ 27 æ¥ïŒæ°ŽïŒ~ 8 æ 28 æ¥ïŒæšïŒ(ç§ãã¡ãåå ããæ¥æ) 2025 幎 10 æ 23 æ¥ïŒæšïŒ~ 10 æ 24 æ¥ïŒéïŒ ã¹ã±ãžã¥ãŒã« 1æ¥ç® 1æ¥ç®ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠã®è¬çŸ©ãšãå®éã«Webã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå®è·µçãªãã³ãºãªã³ãè¡ããŸããããã³ãºãªã³ã§ã¯ãååã«EC2ãšAmplifyãååŸã«ECS + ALB + RDSãšãã£ãAWSãµãŒãã¹ã䜿çšãã2ïœ4人ããŒã ã§ã®ã¢ãããã°ã©ãã³ã°åœ¢åŒã§åãçµã¿ãŸããã åå AWSäœéšãã³ãºãªã³( EC2 ) æåã®ã¹ããããšããŠããŠãŒã¶æ°ã100人以äžã®ãããªå°èŠæš¡ãªãµãŒãã¹ãæ§ç¯ãããã³ãºãªã³ãäœéšããŸããã ãã®ãã§ãŒãºã®ç®æšã¯ã ããšã«ããã·ã³ãã«ã«ããããŠå®äŸ¡ã«!ã ãµãŒãã¹ãç«ã¡äžããããšã§ãããããã§å©çšããäž»ãªãµãŒãã¹ã¯ä»¥äžã®éãã§ãã EC2 (Amazon Elastic Compute Cloud): ã¯ã©ãŠãäžã§ä»®æ³ãµãŒããã¬ã³ã¿ã«ã§ãããµãŒãã¹ã§ãã VPC (Virtual Private Cloud): AWSã¢ã«ãŠã³ãå°çšã®è«ççã«åé¢ãããä»®æ³ãããã¯ãŒã¯ç©ºéãæäŸãããµãŒãã¹ã§ãããµãŒããçŽæ¥ã€ã³ã¿ãŒãããã«å
¬éããªãããã«ããVPCããšãããã©ã€ããŒããªãæµããèšããã€ã¡ãŒãžã§ãã ãããã®ãµãŒãã¹ãå®éã«äœ¿ã£ãŠãã·ã³ãã«ãªWebã¢ããªã±ãŒã·ã§ã³ãäœæãããã³ãºãªã³ãè¡ããŸããããªããä»åã®ãã³ãºãªã³ã§ã¯1ã€ã®EC2ã€ã³ã¹ã¿ã³ã¹ã®ã¿ãç«ã¡äžããŸããããã®ããããããã®EC2ã€ã³ã¹ã¿ã³ã¹ã«é害ãçºçãããšããµãŒãã¹å
šäœã忢ããŠããŸããšããåé¡ããããŸãããã®ãããªåŒ±ç¹ã®ããšã ãåäžé害ç¹ã ãšåŒã³ãå®éã®ãµãŒãã¹ã§ã¯é¿ããªããã°ãªããªãæ§æã§ãã AWSäœéšãã³ãºãªã³( Amplify ) EC2ãšVPCã®æ§æã§ã¯ãä»®æ³ãµãŒãã®ç®¡çãOSã»ããã«ãŠã§ã¢ã®èšå®ãšãã£ãã人ã«ãããæ§ç¯äœæ¥ãã®è² è·ãé«ããšãã課é¡ããããŸãããã®èª²é¡ã解決ããããæè»œã«ãµãŒãã¹ãç«ã¡äžããéžæè¢ã Amplify ã§ãã Amplifyã«ã¯ãäž»ã«æ¬¡ã®ãããªç¹åŸŽããããŸãã æè»œãªããã〠Webãµã€ãã®ãœãŒã¹ã³ãŒããªã©ãã¢ããããŒãããã ãã§ããããã€ããå
¬éãŸã§ãèªåçã«è¡ãããŸãã é«éãªã°ããŒãã«é
ä¿¡ Amazon CloudFrontãèªåã§èšå®ãããäžçäžã®ãŠãŒã¶ãžWebã³ã³ãã³ããäœé
å»¶ã§é«éã«é
ä¿¡ããŸãã èªåã¹ã±ãŒãªã³ã° ãã©ãã£ãã¯ã®å¢æžã«å¿ããŠãªãœãŒã¹ãèªåçã«æ¡åŒµã»çž®å°ããããããæ¥ãªã¢ã¯ã»ã¹å¢ã«ãèããããé«ãå¯çšæ§ãç¶æããŸãã Amplifyã®ãã³ãºãªã³ã§ããã·ã³ãã«ãªWebã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããEC2ã®ãã³ãºãªã³ãšã¯ç°ãªããOSããããã¯ãŒã¯ã®èšå®ãããããšãªãã¢ããªã±ãŒã·ã§ã³ãç«ã¡äžããããšãã§ããŸããã ãã®ããã«ãAmplifyã¯ãµãŒãã¬ã¹ã§ã€ã³ãã©ç®¡çãäžèŠãšãã倧ããªã¡ãªããããããŸãããã®äžæ¹ã§ãEC2ãšæ¯ã¹ãŠAWSæ§æã®æ±ºå®ã«ã¯å¶éããããããçšéã«å¿ããŠäœ¿ãåããããšãéèŠã§ãã ååŸ AWSäœéšãã³ãºãªã³( ECS + ALB + RDS ) ãµãŒãã¹ãæé·ããŠãŒã¶æ°ãå¢ããŠãããšã次ã«éèŠã«ãªãã®ã ãã¢ããªã±ãŒã·ã§ã³ã®å¯çšæ§ãæ¡åŒµæ§ã ã§ãããããå®çŸããããã®å
·äœçãªææ³ãšããŠãECS+ALB+RDSãšãã£ãçµã¿åãããèããããŸãã ECS(Elastic Container Service): Dockerãªã©ã®ã³ã³ãããç°¡åã«å®è¡ã»ç®¡çã§ãããµãŒãã¹ã§ãã ALB(Application Load Balancer): ãµãŒããžæ¥ãã¢ã¯ã»ã¹ïŒãã©ãã£ãã¯ïŒããè€æ°ã®ãµãŒãã«èªåã§æ¯ãåããŠããããµãŒãã¹ã§ãã RDS (Amazon Relational Database Service): ã¯ã©ãŠãäžã§ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãç°¡åã«ã»ããã¢ããã»éçšã§ãããµãŒãã¹ã§ãã ãã®ããã«ã3ã€ã®ãµãŒãã¹ãçµã¿åãããããšã§ãã¢ã¯ã»ã¹æ°ã®å¢æžã«æè»ã«å¯Ÿå¿ã§ãããå¯çšæ§ã»æ¡åŒµæ§ã®é«ãã·ã¹ãã ãæ§ç¯ããããšãã§ããŸããå
·äœçã«ã¯ãALBããã©ãã£ãã¯ãè€æ°ã®ã³ã³ããïŒECSã¿ã¹ã¯ïŒãžèªåã§åæ£ãããé害ãèµ·ããã³ã³ãããåãé¢ããŠãããããããµãŒãã¹å
šäœã忢ãããªã¹ã¯ãäœæžããæè»ãªæ¡åŒµãå¯èœã«ãªããŸãã 1æ¥ç®ã®ååŸã§ã¯ããã®æ§æãç®æããŠãããŒã å
šå¡ã§ToDoã¢ããªãæ§ç¯ãããã³ãºãªã³ã«åãçµã¿ãŸãããæ§ç¯ããã¢ããªã¯ä»¥äžã®ãããªæãã§ã! 2æ¥ç® ã¢ãŒããã¯ãã£ã³ã° 2æ¥ç®ã¯ã1æ¥ç®ã®è¬çŸ©ã®åŸ©ç¿ã¯ã€ãºãšãAWSæ§æå³ãäœæããïŒã¢ãŒããã¯ãã£æ€èšïŒã¯ãŒã¯ã·ã§ãããè¡ããŸããã 埩ç¿ã¯ã€ãºã§ã¯ã1æ¥ç®ã«åŠãã ãµãŒãã¹ã®ç¹åŸŽã確èªããåé¡ããAWSèªå®è³æ Œã®è©Šéšã®å¯Ÿçã«ãªããããªã¯ã€ãºãåºé¡ãããŸãããã¯ã€ãºåŸã®äžå¯§ãªè§£èª¬ãå°è±¡çã§ããã ã¢ãŒããã¯ãã£æ€èšã¯ãŒã¯ã·ã§ããã§ã¯ããAWSã䜿ã£ãŠWebãµãŒãã¹ããªãªãŒã¹ãããããšãã課é¡ã«æ²¿ã£ãŠèšèšã«åãçµã¿ãŸãããAWSã®ç€Ÿå¡ã®æ¹ãä»åã®èŠä»¶ãããŒã«ãã¬ã€ã³ã°ã§èª¬æããŠãã ãã£ãã®ã§ãã¯ãŒã¯ã·ã§ãããæ¥œããåãããªé°å²æ°ã§è¡ãããšãã§ããŸãããååäžã¯å人ã§èšèšå³ãèããååŸã¯ããããã®èšèšå³ãæã¡å¯ãã5ã8人ã®ã°ã«ãŒãã§ååããŠAWSã·ã¹ãã ã®èšèšã«åãçµã¿ãŸããã ææ é«å£ããŒã ç§ãã¡ã®ããŒã ã¯ã以äžã®æ§æå³ãäœæããŸããã ç§ãã¡ã®ããŒã ã§ã¯ãæé1äžäººçšåºŠã®ã¢ã¯ã»ã¹ãæ³å®ããå¯çšæ§ãæå€§éé«ããããšèããŸãããããã§ãECSãšRDSã䜿ã£ãŠ2ã€ã®ã¢ãã€ã©ããªãã£ãŒãŸãŒã³(AZ: Availability Zone)ã«é
眮ããæ§æã«ããŸããã ãŠãŒã¶ããã®ã¢ã¯ã»ã¹ã¯CloudFrontãçµç±ããWAFã§ã»ãã¥ãªãã£ãé«ããŠããŸããããã³ããšã³ãã»ããã¯ãšã³ãå±€ã¯ECSäžã§ã³ã³ãããšããŠçšŒåããããããžã®ãã©ãã£ãã¯ã¯ALBã䜿ã£ãŠåæ£ããããã«ããŸãããèªèšŒãå¿
èŠãªæäœã«ã€ããŠã¯ãCognitoã䜿ã£ãŠäžå
çã«ç®¡çããŠããŸããããŒã¿ããŒã¹ã¯RDSãæ¡çšããŠããã¡ãã2AZæ§æã«ããããšã§ããŒã¿ããŒã¹ã®å¯çšæ§ã確ä¿ããŠããŸãããŸããRedshiftã䜿ã£ãŠèç©ããã賌買ããŒã¿ãªã©ãåæã§ããããã«ããŠããŸãã ããŒã å
ã«AWSã«ã€ããŠè©³ããæ¹ã¯ããªãã£ãã®ã§ãããå
šå¡ã§èª¿ã¹ããã質åãããããŠååããªããæ§ç¯ããããšãã§ããŸããã ãªã¹ããŸããŒã ãªã¹ããŸããŒã ã§ã¯ãè€æ°AZã«ãªãœãŒã¹ã忣é
眮ããDBãåé·åãããšããé«å¯çšæ§ã®æ§æãåºæ¬ãšããŠã次ã®2ã€ã®ç¹ãéèŠããŠèšèšãè¡ããŸããã 1ã€ç®ã¯é«ãããã©ãŒãã³ã¹ã§ããAuroraãã¡ã€ã³ã®ããŒã¿ããŒã¹ãšããªãããäžæçã«å©çšãããããŒã¿ã¯é«éãªDynamoDBã§ç®¡çããããèšèšããŸããããŸããWebãµãŒãã¹ãžã®åã¢ã¯ã»ã¹æã«Auroraã®åŠçè² è·ã軜æžãããããElastiCacheãå°å
¥ããŸããã 2ã€ç®ã¯ã»ãã¥ãªãã£ã§ããå€éšããã®ã¢ã¯ã»ã¹ã¯CloudFrontãçµç±ãããWAFã«ãã£ãŠã»ãã¥ãªãã£ã匷åããŸããã課é¡ã®WebãµãŒãã¹ã§ã¯ããŠãŒã¶ãåå¥ã¢ã«ãŠã³ããæã£ãŠãµãŒãã¹ãå©çšããããšãæ³å®ãããããã¢ã«ãŠã³ã管çã«ã¯Cognitoãæ¡çšããé«åºŠãªã»ãã¥ãªãã£ã®å®çŸãç®æããŸããã ããã®AWSãµãŒãã¹ã§å®çŸãããããšã¯äœãããæèããŠè°è«ããããšã§ãããŒã ã§çŽåŸã§ããèšèšãã§ããçè§£ãããæ·±ããããšãã§ããŸããã ãã¯ãã¯ããŒã ãã¯ãã¯ããŒã ã¯ãŠãŒã¶ãå¢ããå Žåã®å¯çšæ§ãšæ¡åŒµæ§ãæèããŠã以äžã®æ§æå³ãäœæããŸããã ãã®æ§æå³ã§ç¹ã«å·¥å€«ãããã€ã³ãã¯äžèšã®3ã€ã§ãã 1. ã»ãã¥ãªãã£ïŒSecurityïŒ ãµãŒãã¹ã§å©çšãããããŒã¿ãšãªãœãŒã¹ãä¿è·ãããããå€å±€çãªã»ãã¥ãªãã£å¯Ÿçãå®è£
ããŸããã WAF: SQLã€ã³ãžã§ã¯ã·ã§ã³ãã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒã®ãããªäžè¬çãªWebæ»æã® ãã¿ãŒã³ããã©ãã£ãã¯ããµãŒãã«å°éããåã«ãã£ã«ã¿ãªã³ã°ããŸãã AWS Shield: DDoSïŒåæ£åãµãŒãã¹åŠšå®³ïŒæ»æããã·ã¹ãã ãä¿è·ãããããŒãžããµãŒãã¹ã§ãããµãŒãã¹ã麻çºããããããªæªæã®ãã倧éã®ãã©ãã£ãã¯ãæ€ç¥ããŸãã Amazon Cognito: ãŠãŒã¶ã®ãµã€ã³ã¢ããããµã€ã³ã€ã³ãã¢ã¯ã»ã¹ã³ã³ãããŒã«ãæ
ãèªèšŒãµãŒãã¹ã§ããããã«ãããèªèšŒã·ã¹ãã ãèªåã§æ§ç¯ããè€éãã軜æžããã»ãã¥ãªãã£ã匷åããããšãã§ããŸãã VPC: ãããã¯ãŒã¯ããããªãã¯ãµãããããšãã©ã€ããŒããµããããã«åé¢ããŸããããããªãã¯ãµããããã«ã¯ãå€éšã€ã³ã¿ãŒããããšã®çŽæ¥éä¿¡ãå¿
èŠãªãŠã§ããµãŒããããŒããã©ã³ãµãŒãªã©ãæå°éã®ãªãœãŒã¹ã®ã¿ãé
眮ããããŒã¿ããŒã¹ãäž»èŠãªã¢ããªã±ãŒã·ã§ã³ãµãŒãã¯ãã©ã€ããŒããµããããã«é
眮ããŸããããã®æ§æã«ãããããŒã¿ããŒã¹ãå€éšããçŽæ¥ã¢ã¯ã»ã¹ããããªã¹ã¯ã倧å¹
ã«äœæžãããªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ã峿 Œã«å¶åŸ¡ããããšãã§ããŸãã 2. å¯çšæ§ïŒHigh AvailabilityïŒ ãŠã§ããµãŒããã¢ããªã±ãŒã·ã§ã³ãµãŒããããŒã¿ããŒã¹ãå«ãå
šãåãã·ã¹ãã ã 2ã€ã®ã¢ãã€ã©ããªãã£ãŒãŸãŒã³ ã§æ§ç¯ããŸãããããçæ¹ã®ãAZ1ãã«åé¡ãçºçããµãŒãããŠã³ããŠããæ£åžžã«åããŠããããäžæ¹ã®ãAZ2ããžèªåçã«ãã©ãã£ãã¯ãåãæ¿ããããã«æ§æãããµãŒãã¹ã忢ããªãèšèšããŸããã 3. æ¡åŒµæ§ïŒScalabilityïŒ ãŠãŒã¶æ°ïŒãã©ãã£ãã¯ïŒã¯ç¶æ³ã«ãã£ãŠå€ãããŸããã€ãã³ããæé垯ã«ãã£ãŠå¢ããããšãããã°ãæžå°ããããšããããŸãããã®ãããªãã©ãã£ãã¯ã®å€åã«å¹ççã«å¯Ÿå¿ãããã ãAuto Scalingã ãå°å
¥ããŸããã ããã«ããããã©ãã£ãã¯ãéåžžæãããå¢å ããéã«ã¯èªåã§ECSã¿ã¹ã¯ã远å ããŠãµãŒãã®è² è·ã忣ããŸããéã«ãã©ãã£ãã¯ãå°ãªãæé垯ã«ã¯äžèŠãªECSã¿ã¹ã¯ãèªåã§çµäºãããã³ã¹ããæé©åããŸãã ææ³ é«å£ 2æ¥éãéããŠãã¯ã©ãŠãã€ã³ãã©èšèšã®åºç€ããå®è·µãŸã§å¹
åºãåŠã¶ããšãã§ããŸããã1æ¥ç®ã®è¬çŸ©ã§ã¯ãåã«ã·ã¹ãã ãæ§ç¯ããã ãã§ãªããå®å®çšŒåã®ããã®éçšé¢ã«ã€ããŠã詳现ãªè§£èª¬ããããå®åã«çŽçµããç¥èãæ·±ããããšãã§ããŸããã2æ¥ç®ã§ã¯ãã¢ãŒããã¯ãã£ãèšèšãã€ã€ããããŸã§è©³ããç¥ããªãã£ãAWSãµãŒãã¹ã«ã€ããŠã®çè§£ãæ·±ããããšãã§ããã®ã¯å€§ããªåç©«ã ãšæããŸãã çãæéã§ããããéåžžã«åŠã³ãå€ãç ä¿®ã§ããã ãªã¹ã㟠AWS JumpStartã§ã¯ãå®è·µçãªã¯ãŒã¯ã«åãçµãããšãã§ããŸãããããªããã®ãããªèšå®ãããã®ããããã®ãµãŒãã¹ã§å®çŸãããããšã¯äœãããªã©ãAWSãµãŒãã¹ã®æ·±æããããããšã§ãããçè§£ãæ·±ãŸã£ããšæããŠããŸãã ã°ã«ãŒãã¯ãŒã¯ã§ã¯ã課é¡ã«åãçµãäžã§ç€Ÿå€ã®æ¹ãšã®äº€æµããããŸãããAWSã®å匷ã®é²ãæ¹ããã¯ã©ãŠããµãŒãã¹ã»AIã®æŽ»çšã«ã€ããŠã話ãããããšãã§ããŸãããJumpStartã®ã³ã³ãã³ãå€ã§ãåŠã³ãåŸãã貎éãªæ©äŒãšãªããŸããã ãã¯ã㯠åŠçæä»£ã¯ååããç¥ããªãã£ãAWSããããã£ã«å
¥ç€ŸããŠãããAWS SummitããããŠä»åã®AWS JumpStartãšãçŽæ¥äœéšã§ãã貎éãªæ©äŒãããã ããŸããã ååã®AWS Summitãã¯ã©ãŠããžã®èå³ãæ¹§ããã£ããã«ãªã£ãæéã ãšããããä»åã®AWS JumpStartã¯ãæ§ã
ãªãµãŒãã¹ãçµã¿åãããŠäžã€ã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå
·äœçãªæ¹æ³ãåŠãã æéã§ããã ç¹ã«åå¿è
åãã®ã€ãã³ãã ã£ãã®ã§ãAWSãåããŠã®åå è
ãå€ããæ°è»œãªé°å²æ°ã§è³ªåããªããååããŸãããå°ã£ãããšã¯ããŒã ã¡ã³ããŒãšäžç·ã«å·¥å€«ããªãããã³ãºãªã³ãé²ããããšãã§ããŸããã 以åã¯è€éãªçµµã«ããèŠããªãã£ãã¢ãŒããã¯ãã£å³ãããä»ã§ã¯åãµãŒãã¹ã®åœ¹å²ãããŒã¿ã®æµããèªã¿åããããã«ãªããŸãããä»åã®AWS JumpStartã¯ä»åŸã®æ¥åã§AWSã®æè¡ãã¢ãŒããã¯ãã£ã«åãåãéã«ãèªåãå¿çšã§ããããšããèªä¿¡ãäžããŠãããã貎éãªçµéšã§ããã AWS JumpStartã®ããŒãž https://aws.amazon.com/jp/blogs/news/aws-jumpstart-2025/
ã¯ããã« ã¯ãããŸããŠã2025幎5æã«ãããã£ãžå
¥ç€ŸããŸããããµãŒãã¹ã·ã¹ãã ã°ã«ãŒãã®katrinaã§ãã è¶£å³ã§ãªãŒã±ã¹ãã©ãµãŒã¯ã«ã«æå±ããŠãããã³ã³ãã©ãã¹ã匟ããŠããŸããäŒæ¥ã¯ãã¡ããå¹³æ¥å€ã«ãç·Žç¿ãããŠããŠãå°ãã§ãç·Žç¿æéã確ä¿ããããšããæããä»äºã®ã¢ãããŒã·ã§ã³ã«ããªã£ãŠãŸãïŒ ãããŸã§ã®çµæŽãšè»¢è·ã®ãã£ãã åè·ã§ã¯SIerãšããŠçŽ9幎éãäž»ã«ã客æ§å
ã«åžžé§ããªããã·ã¹ãã éçºã«æºãã£ãŠããŸããã å€ãã®ãããžã§ã¯ããçµéšããäžã§ã次第ã«ããã£ãšäžæµã®å·¥çšããéçºã«é¢ãããããããµãŒãã¹ãã®ãã®ã®æé·ãèãããããšã³ãžãã¢ã«ãªãããããšããæ³ãã匷ããªãã転è·ã決æããŸããã è»¢è·æŽ»åãéããŠããããã£ã®é¢æ¥ãæãå°è±¡çã§ãããå€ãã®äŒæ¥ã§æè¡çãªã¹ãã«ã«é¢ãã質åãäžå¿ã ã£ãã®ã«å¯Ÿãããããã£ã§ã¯æè¡ã®è©±ã¯ãã¡ããã®ããšãç§ã®ãã£ãªã¢ãã©ã³ãä»äºã«å¯Ÿãã䟡å€èгãšãã£ãããŒãœãã«ãªéšåã«ã€ããŠã質åããŠããããŸããã èªåã®ããããããšã䟡å€èгãå°éããŠããããé°å²æ°ããããšæããããå
¥ç€Ÿã決ããŸããã å
¥ç€ŸããŠæããããš å¿åããè·çš®ã¯ãã«ã¹ã¿ãã¯ãšã³ãžãã¢ã§ãããåè·ã§ã¯Webã¢ããªã±ãŒã·ã§ã³éçºãã¡ã€ã³ã§è¡ã£ãŠãããããã³ããšã³ããšããã¯ãšã³ãã©ã¡ããçµéšããã£ãã®ã§ããããã®ã¹ãã«ã掻ãããããšæãå¿åãããŸããã å
¥ç€ŸããŠæãã倧ããªã®ã£ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®éçºã ãã§ãªããã€ã³ãã©æ§ç¯ãéçšãªã©ããããã¯ãã«é¢ããå
šãŠã®ã·ã¹ãã åšãã®äœæ¥ãæ
ããšããããšã§ããããããå
補åãïŒãšæããŸããã ç¹ã«ã€ã³ãã©é åã«ã¯ãããŸã§æºãã£ãããšããªãã£ãã®ã§ãããAWSã¯ããšããšå人çã«å匷ããŠããã®ã§å®è·µã®å ŽãåŸãããšãã§ãããããããæããŠããŸãã ã³ãã¥ãã±ãŒã·ã§ã³ã掻çºãªããŒã ç§ã®ããŒã ã§ã¯ã¹ã¯ã©ã ã§ã®éçºããããªã£ãŠããŸããã¹ã¯ã©ã ã€ãã³ãã«ãã£ãŠã³ãã¥ãã±ãŒã·ã§ã³ãçºçããããšã¯ãã¡ããã§ãããæ°è»œã«Slackã§è³ªåãããããçŽæ¥å£°ããããããé°å²æ°ããããŸããããŒã ã ãã§ã¯ãªã瀟å
å
šäœã§ãããã£ãé°å²æ°ãããããã«æããŸãã åè·ã¯é»ã
ãšäœæ¥ãããããšãå€ãã£ãã®ã§ãããããšããšã³ãã¥ãã±ãŒã·ã§ã³ãåããªããäœæ¥ãé²ããŠè¡ãããšã奜ãã ã£ãã®ã§ããšãŠãå±
å¿å°ãããã§ãã ã¹ãã«ãåºããããç°å¢ å
¥ç€ŸããŠåããŠæ
åœããäœæ¥ããTerraformã䜿ã£ãŠã®AWSç°å¢ã®æ§ç¯ã§ããã åè¿°ã®éããå®åã§ã®AWSæäœã®çµéšãä¹ããäžãTerraformã¯å
šãåããŠè§Šããšããç¶æ³ã§ãããããã²ãã£ãŠã¿ãããšæãææŠãããŠããããŸããããéçºç°å¢ãªãäœããã£ãŠãæ»ãã°ããããã©ãã©ããã£ãŠã¿ãŠããšããããŒã ã®åŸæŒãããšãŠãå¿åŒ·ãã£ãã§ãããããã£ãææŠããããç°å¢ãããã®ã¯ãèªåãã¡ã§ç°å¢ã管çããŠãããããããªã®ããšæããŸãã ãŸãã瀟å
ã§ã¯AIãæŽ»çšã§ããç°å¢ãæŽã£ãŠãããæèè
ã«ããå匷äŒãé »ç¹ã«éãããŠããŸããåè·ã§ã¯è§Šããæ©äŒããªãã£ãã®ã§ãããçŸåšã§ã¯3ã¶æåã®èªåã§ã¯æ³åã§ããªããããæŽ»çšããŠããŸãã ä»åŸã®ç®æšã»æ±è² ãŸã çµéšã¯å°ãªãã§ãããããžãã¹éšéã®ã¡ã³ããŒãšäžç·ã«ãæ°ãµãŒãã¹ã«ã€ããŠæ€èšããæåããã«åå ããããšããããŸããããšããšè»¢è·ã®ãã£ãããšãªã£ãäžæµã«æºãããšããç°å¢ã«èº«ã眮ãããšãã§ããŠããã®ã§ããšã³ãžãã¢ãšããŠã®æèŠãäŒããããããããŸãã¯ãã¡ã€ã³ç¥èãæè¡ã¹ãã«ããã£ãã身ã«çããŠããããã§ãã æåŸã« ç§ã®çµéšããããããã£ã¯ä»¥äžã®ãããªæ¹ã«ç¹ã«ããããã§ããäŒç€Ÿã ãšæããŠããŸãïŒ å·¥çšã«ãšãããããæ
åœã·ã¹ãã ã®å
šãŠã«é¢ãã£ãŠã¿ããæ¹ æªçµéšã®æè¡ãæ°ããæè¡ã«ãäž»äœçã«ææŠãããæ¹ ããŒã ã¡ã³ããŒãšç©æ¥µçã«ã³ãã¥ãã±ãŒã·ã§ã³ãåããªããéçºãé²ãããæ¹ å°ãã§ããèå³ããæã¡ããã ããŸãããããŸãã¯ã«ãžã¥ã¢ã«é¢è«ã§ã話ãããŸãããïŒãé£çµ¡ããåŸ
ã¡ããŠãããŸãïŒ
ã¯ããã« ããã«ã¡ã¯ããããã£ã®å±±ç°ã§ãã æå€ãšç¥ããªãæ¹ãå€ããã ã£ãã®ã§ãä»åã¯PATã䜿ããªãGitHubã®ã¢ã¯ã»ã¹æ¹æ³ã«ã€ããŠç޹ä»ããŸãã åæ GitHubã§ã¯HTTPçµç±ã§ã®ID/ãã¹ã¯ãŒãèªèšŒã廿¢ãããçŸåšã¯èš±å¯ãããŠããŸããã ãã®ããã git clone ãªã©ã®éã«IDã»ãã¹ã¯ãŒããå
¥åããŠã匟ãããŠããŸããŸãã(ãã©ãŠã¶ãšåæ§ã§ã) ãªã®ã§ã HTTP Personal Access Token(PAT) OAuthèªèšŒ SSH ã®3éãã®æ¥ç¶æ¹æ³ããéžã¶ããšã«ãªããŸãã SSHã䜿ããç°å¢ã§ã¯SSHã䜿ãã°ããã®ã§ãããç°å¢ã«ãã£ãŠã¯SSHãéãããHTTPã䜿çšããå¿
èŠãããå ŽåããããŸãã PAT PATã¯å€ãããããæ¹æ³ã§ãããPersonalã®æåéããå人ã«çŽã¥ãããŒã¯ã³ãæåã§çºè¡ã»ç®¡çããŸãã æå管çããéµã§ããã管çã®æŒããæŒæŽ©ã®å¯èœæ§ããã çšéããšã«éµãåããã®ã䜿ãåãã®ãâŠãªã©ãéµç®¡çãèããå¿
èŠããã ãšããããã«ç®¡çè² æ
ãã»ãã¥ãªãã£ãªã¹ã¯ãããããªãã¹ã䜿ããããªãéžæè¢ã§ãã OAuthèªèšŒ åæã§èšèŒãã2ã€ç®ã®éžæè¢ã§ããOAuthèªèšŒåŸã«çºè¡ãããããŒã¯ã³ã§ãGitHubãžã®ã¢ã¯ã»ã¹ãå¯èœãšãªããŸãã OAuthãªã®ã§ãã©ãŠã¶ãå¿
èŠã§ãããGitå®è¡PCãšå¥ã®PCã§ãåé¡ãããŸããã GitHub Desktopãäœ¿ãæ¹æ³ Download GitHub Desktop ã€ã³ã¹ããŒã«ã»èµ·åããŠæç€ºéãã«é²ãã°GitHubãžOAuthèªèšŒãä¿ãããŸãã GitHub Desktopããã°ã€ã³ã§ããŠããç¶æ
ã§ããã°OAuthããŒã¯ã³ãæå¹ãªã®ã§ãgitã³ãã³ãã§ã®æäœã§ãèªèšŒãéããŸãã GitHub CLIãäœ¿ãæ¹æ³ GitHub CLI ã³ãã³ãã©ã€ã³äžã§å®çµããããå Žåã¯GitHub CLIãã€ã³ã¹ããŒã«ããŸãã macOSã§ããã°homebrewãã brew install gh ã§ã®ã€ã³ã¹ããŒã«ãå¯èœã§ãã ã€ã³ã¹ããŒã«åŸ gh auth login ã§ãã°ã€ã³ã§ããŸããããšã¯æ®éã«gitã³ãã³ããå©ãã°å®äºã§ãã æäœ $ gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How would you like to authenticate GitHub CLI? Login with a web browser ! First copy your one-time code: XXXX-XXXX Press Enter to open <https://github.com/login/device> in your browser... â Authentication complete. - gh config set -h github.com git_protocol https â Configured git protocol ! Authentication credentials saved in plain text â Logged in as xxxxxx éäžã®ãPress Enter to~ãã§EnterãæŒããšãã©ã¶ãéãã®ã§ããã©ãŠã¶åŽã§ãã°ã€ã³ããŠã³ãŒããå
¥åããŸãã ãªããã©ãŠã¶ã§ã®ã³ãŒãå
¥åãèŠæ±ãããŸããããã®æäœã¯å¥ãã·ã³ã®ãã©ãŠã¶ã§è¡ã£ãŠãåé¡ãããŸããããªã®ã§ãµãŒãäžã§ãåé¡ãªããã°ã€ã³ãå¯èœã§ãã å¶çŽ PATãšç°ãªãã æå¹æéããªã(èšå®ãã§ããªã) GitHubç»é¢äžããç¡å¹åããªãéããç¡æéã«ãã£ãšäœ¿ããŠããŸã çæã«ããŠã»ãããšããissueã¯ãã https://github.com/cli/cli/issues/5924 PATãšç°ãªããæš©éå¶åŸ¡ã¯ã§ããªã èªååç®çã§ããã°PATã䜿ã ãããã« ä»åã¯PATã䜿ããªãGitHubã®ã¢ã¯ã»ã¹æ¹æ³ã«ã€ããŠç޹ä»ããŸããã ãã®æ©äŒã«PATã®ç®¡çè² æ
ãªã©ãèæ
®ããŠãOAuthèªèšŒã§ã®GitHubã¢ã¯ã»ã¹ã詊ããŠã¿ãã®ã¯ãããã§ããããã
ã¯ããã« Goã®Webãã¬ãŒã ã¯ãŒã¯ãšããŠèåãªãã®ã«GinããããŸãã Ginã«ãããŠHTTPãªã¯ãšã¹ããåãæ±ãã«ã¯gin.Contextåã®æ§é äœãåãæ±ããŸãããããããªããšãªã䜿ããšå±éºãªäœ¿ãæ¹ãããããªããããæ³šæãå¿
èŠãšããã話ã§ãã äœãšãªãæžããŠããã® Ginã§DBã¢ã¯ã»ã¹ããã¢ããªãæžãããšããŠãããOpenTelemetry(OTEL)ãå
¥ãããããªèšå®ãå
¥ããããšããŠããŸããã äž»ãªæµããåãåºããšä»¥äžã®ããã«ãªããŸããå®éã¯database/sqlçŽæ¥ã§ã¯ãªããŠORMçµç±ã ã£ããããã¡ã€ã«ãåãããŠãããããŸãã db, err := sql.Open('.....') r := gin.New() // OTELã§å¿
èŠãšæžãããŠããã®ã§è¿œå r.ContextWithFallback = true r.POST('/hoge', func(ctx *gin.Context) { // ~ ãã©ã¡ãŒã¿åãåºãåŠç ~ tx, err := db.BeginTx(ctx); // ~ äœããã®åŠç ~ // ~ Commit or Rollback ~ ctx.JSON(...) }); r.ContextWithFallback = true ãOTELã®ããã«è¿œå ãããã®ã§ãããã¯Ginå
¬åŒã®OTELåããµã³ãã«ãåèã«ãããã®ã«ãªããŸãã https://github.com/gin-gonic/examples/tree/master/otel çŸåšã¯READMEãæŽæ°ãããŠããã This configuration is necessary for the example to work but may not be ideal for production use. ãšæ¬çªåãã§ã¯ãªãããšãæç€ºãããŠããŸãã å±ãªããã€ã³ã gin.Context ã¯Goæšæºã® context.Context ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŠããã®ã§ã context.Context ãšããŠæ¯ãèãããšãã§ããŸãã ããã©ã«ãã§ã¯HTTPãªã¯ãšã¹ãã®ããŒã¿ãæãããContextWithFallbackãªãã·ã§ã³ãæå¹ã«ããããšã§ãªã¯ãšã¹ãã®ããŒã¿ãåŒãç¶ãâŠã®ã§ããã åå䜿ãã¹ãã§ã¯ãããŸãã ã Goæšæºã® context.Context ã¯ã¹ã¬ããã»ãŒãã§ããããšãæåŸ
ãããŸããã gin.Context ã¯ããã§ã¯ãããŸããã gin.Context ã¯Ginå
éšã§ sync.Pool ã䜿ã£ãŠããŒãªã³ã°ãããããã«å®è£
ãããŠãããäžèº«ãæ¶ããŠåå©çšãããŸãããããã£ãŠã ãã³ãã©é¢æ°ã®äžã§Contextãæž¡ãããcancelãåŸ
ã€readåŠç äžèšäŸã ãšdatabase/sqlãåŸ
〠ginãContextã®äžèº«ãæ¶å»ããããšããwriteåŠç ãç«¶åããããšã«ãªããŸããããã¯ãã¹ãæã« go test -race ãªãã·ã§ã³ãä»ããŠå®è¡ãããšãrace detectorãåå¿ããããšã§æ€åºããããšãã§ããŸãã æ£ãã㯠gin.Context ã®å
éšã«ãã Request.Context() ãåãåºãã°è¯ãã§ãããã¡ã㯠net/http ã«ãã£ãŠäœæããããã®ã§ãããåå©çšãããããšã¯ãããŸããã Echoãªã©ä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ãåããããªå®è£
æ¹æ³ãšãªã£ãŠããŸãã r.POST('/hoge', func(ctx *gin.Context) { // gin.Contextããhttp.Requestã®ã³ã³ããã¹ããåãåºã rCtx := ctx.Request.Context() ... tx, err := db.BeginTx(rCtx); } ãªã¯ãšã¹ãã®ã©ã€ããµã€ã¯ã« äžèšã«ããGinç¹æã®åé¡ã¯è§£æ¶ãããŸããããããããªã¯ãšã¹ãã®ContextãåŒãç¶ãã§ããã®ããšããåé¡ãå¥éååšããŸãã ãªã¯ãšã¹ãã®Contextã¯HTTPã³ãã¯ã·ã§ã³åæã«ãããã£ã³ã»ã«ããããããDBã«æž¡ããšæªã³ãããã®ãã©ã³ã¶ã¯ã·ã§ã³ãããã°ããŒã«ããã¯ãããå¯èœæ§ããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ã«ãããŸãããã³ãã¯ã·ã§ã³ãåããŠãåŠçãç¶è¡ããããšããå Žåã«ã¯ãå¥ã®Contextãäœæããå¿
èŠããããŸãã r.POST('/hoge', func(ctx *gin.Context) { // ã³ã³ããã¹ããåŒãç¶ãããæ°ããã³ã³ããã¹ããäœã nCtx := context.Background() ... tx, err := db.BeginTx(nCtx); } ãã ãããã§ã¯Contextã«å«ãŸããå€ãåæåãããããšã«ãªããŸãã ããã§ã¯Contextçµç±ã§Ginã®ããŒã¿ã«ã¢ã¯ã»ã¹ããåŠçãããšãã° OTELã®middlewareã§Contextã«å
¥ãããã¬ãŒã¹IDãããšã«Spanãäœæ middlewareã§Contextã«å
¥ãããªã¯ãšã¹ãIDããã°åºåãã ã®ãããªæ©èœã䜿ããªããªã£ãŠããŸããŸãã ãã®ãããªå Žåã¯ããã£ã³ã»ã«ã®ã¿åŒãç¶ããªãããã«ããŸãã(èŠGo 1.21+) r.POST('/hoge', func(ctx *gin.Context) { // cancelãåŒãç¶ããªãã³ã³ããã¹ããäœæ nCtx := context.WithoutCancel(ctx.Request.Context()) ... tx, err := db.BeginTx(nCtx); } ãã®ãŸãŸã ãšäžåã®ãã£ã³ã»ã«åŠçããªããªããŸããå®å
šã®ããèªåã§ãã£ã³ã»ã«åŠçãå
¥ãããå ŽåãWithoutCancel()ããŠããWithCancel()ããã°ããã§ãããã r.POST('/hoge', func(ctx *gin.Context) { // æ¢åcancelãç¡å¹åããŠããcancel远å nCtx, cancel := context.WithCancel(context.WithoutCancel(ctx.Request.Context())) defer cancel() ... tx, err := db.BeginTx(nCtx); } ããã§å€ã¯åŒãç¶ãã€ã€ããã£ã³ã»ã«äŒæ¬ããåãé¢ãäºãã§ããŸãã ãããã« Ginã® gin.Context ã¯ã¹ã¬ããã»ãŒãã§ã¯ãããŸããã context.Context ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŠããããšããåéãããã¡ãªã®ã§ããã context.Context ãšããŠæ±ããªãããã«ããŸãããã ãŸãã¢ããªã±ãŒã·ã§ã³èŠä»¶ã«ãã£ãŠã¯ããã£ã³ã»ã«ã®äŒæ¬ãæ¢ãããããªå®è£
ãå¿
èŠãšãªãããšããããŸãã ã¿ãªãããæ³šæããŠããã ããã°ãšæããŸãã
ã¯ããã« ããã«ã¡ã¯ããããã£ã®å±±ç°ã§ãã AWSã®Elastic Container Service(ECS)ã䜿ã£ãŠã·ã¹ãã ãæ§ç¯ããéãæ©èœè¿œå ãè² è·ã®å€åã«å¿ããŠãµãŒãã¹æ§æã倿Žããå¿
èŠãçããããšããããŸããç¹ã«å€æ°ã®ãµãã·ã¹ãã ãããªããããªæ§æã§ã¯ãããã³ããšã³ãå¯ãã®ãµãŒãã¹ã®èŠä»¶ã«ãã£ãŠéä¿¡å
ã倿Žããããšãå°ãªããããŸããã ãã®èšäºã§ã¯ãã®ãããªç¶æ³ã«æè»ã«å¯Ÿå¿ã§ããæ§ææ¹æ³ã«ã€ããŠèå¯ããŸãã åºæ¬æ§æã®èª²é¡ æšæºçãªECSããŒã¹ã®æ§æã¯ä»¥äžã®ããã«ãªãããšæããŸãã ãã®æ§æã§ã¯ãé·æéçšãèããå Žåã«ä»¥äžã®ãããªèª²é¡ããããŸãã ããã³ããšã³ãã ãæ§æãç°ãªã ECSã«ã¢ã¯ã»ã¹ããããã«ã¯ALBãå¿
èŠãªã®ã§ãALB/ECSã¯ã¯ã³ã»ããã§èããã å€éšã¢ã¯ã»ã¹ãå¿
èŠãªéšåã¯PublicãªALBã«ããå¿
èŠããããããã ãæ§æãå€ãã ããã³ããšã³ãã®å段ã«ã·ã¹ãã 远å ãè¡ããããããªå Žåãã€ã³ãã©æ§æã«å€§ããªå€æŽãå
¥ã£ãŠããŸã Terraformã§ç®¡çããŠããå Žåãããã³ããšã³ãã ãã¢ãžã¥ãŒã«æ§æã倧ããå€ããå¿
èŠãçããå Žåããã ããã³ããšã³ãã®éšåã«ãã©ã€ããŒãAPIãçãããããåŸãªãããšããç¶æ³ã§åä» äžåºŠã€ã³ã¿ãŒãããã«åºãå¿
èŠãçãã NAT GWã®IPãèš±å¯ãããªã©ã®åŸ®åŠãªå¯Ÿå¿ãå¿
èŠ ããã³ããšã³ãã®ALBã ãè€æ°ã®åœ¹å²ãæã£ãŠãã ECSã«å¯ŸããALBã®åœ¹å²ã¯çŽç²ãªè² è·åæ£è£
眮ãã€ãŸãã¹ã±ãŒãªã³ã°ã«å¯Ÿå¿ããããã®ãã® ããã³ããšã³ãã ãã¯ãã¹ããšã®ã«ãŒãã£ã³ã°ãªã©ããªããŒã¹ãããã·ãšããŠã®æ©èœãæã€å¯èœæ§ããã ã€ãŸããããªãã¯å
¬ééšåã ããã€ã³ãã©æ§æäžãç¹æ®ãªæ±ãããããŠããããšã«ãªããŸãã ããã解決ããããã«ã¯ã以äžã®ããã«ããããªããŸãã åžžã«ALB/ECSã1ã»ããã«ããŠãã¹ãŠãã©ã€ããŒããµããããã«èšçœ®ããããšãšããå¥éå
¬éçšã®ãªããŒã¹ãããã·å°çšALBãç«ãŠãŸããå
¬éèŠä»¶ã¯ãªããŒã¹ãããã·çšã®ALBã«éçŽãããã®ã§ãåãµãã·ã¹ãã åŽã¯æ°ã«ããå¿
èŠããªããªããŸãã ã§ãã ALBã®ã¿ãŒã²ããã«ALBãæå®ã§ããªã ã®ã§ããã®æ§æãå®çŸããããšã¯ã§ããŸããããŸãäºéã®ALBãå®å
šã«ç¡é§ã§ããããŠã©ãããŸããããã æ§ææ¡ ãªããŒã¹ãããã·/BFFã®èšçœ® å€å
žçãªWeb3å±€æ§æã®ããã«ããªããŒã¹ãããã·(Apache/nginx)ãçšæããŸããæ§æã«ãã£ãŠã¯BFFã®ãããªãã®ã«ãªãããšãããã§ãããã ãããªãã¯å
¬éã®è²¬åã¯ããã«éçŽããŸãã Pros å
¬éã«é¢ãã責åã¯åé¢ã§ããè£åŽã®æ§æã¯èªç± Apache/nginxã®æ©èœãå©çšã§ãããããè€éãªã«ãŒãã£ã³ã°ãã¢ã¯ã»ã¹å¶åŸ¡ããã£ããšããŠã察å¿ã§ãã æ§æãšããŠçè§£ã¯ãããã Cons ãªãœãŒã¹ãå¢ãã ãªãããçšECSãå¢ããŠããŸã ã€ã³ãã©ã³ã¹ããéçšã³ã¹ããå¢ãã ALBã®æ©èœãšãªãããã®æ©èœãéè€ãã é©çšã§ããããªã±ãŒã¹ å€å
žçã¢ããªãç§»æ€ããŠããã±ãŒã¹ ã¢ã¯ã»ã¹å¶åŸ¡ãè€éã§ãApache/nginxãå¿
èŠã«ãªãã±ãŒã¹ éçã³ã³ãã³ãã®é
ä¿¡ãã¢ããªå€ã§å¿
èŠã«ãªãã±ãŒã¹ CloudFront VPC Origins CloudFrontã䜿çšããåæãšãªããŸãã CloudFront VPC Originsã䜿ããšCloudFrontããVPCå
éšã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸããPublic ALBãäžèŠãšãªããALB/ECSã¯ãã¹ãŠãã©ã€ããŒããµããããã«çœ®ããããã«ãªããŸãã Pros Public ALBãäžèŠ IPv4ã¢ãã¬ã¹èª²éãæžããã IPv4ã¢ãã¬ã¹çŽæ¥ã¢ã¯ã»ã¹ã«ããã¹ãã ã»äžæ£ã¢ã¯ã»ã¹ãèããªããŠè¯ããªã Cons CloudFrontãããšããšäœ¿ã£ãŠããªãå Žåã¯ã³ã¹ãå¢ã«ãªã£ãŠããŸã ã«ãŒãã£ã³ã°ãCloudFrontã§è¡ãããšã«ãªã CloudFrontèªäœã®æ¯ãåãæ©èœã¯ALBã«æ¯ã¹ãŠããªãå°ãªã HTTPããããªã©ã®æ¡ä»¶ãå
¥ããå ŽåãCloudFront Functionsã§é 匵ãããšã«ãªã ALBç¹ææ©èœãäžéšäœ¿ããªã OIDC飿ºæ©èœãªã© é©çšã§ããããªã±ãŒã¹ CloudFrontãæ¢ã«äœ¿ã£ãŠããã±ãŒã¹ ã«ãŒãã£ã³ã°èŠä»¶ãè€éã§ãªããCloudFront Functionsã§ã«ããŒã§ãã OIDC飿ºãªã©ãå¿
èŠãªã Service Connect ãµãŒãã¹ã¡ãã·ã¥ã©ã€ã¯ãªãµãŒãã¹ã§ããService Connectã«ããECSééä¿¡ãè¡ããŸãã Service Connectã䜿ããšãåECS Taskã¯ãµã€ãã«ãŒã³ã³ãããšããŠEnvoy Proxyãèªåæ¿å
¥ãããŸããåECS Serviceã¯Cloud Mapã«ç»é²ãããServiceéã¯Cloud Mapäžã®ç»é²åã§ã¢ã¯ã»ã¹ããå®éã®éä¿¡ã¯Envoy Proxyã«ããã«ãŒãã£ã³ã°ãããããã«ãªããŸãã åŸæ¥ã¯Blue/Greenãããã€ãã§ããªããšãã課é¡ããããŸããããå
æ¥çºè¡šãããECS built-in Blue/Greenãããã€ã§å¯Ÿå¿ã§ããããã«ãªããŸããã ECS Serviceéã§ããéä¿¡ã§ããªãããããããªãã¯ã¢ã¯ã»ã¹ã«ã¯ALBãå¿
èŠãšãªããŸãã Pros ALBããªããªãåããããã¯ãŒã¯ã¬ã€ãã³ã·ãåæžããã ALBã®åã®ã³ã¹ããæžã Cons Envoy Proxyã®åã远å ã®CPU/RAMãèŠæ±ãã 256 CPU Unit(0.25vCPU)/64MB RAMã远å ããããšãæšå¥š ECS Serviceéã§ããéä¿¡ã§ããªã 宿å®è¡Lambdaãªã©ã§ããã¯ãšã³ãã®ECSãå©ãããªã©ã¯äžå¯èœ ããã³ããšã³ãã®æè»æ§ã¯äœããŸãŸ ããã ãALBã«çžãããŠããŸã é©çšã§ããããªã±ãŒã¹ 以äžãäž¡æ¹æºããã±ãŒã¹ ECS Serviceéã§ããéä¿¡ããªã Envoy Proxyåã®ã³ã¹ãå¢ããããALBåæžåãäžåã å
ã
ECS Taskã®ã¹ããã¯ã«äœè£ããããService Connectã«ããã¹ããã¯ã¢ãããäžèŠãªç°å¢ã§ãªããšããããæºãããªã VPC Lattice(ECSçµ±å) VPC Latticeã¯ä»®æ³ALBãšã§ãåŒã¶ã¹ããµãŒãã¹ã§ããè€æ°ã®ã¢ã«ãŠã³ãã»VPCããŸããã§ããµãŒãã¹ããå®çŸ©ããããã«å¯Ÿããããªã¹ããŒããã¿ãŒã²ããã°ã«ãŒãããèšå®ã§ããŸãã ã¿ãŒã²ããã°ã«ãŒãã«è¿œå ããã®ã¯éåžžã¯ALBãªã©ã§ãããECSçµ±åã®æ©èœã远å ãããããšã«ããçŽæ¥ECS Serviceãã¿ãŒã²ãããšããŠæå®ã§ããããã«ãªã£ãŠããŸãã Pros ALBåæ§ã®æ©èœãæè»æ§ãæã€ VPCã»ã¢ã«ãŠã³ãããŸããã§çµ±äžçãªãµãŒãã¹ç®¡çãå¯èœ Cons é«é¡ ç¶ææéãããŒã¿è»¢éæéãšãALBããé«é¡ é©çšã§ããããªã±ãŒã¹ åäžãµãŒãã¹å
ã§ã®é©çšã¯ã³ã¹ãå¹çãäœããããäŒç€Ÿå
šäœã§VPC Latticeãå°å
¥ãããµãŒãã¹éæ¥ç¶ãVPC Latticeã«ä»»ããã±ãŒã¹ ãŸãšã è€æ°ã®ECSãµãŒãã¹æ§ææ¹æ³ãæ€èšããçµæã以äžã®çµè«ã«è³ããŸããã CloudFrontã䜿ãããªããALB/ECSããã¹ãŠãã©ã€ããŒããµããããã«é
眮ããCloudFront VPC Originsã§æ¥ç¶ããæ§æãå®å®çãã€æè»æ§ãé«ã CloudFrontã䜿ããªããªã©ã®å Žåã¯ãåŸæ¥éãALBããããªãã¯å
¬éããæ¹æ³ãæå¹ Service Connectã¯æåŸ
ã§ãããµãŒãã¹ã§ã¯ãããŸããå¶çŽãå€ããæ
éãªéžæãå¿
èŠãšãªããŸã CloudFrontã䜿ãããšããåæã«ã¯ãªããŸãããVPC Originsã«ããæ§æã¯æçšãªéžæè¢ãšãªãããã§ããæçµçãªæ§æéžæã¯ããµãŒãã¹ã®èŠæš¡ãèŠä»¶ãã³ã¹ãå¶çŽã«ãã£ãŠç°ãªããŸãããæ°èŠæ§ç¯ãªã©ã®éã«æ€èšããŠã¿ãŠã¯ãããã§ããããã
ã¯ããã« 2幎ç®ç€Ÿå¡ã®è€å²¡ãå±±æ¬ã§ãã2025幎8æã®AIåèŠ§äŒ Summer 2025ã«åå ããŠããŸãããè¿å¹Žæ¥éã«é²åããçæAIã®ææ°ååãæŽ»çšäºäŸãåŠã¶çµ¶å¥œã®æ©äŒãšãªããŸããã®ã§ããã®å
容ãšåŸãããç¥èŠãã·ã§ã¢ããããšæããŸãã AIå芧äŒãšã¯ AIåèŠ§äŒ ã¯ãåœå
æå€§çŽã®äººå·¥ç¥èœæè¡ã®å±ç€ºäŒã»ã«ã³ãã¡ã¬ã³ã¹ã§ããäŒæ¥ãç ç©¶æ©é¢ã«ããææ°AIæè¡ã®å±ç€ºãå®è·µçãªæŽ»çšäºäŸã®ç޹ä»ãå°éå®¶ã«ããã»ãããŒãªã©ãè¡ãããç·åã€ãã³ãã§ããåºæ¬çã«å¹Žã«2å以äžïŒæ¥ã»å€ãªã©ïŒéå¬ãããä»åã¯2025幎å€ã®éå¬ãšãªããŸããã ç¹ã«ä»åã®Summer 2025ã¯ãçæAI瀟äŒå®è£
å
幎ããããŒãã«ã2022幎æ«ã«ç»å Žãåžå Žã«å€§ããªåœ±é¿ãäžããChatGPT以éãå®çæã«å
¥ã£ãçæAIã®å®çšçãªæŽ»çšäºäŸã«çŠç¹ãåœãŠãããŠããŸããã ãªãåå ããã®ïŒ ç§ãã¡ã¯ç€Ÿå
ã®ãAIæŽ»çšæšé²ãããžã§ã¯ããã«åå ããŠãããæ¢åæ¥åãžã®AIçµã¿èŸŒã¿ãå éããæ¥åå¹çãåäžãããæŽ»åãããŠããŸããæ¥ã
é²åããAIæè¡ã®ææ°ååããã£ããã¢ããããå
·äœçãªæŽ»çšäºäŸãåŠã¶ããšã§ãèªç€Ÿã§ã®åãçµã¿ã«æŽ»ãããããšèãåå ããŸããã ãããã£ã§ç€Ÿå€ã€ãã³ãã«åå ããã«ã¯ è€å²¡ã»å±±æ¬ãAIã«ãã©ãŒã«ã¹ããã€ãã³ããããã®ã§è¡ã£ãŠã¿ãŠããã§ããïŒã äžåžããããããã²ãã£ãŠã¿ãŠãã ããã åŒç€Ÿã§ã¯æè¡ã€ãã³ããžã®åå ãç©æ¥µçã«æšå¥šããŠãããã»ãšãã©ã®ã€ãã³ãåå ãèªããããŸããåŸãç¥èã瀟å
ã§å
±æããããšã§ã瀟å
å
šäœã®æé·ã«ãã€ãªãããæè¡ååäžãéèŠããç€Ÿé¢šãæ ¹ä»ããŠããã®ã¯ãããã£ã®åŒ·ã¿ã ãšæããŸãã AIå芧äŒçŸå°ã®æ§å AIå芧äŒã¯æ±äº¬åœéãã©ãŒã©ã ã§2æ¥éã«ããã£ãŠéå¬ãããŸããïŒ8æ27æ¥ã»28æ¥ïŒãå
šæ¥çšåå ããæ§ã
ãªã»ãã·ã§ã³ãå±ç€ºãèŠãŠåããŸããã äŒå Žã¯å€§ããåããŠãå±ç€ºãšãªã¢ããšãã»ãããŒãšãªã¢ãã«åãããŠããŸãããå±ç€ºãšãªã¢ã§ã¯100瀟以äžãããŒã¹ãåºå±ããçŽ200çš®é¡ã®ææ°AIæè¡ããœãªã¥ãŒã·ã§ã³ã玹ä»ãããŠããŸãããã»ãããŒãšãªã¢ã§ã¯çŽ40è¬æŒã䞊è¡ããŠéå¬ãããããã«ãã£ã¹ã«ãã·ã§ã³ãè¡ãããŠããŸããã åå è
ã¯äŒæ¥ã®ITæ
åœè
ãçµå¶å±€ããšã³ãžãã¢ãç ç©¶è
ãåŠçãªã©å€å²ã«ãããããã®æ°ã¯2æ¥éã§çŽ8,000åãšã®ããšã§ããAI掻çšãžã®é¢å¿ãé«ãŸã£ãŠããããšã宿ããŸããã åå è
ã®æè£
ã¯ãäŒæ¥ããŽå
¥ãããã·ã£ããTã·ã£ããããžãã¹ã«ãžã¥ã¢ã«ãäžå¿ã§ãäŒå Žã¯å
šäœçã«ã«ãžã¥ã¢ã«ã§ãªãŒãã³ãªé°å²æ°ã§ããã äŒå Žã®æ§å ããã°ã©ã ã»ãããŒãšãªã¢ã§ã¯ãåºèª¿è¬æŒããã¯ãã«ã«ã»ãã·ã§ã³ãäºäŸç޹ä»ãããã«ãã£ã¹ã«ãã·ã§ã³ãªã©ãæ§ã
ãªåœ¢åŒã®çºè¡šãè¡ãããŸãããç¹ã«å°è±¡çã ã£ãã®ã¯åé ã®ãçæAI倧è³2024åè³äŒæ¥ã®ã©ã€ãªã³ãšNECããžãã¹ã€ã³ããªãžã§ã³ã¹ãèªããæ¥çãå€ããçæAIã®äŸ¡å€åµé äºäŸããšé¡ãããã»ãããŒã§ããã çºè¡šè
ã¯æ¥çã代衚ããäŒæ¥ã®CTOãAIç ç©¶è
ããããŠå
é²çã«AIãæŽ»çšããŠããäŒæ¥ã®å®åæ
åœè
ãªã©æ§ã
ã§ãããç¹ã«å®è·µçãªæŽ»çšäºäŸã®çºè¡šã¯ãå
·äœçãªå¹æãå°å
¥æã®èª²é¡ãªã©ãççŽã«èªãããŠãããéåžžã«åèã«ãªããŸããã ã»ãããŒã«ãã£ãŠã¯æºåžã«ãªãæ¥éœãµãã©ã€ãäŒå Žãçšæãããã»ãããŒã倿°ãããŸããã æºå¡ã®ã»ãããŒã®æ§å ã¿ã€ã ããŒãã« QAãšãŒãžã§ã³ããç¬çïŒãã¿ãïŒããã HPå
ãäŒå Žå
¥å£ã§ã¯QAãšãŒãžã§ã³ãã®ãã¿ããããã€ãã³ãã«é¢ãã質åã«åçããŠãããããšãAIã«ãã©ãŒã«ã¹ããã€ãã³ãããã工倫ãæããããŸããã SNSã§ã¯ã #AIåèŠ§äŒ ãã®ããã·ã¥ã¿ã°ã§å€ãã®æçš¿ããããŠãããåã»ãã·ã§ã³ãäŒå Žã®æ§åã»ææ³ãªã©ããªã¢ã«ã¿ã€ã ã§ã·ã§ã¢ãããŠããŸããã äŒå Žå
¥ãå£ã®QAãšãŒãžã§ã³ããç¬çïŒãã¿ãïŒããã äŒæ¥å±ç€ºããŒã¹ å±ç€ºãšãªã¢ã«ã¯åœå
å€ã®AIé¢é£äŒæ¥ã100瀟以äžåºå±ããŠããã補åãã¢ããŠãŒã¹ã±ãŒã¹ç޹ä»ãè¡ãããŠããŸãããç¹ã«å°è±¡çã ã£ãããŒã¹ã玹ä»ããŸãã æ ªåŒäŒç€Ÿ Helpfeel ãŠãŒã¶ãŒãå
¥åããææ§ãªèšèã衚çŸããæå³ãäºæž¬ããæãé©åãªè³ªåãåçããŒãžãææ¡ããæè¡ã§ããã¹ãã«ãã¹ãè¡šèšæºããæŒ¢åã»ã²ãããªã»ã«ã¿ã«ãã®éãã«ãæè»ã«å¯Ÿå¿ããå
¥åéäžã§ãåè£ã衚瀺ããŸããåŸæ¥ã®ããŒã¯ãŒãæ€çŽ¢ããã粟床ãé«ããæ§ã
ãªèšãåãã§ãæ±ããæ
å ±ã«çŽ æ©ãå°éã§ããŸããç¬èªã®ã¢ã«ãŽãªãºã ãšé«éæ€çŽ¢ãšã³ãžã³ãçµã¿åãããFAQããŒãžã®èªå·±è§£æ±ºçåäžãåãåããåæžã«è²¢ç®ããŸãã ããŒã¹ã®æ§åïŒæ¡å
ã®ãå§ãããããã°æ²èŒãå¿«ãæ¿è«ŸããŠãã ãããŸããïŒïŒ æ ªåŒäŒç€Ÿ ãœãã㌠ã³ãŒã«ã»ã³ã¿ãŒãªã©ã®å黿¥åã«ãããŠAIãäžæ¬¡åä»ãæ
åœããããAIãã客æ§ã®åãåããå
容ãèŠçŽãé©åãªç®¡èœéšéãžã®å次ãè¡ã£ãããããšãããµãŒãã¹ã玹ä»ãããŠããŸããã ãããã£ã§ã¯èªç€Ÿã§ã³ãŒã«ã»ã³ã¿ãŒãéçšããŠãããããèªç€Ÿã®èª²é¡ãšç
§ããåãããªããã話ãèãããšãã§ããŸããã ããŒã¹ã®æ§å Findy Team+ GitHubãªã©ã®ããŒã¿ãããšã³ãžãã¢ã®æ¥åç¶æ³ãå¯èŠåãããããå
ã«AIãããŒã¿åæãæ¹åæ¡ãæäŸãããµãŒãã¹ã玹ä»ãããŠããŸããã çŸåšèªç€Ÿã§ããšã³ãžãã¢ã®å·¥æ°å¯èŠåãæ¥åæé©åã«åãå
¥ããŠãããããè²ã
ãšåèã«ãªãã話ãèãããšãã§ããŸããã ããŒã¹ã®æ§å åå ã»ãã·ã§ã³ã®å
容ãšåŠã³ 2æ¥éã§åå ããã»ãã·ã§ã³ã®äžãããç¹ã«å°è±¡ã«æ®ã£ããã®ã玹ä»ããŸãã 1. åºèª¿è¬æŒïŒ éããªãç»å Žãã3幎ãçæAI掻çšã§å€ãã瀟äŒãšä»äºã®ããã¡ æ¥æ¬ãã€ã¯ããœããæ ªåŒäŒç€Ÿã®è¥¿èããã¯åºèª¿è¬æŒã§ãçæAIã誰ã§ã䜿ãã身è¿ãªããŒã«ã«ãªã£ããšåŒ·èª¿ããŠããŸãããæ¥æ¬ã®AIå©çšçã¯46%ãšäœãããšã«ã€ããŠãè§Šããªããããæ¯èŒãããããŸã䜿ããããšãéèŠã ãšèª¬æããŠããŸããã广çãªæŽ»çšã«ã¯å
·äœçãªæç€ºãšå¯Ÿè©±ã«ããæ¹åãå¿
é ã§ãããçæAIã¯ITæŠç¥ã ãã§ãªãã人æè²æãçµå¶æŠç¥ãšããŠå
šç€Ÿçã«åãçµãã¹ãæè¡ã ãšã話ãããŠãŸããã 2. ã»ãããŒïŒ çæAI倧è³2024åè³äŒæ¥ã®ã©ã€ãªã³ãšNECããžãã¹ã€ã³ããªãžã§ã³ã¹ãèªããæ¥çãå€ããçæAIã®äŸ¡å€åµé äºäŸ çæAI倧è³2024åè³äŒæ¥ã®ã©ã€ãªã³æ ªåŒäŒç€Ÿã®å±±å²¡ãããšNECããžãã¹ã€ã³ããªãžã§ã³ã¹æ ªåŒäŒç€Ÿã®è¥æãããç»å£ãããäžè¬ç€Ÿå£æ³äººGenerative AI Japanã®æŒåããã亀ããŠæŽ»çšäºäŸã玹ä»ãããŠããŸããã䞡瀟ã¯ç€Ÿå
ãã£ããã¢ããªéçºãæ¥åããã»ã¹ãžã®AIçµã¿èŸŒã¿ãæšé²ããŠããŸããå°å
¥èª²é¡ãšããŠç€Ÿå¡ã®èãæ¹å€é©ãšçµå¶é£ã®ã³ãããã¡ã³ãã®éèŠæ§ã匷調ããæã广çãªã¢ãããŒãã¯ããŸã䜿ã£ãŠæ¹åãããå§¿å¢ãšç®¡çè·å±€ã®è³åç²åŸã ãšèª¬æããŠããŸãããä»åŸã¯AIãšäººéã®åœ¹å²åå®çŸ©ãæè²å¶åºŠèŠçŽããå¿
èŠã§ãããåŽåäººå£æžå°å¯ŸçãšããŠãAI掻çšãäžå¯æ¬ ãšè¿°ã¹ãŠããŸããã åçç¹ 2æ¥éã®åå ãéããŠãããã€ãã®åçç¹ããããŸããã äºåã®èšç»ãäžååã ã£ã 人æ°ã»ãããŒã¯æ©ãã«åžã確ä¿ãã¹ãã ã£ã RAGãªã©æ³šç®åºŠã®é«ãã»ãã·ã§ã³ã¯ããã«æºåžã«ãªã£ãŠããŸã£ã ã»ãããŒã«æ©ãã«äžŠã¶ã¹ãã ã£ã äºçŽãããŠããŠãæ³å®ä»¥äžã®åå è
ã§ãµãã©ã€ãäŒå Žã«æ¡å
ãããã»ãããŒãè€æ°ãã£ã ã¢ãã€ã«ããããªãŒãæã£ãŠããã¹ãã ã£ã ãŸãšãïŒAIå芧äŒã®äž»ãªåŠã³ 2æ¥éã®AIå芧äŒãéããŠãçæAIãå®é𿮵éãè¶
ããå®çšçãªããžãã¹äŸ¡å€ãåµåºããæ®µéã«å
¥ã£ãããšã宿ããŸããã ç¹ã«å°è±¡çã ã£ã3ã€ã®éèŠãã€ã³ãïŒ ã䜿ããªããåŠã¶ãå§¿å¢ – å®ç§ãæ±ããããæ¥åãžã®å®è·µçãªè©Šè¡é¯èª€ãéèŠ æç¢ºãªç®çèšå® – å
·äœçãªæ¥å課é¡è§£æ±ºãåžžã«æèãã å
šç€ŸçãªAIãªãã©ã·ãŒåäž – å
šç€Ÿå¡ãAIãçè§£ãæŽ»çšã§ããæåã¥ãããç«¶äºåã®æºæ³ æ¥å¹Žãéå¬äºå®ã®AIå芧äŒã§ã¯ããããªãæè¡é²åãæåŸ
ãããŸããåŒãç¶ãææ°ååããã£ããã¢ããããããžãã¹ã«æŽ»ãããŠãããŸãã ãããã£ã§ã¯ãææ°æè¡ã掻çšãããµãŒãã¹éçºã«åãçµããšã³ãžãã¢ãåéããŠããŸãããèå³ã®ããæ¹ã¯ä»¥äžã®æ¡çšãµã€ããããæ°è»œã«ãé£çµ¡ãã ããïŒ ãããã£æ ªåŒäŒç€Ÿæ¡çšæ
å ±
ã¯ããã« ããã«ã¡ã¯ããããã£ã®IWSã§ãã ä»åã¯ç¹å®ã®ãã¡ã€ã«ã倿ŽããããPRã«èŠåãåºãããæ¹ã«ã€ããŠå
±æããŸãã äœãã®åèã«ãªãã°å¹žãã§ãã èæ¯ 1ã€ã®ãã¡ã€ã«ã«æãå ããããä»ã®ãã¡ã€ã«ãå¿ããã«å€æŽããªããšãããªããããžã§ã¯ãã§ã¯ã倿޿Œããã©ãããŠãçããŠããŸããŸãã ç®æ€ã§æŒãããªããã®ç¢ºèªã¯å€§å€ãªã®ã§ããã®ãã³ãã¬ãŒãã«å€æŽãããPRãäœæããããšãã«ãHTMLã«å€æŽãããã©æå³ãããã€ïŒãããã³ãã¬ãŒãã®å€æŽ1ã€ã«ããç¡ããã©æŒããŠãªãïŒãã¿ããã«èŠåããã¯ãŒã¯ãããŒãã€ãã£ãŠã¿ãŸããã åäœã«ã€ã㊠PRãäœæããéã«HTMLããã¡ã€ã«ã«å€æŽããã£ãéã«ã以äžã®ç»åã®çšã«ã³ã¡ã³ããããã¯ãŒã¯ãããŒãåäœããŸãã ã³ãŒã GitHub Actionsã«ä»¥äžã®èšå®ãè¡ããŸãã ã³ãŒãã®è§£èª¬ã«ã€ããŠã¯ä»¥éã®ç« ã§ã話ãããŸãã®ã§ã説æãèªã¿ã€ã€ããèªèº«ã®å©çšçšéã«å¿ããŠæžãæããŠã¿ãŠãã ããã name: Alerts you to template changes on: pull_request: types: [opened, reopened, synchronize] paths: - 'django/templates/process/*/*.htm' - 'django/templates/process/*/*.html' jobs: notify: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: diff_check env: # PRã«ã³ã¡ã³ãããããã«å¿
èŠ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # 倿Žããããã³ãã¬ãŒããã¡ã€ã«ã®ãªã¹ããååŸ changed_file_list=($(git diff --name-only origin/${{ github.base_ref }} HEAD --relative="django/templates/process/" | sed 's|^django/templates/process/||')) # 倿ŽãããŠããªããã³ãã¬ãŒããã¡ã€ã«ã®ãªã¹ããååŸ no_change_file_list=($(comm -23 \ <(find django/templates/process/ -type f | sed 's|^django/templates/process/||' | sort) \ <(printf '%s\n' "${changed_file_list[@]}" | sort) )) # ã³ã¡ã³ãã®æ¬æãäœæ cat << EOF > ./body.txt :warning: ããã»ã¹ç»é¢ãã³ãã¬ãŒããžã®å€æŽããããŸãïŒïŒ :warning: ãã³ãã¬ãŒãã®å€æŽå
容ãæå³ãããã®ãã倿޿Œããç¡ããã確èªããŠãã ããïŒ å€æŽããããã³ãã¬ãŒã $(printf -- '- %s\n' "${changed_file_list[@]}") 倿ŽãããŠããªããã³ãã¬ãŒã $(printf -- '- %s\n' "${no_change_file_list[@]}") EOF # PRã«ã³ã¡ã³ã gh pr comment ${{ github.event.pull_request.number }} -F ./body.txt --repo ${{ github.repository }} ã³ãŒãã®è§£èª¬ åŠçã®æµãã¯ä»¥äžã§ãã ç¹å®ã®ãã¡ã€ã«ã«å€æŽããã£ãéã«çºç« 倿Žããã£ããã³ãã¬ãŒãã®ãªã¹ããååŸ å€æŽããªãã£ããªã¹ããååŸ å€æŽããã£ããã®ããªãã£ããã®ãããããã³ã¡ã³ã 1.ç¹å®ã®ãã¡ã€ã«ã«å€æŽããã£ãéã«çºç« paths ã䜿ãããšã§æå®ãããã¡ã€ã«ã«å€æŽããã£ããšãã ãã¯ãŒã¯ãããŒå®è¡ã§ããŸãããµã³ãã«ã³ãŒã㯠.html ãš .htm ã®ãã¡ã€ã«ã«å€æŽããã£ããšãã ãçºç«ããåŠçãšãªããŸãã ïŒãã paths-ignore ã䜿çšãããšãæå®ã®ãã¡ã€ã«ä»¥å€ã®å€æŽãããã°çºç«ããŸããïŒ åèãµã€ãïŒ https://qiita.com/nacam403/items/3e2a5df5e88ba20aa76a on: pull_request: types: [opened, reopened, synchronize] paths: - '**.html' - '**.htm' # jsé
äžã®hoge_process.jsã察象 paths: - 'django/static/js/*process.js' 2. PRã®å·®åãååŸ # 倿Žããããã³ãã¬ãŒããã¡ã€ã«ã®ãªã¹ããååŸ changed_file_list=($(git diff --name-only origin/${{ github.base_ref }} HEAD --relative="django/templates/process/" | sed 's|^django/templates/process/||')) git diff âname-only ã§å€æŽããã£ããã¡ã€ã«ãååŸãã --relative ãã€ãã£ãŠæå®Path以äžã®ãã¡ã€ã«ã®å€æŽã ããååŸãããããsedã§æŽåœ¢ããŠããŸããïŒdiffçµæã®Pathã®å
±ééšåãåé€ããŠããŸã django/templates/process/ ïŒ sedã®åã« grep ãå
¥ããããšã§å¯Ÿè±¡ã现ããæå®ã§ããããã«ããªããŸã # 倿ŽãããJSãã¡ã€ã«ã®ãªã¹ããååŸãprocess.jsãšindex.jsã®ã¿ã察象ãšãã changed_file_list=($(\\ git diff --name-only origin/${{ github.base_ref }} HEAD --relative="django/static/js/" | \\ grep -E '(process|index)\\.js$' | \\ sed 's|^django/static/js/||' \\ )) 3. 倿Žããªãã£ããªã¹ããååŸ # 倿ŽãããŠããªããã³ãã¬ãŒããã¡ã€ã«ã®ãªã¹ããååŸ no_change_file_list=($(comm -23 \\ <(find django/templates/process/ -type f | sed 's|^django/templates/process/||' | sort) \\ <(printf '%s\\n' "${changed_file_list[@]}" | sort) )) 2ã§åºãã倿Žãã¡ã€ã«ãªã¹ããšãåãPathã®å
šäœã®ãã¡ã€ã«äžèЧã®ãªã¹ããçªãåãããŠå€æŽãããŠããªããã¡ã€ã«ã®ãªã¹ããäœã£ãŠããŸãã comm ã³ãã³ãã«ã€ããŠã¯ä»¥äžããåèãã ãããŸãã åèãµã€ãïŒ https://qiita.com/hypermkt/items/f6388bf72d9b30c6d601 2ã®åŠçã§grepãå
¥ããå Žåã¯ãã¡ãã«ãgrepãå
¥ããã®ãå¿ããªãã§ãã ããã # 倿ŽãããŠããªãJSãã¡ã€ã«ã®ãªã¹ããååŸ no_change_file_list=($(comm -23 \\ <( \\ find django/static/js/ -type f | \\ grep -E '(process|index)\\.js$' | \\ sed 's|^django/static/js/||' | \\ sort \\ ) \\ <(printf '%s\\n' "${changed_file_list[@]}" | sort) )) 倿Žããã£ããã®ããªãã£ããã®ãããããã³ã¡ã³ã # ã³ã¡ã³ãã®æ¬æãäœæ cat << EOF > ./body.txt :warning: process.js or index.js ãã¡ã€ã«ãžã®å€æŽããããŸãïŒïŒ :warning: ããã»ã¹ç»é¢JSãã¡ã€ã«ã¯ç»é¢ããšã«è€æ°ãããŸãã倿޿Œããç¡ããã確èªããŠãã ããïŒ å€æŽããããã³ãã¬ãŒã $(printf -- '- %s\\n' "${changed_file_list[@]}") 倿ŽãããŠããªããã³ãã¬ãŒã $(printf -- '- %s\\n' "${no_change_file_list[@]}") EOF # PRã«ã³ã¡ã³ã gh pr comment ${{ github.event.pull_request.number }} -F ./body.txt --repo ${{ github.repository }} 2ïŒ3ã§äœã£ããªã¹ãã䜿ã£ãŠ body.txt ãäœã£ãŠããŸã printf -- '- ... ã® -- ã¯ãã以éã® – ããªãã·ã§ã³ãšããŠæ±ããªãããšãæå³ããŸãã ä»åã®ã±ãŒã¹ã§ã¯ãMarkdownãšã㊠- ã䜿ãããã®ã ãã©ããã®ãŸãŸã ãšãªãã·ã§ã³ã® - ãšåéããããŠããŸãããšãåé¿ããããã«å
¥ããŠããŸãã ïŒ - ãæããšå®éã« printf: - : invalid option ãšæãããŸããïŒ ããPRãžã³ã¡ã³ãããéã¯ghã³ãã³ãã䜿çšããŠãã ããã WFçºç«ããPRã ${{ github.event.pull_request.number }} ã§æå®ã body.txtã®å
容ãã³ã¡ã³ãããŠããŸãããã ããè€æ°è¡ã®ã³ã¡ã³ãã«ã¯ããã¹ããã¡ã€ã«ãªã©ã§æž¡ãå¿
èŠãããã®ã§æ³šæããŠãã ããã ãããã« ä»åã¯ç¹å®ã®ãã¡ã€ã«ã倿ŽããããPRã«èŠåãåºãããæ¹ã«ã€ããŠç޹ä»ããŸããã 倿޿Œããå€ããªããžããªãªã©ã«æ¯é掻çšããŠã¿ãŠãã ããã
ã¯ããã« ããã«ã¡ã¯ïŒãããã£æ ªåŒäŒç€Ÿæ°å1幎ç®ã®ããŸã 25ã§ãã çŸåšãç§ã¯ã€ã³ãã©ã·ã¹ãã ã°ã«ãŒãã«æå±ãã瀟å
ã§ãªã³ãã¬ãã¹éçšããŠãããã¡ã€ã«ãµãŒããã¯ã©ãŠãäžãžãªãã¬ã€ã¹ããæ¥åãè¡ã£ãŠãããŸãã æ¬èšäºã§ã¯ãAzure Filesã®æ€èšŒæã«ç¹ã«èŠåŽããAD DSèªèšŒã®æå¹åã«ã€ããŠãäžèšã®å
¬åŒããã¥ã¡ã³ãã«æ²¿ãã€ã€ããããã¥ããéšåãè£è¶³æ
å ±ã亀ããŠè§£èª¬ããŸãã Microsoftå
¬åŒããã¥ã¡ã³ããAzure ãã¡ã€ã«å
±æã«å¯Ÿã㊠Active Directory Domain Services èªèšŒãæå¹ã«ããã https://learn.microsoft.com/ja-jp/azure/storage/files/storage-files-identity-ad-ds-enable çè
ãããã£ãŒã« å
¥ç€Ÿææ: 2025幎4æ å
¥ç€Ÿåã®ã¹ãã«: Python æå±ããŒã : ã€ã³ãã©ã·ã¹ãã ããŒã æŠèŠ Azure Filesãšã¯ãMicrosoft AzureãæäŸããŠãããã«ãããŒãžããªSMB/NFSãã¡ã€ã«å
±æãµãŒãã¹ã§ãã æ°ãã«ãµãŒããæ§ç¯ããå¿
èŠããªããæ¯èŒç容æã«æ§ç¯ãããããšãã§ããŸãã Azure Filesã§ã¯ãã¹ãã¬ãŒãžã¢ã«ãŠã³ãããŒã䜿çšããŠãã¡ã€ã«å
±æã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããã»ããAD DSèªèšŒãæå¹åããããšã§ã¢ã¯ã»ã¹å¶åŸ¡ãããããšãå¯èœã§ãã ãã§ã«AD DSã«ããèªèšŒã»ã¢ã¯ã»ã¹å¶åŸ¡ãå©çšããŠãããªã³ãã¬ãã¹ã®ãã¡ã€ã«ãµãŒããAzure Filesã«ãªãã¬ã€ã¹ããå Žåããã®æ©èœãæå¹åããããšã§åŸæ¥ã®ç®¡çæ¹æ³ãç¶æããããšãã§ããŸãã ä»åã¯ããã§ã«Azureäžã§Azure Filesãäœææžã¿ã§ãããšããWindows PCäžã®PowerShellãçšããŠãAD DSèªèšŒãæå¹åãããŸã§ã®æé ãã玹ä»ããŸãã 倧ãŸããªæµãã¯ä»¥äžã®éãã§ãã åææ¡ä»¶ äºåæºå PowerShellã¢ãžã¥ãŒã«ã®ã€ã³ããŒã Azureãžã®æ¥ç¶ åçš®ãã©ã¡ãŒã¿ãèšå® 察象ã®ãµãã¹ã¯ãªãã·ã§ã³ãéžæ ã¹ãã¬ãŒãžã¢ã«ãŠã³ããActive Directoryã«ãã¡ã€ã³åå â»æ¬èšäºã§ã¯ãActive Directoryã®åºæ¬çãªèª¬æã¯çç¥ããŸãã åææ¡ä»¶ ä»åã®èšäºã§ã®åææ¡ä»¶ã¯ä»¥äžã®éãã§ãã Azureäžã«ã¹ãã¬ãŒãžã¢ã«ãŠã³ããäœæããŠãããããã«Azureãã¡ã€ã«å
±æãäœææžã¿ã§ãã ãªã³ãã¬ãã¹ã®Active Directoryããã§ã«æ§ç¯ãããŠãããMicrosoft Entra Connect Syncã¢ããªã§Microsoft Entra IDãšåæãããŠãã PowerShellãå®è¡ããWindows PCã®ãŠãŒã¶ããã¡ã€ã³åå ããŠãããã³ã³ãã¥ãŒã¿ã¢ã«ãŠã³ããäœæããæš©éãæã£ãŠãã Windows PCã®PowerShellã®ããŒãžã§ã³ã5.1以äžã§ãã ããŒãžã§ã³ã®ç¢ºèªæ¹æ³ $PSVersionTable ãå®è¡ããåºåçµæã® PSVersion ã 5.1 以éã«ãªã£ãŠããã°OKã§ãïŒ Windows PCã«ã€ã³ã¹ããŒã«ãããŠãã .NET Frameworkã®ããŒãžã§ã³ã4.7.2以äžã§ãã ããŒãžã§ã³ã®ç¢ºèªæ¹æ³ Get-ItemPropertyValue -LiteralPath 'HKLM:SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' -Name Release ãå®è¡ãã 461808 以äžã§ããã°OKã§ãïŒ Windows PSã®OSã®ããŒãžã§ã³ãWindows 10 (1809以é)ãŸãã¯Windows 11以éã§ãã Windows 10ã®ããŒãžã§ã³ã®ç¢ºèªæ¹æ³ WindowsããŒ+RãæŒããŸãã 衚瀺ãããããã¡ã€ã«åãæå®ããŠå®è¡ããŠã£ã³ããŠã«winverãšå
¥åããEnterããŒãæŒããŸãã ãWindowsã®ããŒãžã§ã³æ
å ±ããã€ã¢ãã°ã衚瀺ããããããŒãžã§ã³ããšãOSãã«ããã確èªã§ããŸããããã§ãããŒãžã§ã³çªå·ïŒäŸ: 1803, 1809, 22H2ïŒãåãããŸãã äºåæºå ⻠以äžããã¹ãŠWindows PCãã€ã³ã¿ãŒãããæ¥ç¶ãã§ããç°å¢äžã§ããããšãåæãšããŠããŸãã PowerShellGetã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã« ãã€ã³ã¹ããŒã«æé ã PowerShellã管çè
æš©éã§éããæ¬¡ã®ã³ãã³ãã¬ãããå®è¡ããŸã Install-Module -Name PowerShellGet -Force ïŒã€ã³ã¹ããŒã«äžã« NuGetãããã€ããŒãã€ã³ã¹ããŒã«ãããå°ããããã®ã§ Y ãå
¥åïŒ ãã€ã³ã¹ããŒã«ã§ããã確èªããæ¹æ³ã Get-Module -Name PowerShellGet -ListAvailable ãå®è¡ããŠã以äžã®ãããªè¡šç€ºãåºãŠããã°ã€ã³ã¹ããŒã«ã«æåããŠããŸãã Azure PowerShellã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã« ãæºåã ãŸããæ¬¡ã®ã³ãã³ãã¬ãããå®è¡ããŠãPowerShellå®è¡ããªã·ãŒã確èªããŸãããã Get-ExecutionPolicy -List å®è¡çµæã® Process ã CurrentUser ãŸã㯠LocalMachine ã Undefined ã®å Žåã以äžã®ã³ãã³ãã¬ãããå®è¡ããŠæ¬ããã»ã¹äžã®å®è¡ããªã·ãŒãç·©ãç¶æ
ã«ããŠãã ããã Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process ãã€ã³ã¹ããŒã«æé ã æ¬¡ãå®è¡ãããšã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ãããŸãã Install-Module -Name Az -Repository PSGallery -Force ãã€ã³ã¹ããŒã«ã§ããã確èªããæ¹æ³ã Get-InstalledModule -Name Az ãå®è¡ããŠã以äžã®ãããªè¡šç€ºãåºãŠããã°ã€ã³ã¹ããŒã«ã«æåããŠããŸãã Active Directory PowerShellã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã« ïŒä»åã¯Windows11ã®å Žåã®æé ã玹ä»ããŸãïŒ ãã€ã³ã¹ããŒã«æé ã èšå®ã¢ããªãéãããã·ã¹ãã ãã®äžã®ããªãã·ã§ã³æ©èœããžç§»åããŸãã ããªãã·ã§ã³æ©èœã远å ãããã®å³ã«ãããæ©èœã衚瀺ããã¯ãªãã¯ããæ€çŽ¢æ¬ã« RSAT: Active Directory Domain Servicesããã³ã©ã€ããŠã§ã€ããã£ã¬ã¯ããªãµãŒãã¹ ãå
¥åããŸãã åè£ãšããŠäžèšããŒã«ãåºãŠããã®ã§ããã§ãã¯ãå
¥ããŠã次ãžããã¯ãªãã¯ããŸãã 远å ããå
容ã®ç¢ºèªç»é¢ã«é·ç§»ãããããäžèšããŒã«ãå«ãŸããŠããããšã確èªãã远å ããã¯ãªãã¯ããŸãã ã€ã³ã¹ããŒã«ãéå§ãããŸãããªããç§ã®ç°å¢ã§ã¯ã€ã³ã¹ããŒã«å®äºãŸã§ã5~10åã»ã©æéãèŠããŸããã ãã€ã³ã¹ããŒã«ã§ããã確èªããæ¹æ³ã Get-WindowsCapability -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0" -Online ã管çè
æš©éã§å®è¡ããŠã以äžã®ãããªè¡šç€ºãåºãŠããã°ã€ã³ã¹ããŒã«ã«æåããŠããŸãã AzFilesHybridã¢ãžã¥ãŒã«ãããŠã³ããŒã å
¬åŒããã¥ã¡ã³ã ã®ãAzFilesHybridã¢ãžã¥ãŒã«ãããŠã³ããŒããããã«ãããªã³ã¯ãã¯ãªãã¯ãããšãGitHubã®ããŒãžã衚瀺ãããŸãã Assetsã®äžã« AzFilesHybrid.zip ãããã®ã§ãããããŠã³ããŒãããŠãã ããã ããŠã³ããŒããããããã®ãã¡ã€ã«ãå±éããŸãã â» ãã®éãã©ãã«å±éããããèšé²ããŠãããŸããããã€ã³ããŒãããéã«å±éå
ã®ãã¹ã䜿çšããŸã ãã®ä»ã®äºåæºå å¿
é ã§ã¯ãããŸããããä»åActive Directoryäžã«äœæããã³ã³ãã¥ãŒã¿ã¢ã«ãŠã³ãçšã®OUãäœæããŸãïŒä»åã¯ãOUã®äœæã¯å¿
é ã§ã¯ãªãããäœææé ã¯çç¥ããŸãïŒã ãªããOUãäœæããªãã£ãå Žåã¯ãActive Directoryã®ã«ãŒããã£ã¬ã¯ããªã«ã¢ã«ãŠã³ããäœæãããŸãã PowerShellã¢ãžã¥ãŒã«ã®ã€ã³ããŒã Active Directory PowerShellã¢ãžã¥ãŒã«ã®ã€ã³ããŒã 次ã®ã³ãã³ãã¬ãããå®è¡ããŸãã Import-Module -Name ActiveDirectory AzFilesHybridã¢ãžã¥ãŒã«ã®ã€ã³ããŒã ãŸããæ¬¡ã®ã³ãã³ãã¬ãããå®è¡ããæ¬ããã»ã¹äžã®PowerShellå®è¡ããªã·ãŒã Unristricted ã«å€æŽããŸãã Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process 次ã«ãå±éããAzFilesHybridãžç§»åããŸãã cd \path\to\AzFilesHybrid ãã®ãã©ã«ãã®äžã«ããCopyToPSPath.ps1ãã¡ã€ã«ãå®è¡ããŸãã .\CopyToPSPath.ps1 æåŸã«ãAzFilesHybridã¢ãžã¥ãŒã«ãã€ã³ããŒãããŸã Import-Module -Name AzFilesHybrid Azureãžæ¥ç¶ 次ã®ã³ãã³ãã¬ãããå®è¡ããŸãã Connect-AzAccount -Tenant "<ããã³ãID>" â» ãããã䜿ãã®Azureã1ã€ã®ããã³ãã®ã¿ã®å Žå㯠-Tenant "<ããã³ãID>" ããªããŠãå®è¡ãæåããŸããã2ã€ä»¥äžã®ããã³ãã䜿çšããŠããå Žåã¯æ··åãé¿ããããã« -Tenant "<ããã³ãID>" ãã€ããŠå®è¡ããŸããã å®è¡ãããšã察話åãã©ãŠã¶èªèšŒãèµ·åãããããèªåã®Microsoftã¢ã«ãŠã³ãã§ãã°ã€ã³ããŸãããã ãããã³ãIDã®èª¿ã¹æ¹ã AzureããŒã¿ã«äžã§Microsoft Entra IDãéããšæŠèŠã®ããŒãžã«ããã³ãIDã衚瀺ãããŸã åçš®ãã©ã¡ãŒã¿ã®èšå® ãŸããAzure Filesãæ§ç¯ãããµãã¹ã¯ãªãã·ã§ã³ã®IDããªãœãŒã¹ã°ã«ãŒãã®ååãã¹ãã¬ãŒãžã¢ã«ãŠã³ãã®ååã確èªããŸãã 察象ã®ã¹ãã¬ãŒãžã¢ã«ãŠã³ããAzureããŒã¿ã«äžã§éããšãæŠèŠã«ãªãœãŒã¹ã°ã«ãŒãåããã³ãµãã¹ã¯ãªãã·ã§ã³IDãèšèŒãããŠããŸãã äžèšã®æ
å ±ãããšã«ã以äž3ã€ã®ãã©ã¡ãŒã¿ãèšå®ããŸã $SubscriptionId = "<ãµãã¹ã¯ãªãã·ã§ã³ID>" $ResourceGroupName = "<ãªãœãŒã¹ã°ã«ãŒãå>" $StorageAccountName = "<ã¹ãã¬ãŒãžã¢ã«ãŠã³ãå>" 次ã«ãSAMã¢ã«ãŠã³ãå (äœæããã³ã³ãã¥ãŒã¿ã¢ã«ãŠã³ãã®åå)ãæ±ºããŸãã SAMã¢ã«ãŠã³ãåã®åœåã®éã®å¶é 15æå以å
ã§ã䜿çšã§ããæåã¯a~zãA~Zã0~9ããã³äžéšã®èšå·ïŒ-ã_ãªã©ïŒã§ã 次ã®èšå·ã¯äœ¿çšã§ããŸãã "/ \\ [ ] : ; | = , + * ? < > 以éã«èšèŒã®ã³ãã³ãã¬ãã Join-AzStorageAccount ãå®è¡æããã®SAMã¢ã«ãŠã³ãåã®åŸãã« $ ãä»ããããããã®æ®µéã§ã¯æ«å°Ÿã« $ ã¯ä»ããªãã§ãã ãã SAMã¢ã«ãŠã³ãåãæ±ºå®ããããæ¬¡ãå®è¡ããŸãã $SamAccountName = "<SAMã¢ã«ãŠã³ãå>" ç¶ããŠãActive Directoryã«äœæããã¢ã«ãŠã³ãã®ã¿ã€ããéžæãããã©ã¡ãŒã¿ãèšå®ããŸãã $DomainAccountType = "<ComputerAccount ãŸã㯠ServiceLogonAccount>" ãªããããã©ã«ãã§ã¯ ComputerAccount ãšãªã£ãŠãããç¹å¥ãªäºæ
ããªãå Žå㯠ComputerAccount ãéžæããŸãããã æåŸã«OUãäœæããå Žåã¯ããã®æ
å ±ããã©ã¡ãŒã¿ãšããŠèšå®ããŸã $OuDistinguishedName = "OU=(ããªããèšå®ããOUå),DC=~,DC=~" äŸãã°ãäœæããOUã®ååã AzureFiles ãActive Directoryã®ãã¡ã€ã³åã nifty.example.com ã ã£ãå Žåã¯ã $OuDistinguishedName="OU=AzureFiles,DC=nifty,DC=example,DC=com" ãšããŸãã 察象ã®ãµãã¹ã¯ãªãã·ã§ã³ãéžæ 次ã®ã³ãã³ãã¬ãããå®è¡ããŸã Select-AzSubscription -SubscriptionId $SubscriptionId å®è¡åŸã以äžã®ãããªè¡šç€ºãåºãŠããã°OKã§ã ã¹ãã¬ãŒãžã¢ã«ãŠã³ããActive Directoryã«ãã¡ã€ã³åå ããã æ¬¡ã®ã³ãã³ãã¬ãããå®è¡ããŸãã ïŒãã ããOUãäœæããŠããªãå Žåã¯ã -OrganizationalUnitDistinguishedName $OuDistinguishedName ã®éšåãåé€ããŠããå®è¡ããŸãããïŒ Join-AzStorageAccount -ResourceGroupName $ResourceGroupName` -StorageAccountName $StorageAccountName` -SamAccountName $SamAccountName` -DomainAccountType $DomainAccountType` -OrganizationalUnitDistinguishedName $OuDistinguishedName` â» äžèšã®ã³ãã³ãã§ã¯ãActive Directoryã«Azureã®ãµãŒãã¹ã¢ã«ãŠã³ãããã³ã³ãã¥ãŒã¿ã¢ã«ãŠã³ããšããŠäœæããã¡ã€ã³åå ãããŸãããã®ããããã®ã³ãã³ããå®è¡ãããŠãŒã¶ã«ã¢ã«ãŠã³ããäœæããæš©éãã€ããŠããªããšãå®è¡ã«å€±æããŸãã çµããã« Azure Filesã®AD DSèªèšŒã®æå¹åã¯AzureããŒã¿ã«ããGUIæäœã§èšå®ããããšãã§ãããPowerShelläžã§ã®æ§æãå¿
èŠãšãªããŸãã ä»åç§ã¯æ§æãããŠããäžã§ãæš©éã®ç¢ºèªãã¢ãžã¥ãŒã«ã®ã€ã³ã¹ããŒã«ãAzureãžã®æ¥ç¶ãªã©éæã§èºããŠããŸããŸããã ç§ãšåæ§ã«èºããŠããæ¹ãããã£ããããŸããããæ¬èšäºãåé¡è§£æ±ºã®ç³žå£ã«ãªãã°å¹žãã§ãã ãã®èšäºãèªãã åŠçããã«åã㊠ç§ã®åŠçæä»£ã®å°æ»ã¯æ
å ±ç³»ã§ã¯ãªãããŸãAWSã¯ãããããŠè§Šã£ãããšããã£ããã®ã®Azureã¯å
šãè§Šã£ãããšããªãã£ãããã詊è¡é¯èª€ã®é£ç¶ã§ããã ã§ãããç²ã匷ãåãçµãã ããšã§ããã®èšäºãå·çã§ããçšåºŠã«ã¯çè§£ãæ·±ããããšãã§ããŸããã ãã®èšäºã¯25æ°åãªã¬ãŒããã°ã®æåŸã®æçš¿ãšãªããŸãã æåŸã®èšäºã«ããŠã¯ããªãå°éçãªå
容ãšãªã£ãŠããŸããŸããããå°ãã§ããããã£ã«èå³ãæã£ãŠããã ãããå¬ããã§ãïŒ
ã¯ããã« å§ããŸããŠãããã«ã¡ã¯ïŒæ°åäžå¹Žç®ã®ç³ç°ãšç³ããŸãã ãçè
ãããã£ãŒã«ã å
¥ç€ŸææïŒ2025幎4æ å
¥ç€Ÿåã®ã¹ãã«ïŒPythonã»ãããã¯ãŒã¯ã»AWSæªçµéš æå±ããŒã ïŒã€ã³ãã©ã·ã¹ãã ããŒã çŸåšç§ã¯ãã¯ã©ãŠãã³ã¹ãã®ç®¡çãç®çãšããŠãã³ã¹ããååŸã»æŽåœ¢ããã·ã¹ãã ã®æ§ç¯ã«æºãã£ãŠããŸãã ä»åã¯ãæ¬ã·ã¹ãã ã«ã€ããŠãæ¥å玹ä»ã亀ããªãããŸãšããŠãããããšæããŸãã ãŸããæ¬ã·ã¹ãã ã¯AWSäžã«æ§ç¯ããŠããŸãããç§ã¯å
¥ç€ŸãããŸã§AWSã«ã»ãšãã©è§ŠããããšããããŸããã§ããããããªç§ãèšèšããå®è£
ãŸã§ãåãçµãäžã§ãåŸãåŠã³ãæ°ã¥ãããŸãšããŠããŸãã ä»åŸAWSã«åãçµãããšèããŠããæ¹ãç¹ã«ç§ãšåãããã«æªçµéšããã¹ã¿ãŒãããçããã®åèã«ãªãã°å¹žãã§ãã ã¯ã©ãŠãã³ã¹ãç®¡çæ¥å çŸåšãããã£ã§ã¯ãè€æ°ã®ã¯ã©ãŠããµãŒãã¹ãå©çšããŠããŸãã ç§ãã¡ã®ããŒã ã§ã¯ãã¯ã©ãŠããµãŒãã¹ã§çºçããã³ã¹ããååŸã»å å·¥ããããšã§ãäŒèšåŠçã«å¿
èŠãšãªããã©ãŒãããã«æŽåœ¢ããŠããŸãã å å·¥ã®äž»ãªåŠçãšããŠã¯ã以äžã®ãããªãã®ããããŸãã å建ãŠã³ã¹ãã®ç®åº(ãã«å»ºãŠã³ã¹ããšTTSã¬ãŒãã®ä¹ç®) é
賊åŠç(ã¯ã©ãŠãã¢ã«ãŠã³ããšç€Ÿå
éšçœ²æ
å ±ãšã®çŽã¥ã) äŒèšçšãã©ãŒããããžã®é©å ç§ã®é
å±åœæãããããäŒèšçšãã¡ã€ã«ã®äœæãããŒã«æäœæ¥ãå€ããå€ãã®å·¥æ°ãçºçããŠããŸããããŸããè€éãªã³ã¹ããæåã§æŽçããã®ã§ã人çãã¹ã®ãªã¹ã¯ãååšããŠããŸããã ä»åç§ã¯ãäžèšèª²é¡ãæ©æã«è§£æ±ºããããã®ãšã³ãã³ã¹ã«åãçµã¿ãŸããã ã·ã¹ãã ã«ã€ã㊠ä»åäœæããã·ã¹ãã ã¯ãAWSã®ã³ã¹ããååŸããäŒèšçšãã¡ã€ã«ãåºåããã·ã¹ãã ã§ãã ã³ã¹ãååŸã»å å·¥äœæ¥ãèªååããããšã§ãå·¥æ°ã®åæžããã³æäœæ¥ã«ãããã¹ã®é²æ¢ãå®çŸããŸãã æ¬ã·ã¹ãã ã¯AWSäžã§æ§ç¯ããæ¢åã®AWSãªãœãŒã¹ã掻çšããªããé²ããŸãã åŠçãã㌠æ¬ã·ã¹ãã ã®åŠçã¯ã倧ãã3ã€ã®ã¹ãããã«åããããŸãã â AWSã®ã³ã¹ãããŒã¿ãååŸ â¡ããŒã¿ãå å·¥ããäŒèšåŠçã«å¿
èŠãªãã©ãŒãããã«æŽåœ¢ããã â¢Excelãã¡ã€ã«ãšããŠS3ã«æ ŒçŽ ãªãœãŒã¹ 䜿çšããAWSãªãœãŒã¹ã¯ä»¥äžã®éãã§ãã S3 AWSã代衚ããã¯ã©ãŠãã¹ãã¬ãŒãžãµãŒãã¹ã§ããã¡ã€ã«ãããªããžã§ã¯ãããšããŠä¿åããŸãã å®äŸ¡ã«ã倧éã®ããŒã¿ãä¿ç®¡ã§ããŸãã Athena Athenaã¯ãSQLæã䜿ã£ãŠS3ã®ããŒã¿ãçŽæ¥åæã§ããã¯ãšãªãµãŒãã¹ã§ãã åŸè¿°ããGlueãäœæããããŒã¿ã«ã¿ãã°ãåç
§ããããšã§ãS3ã®ã©ã®ãã©ã«ãã«ãã©ã®ãããªããŒã¿åœ¢åŒã®ãã¡ã€ã«ãããããææ¡ããŸãã Glue Glueã¯ããµãŒããŒã¬ã¹ãªããŒã¿çµ±åãµãŒãã¹ã§ãã察象ããŒã¿ã®çš®é¡ãèªåçã«ç¹å®ããããŒã¿ã«ã¿ãã°ãäœæããŸããAthenaã¯ããã®ããŒã¿ã«ã¿ãã°ãåç
§ããããšã§ãS3ã«ä¿åãããŠããããŒã¿ãçŽæ¥ã¯ãšãªã§ããããã«ãªããŸãã DynamoDB DynamoDBã¯ãæè»ãªããŒã¿æ§é ãæã€NoSQLã®ããŒã¿ããŒã¹ãµãŒãã¹ã§ãããç®çã®ããŒã¿ã«å¯ŸããŠããªç§åäœã§ã®é«éã¢ã¯ã»ã¹ãå¯èœã§ãã Lambda Lambdaã¯ããµãŒããŒã®ç®¡çãªãã§ã³ãŒããå®è¡ã§ããããµãŒããŒã¬ã¹ãªã³ã³ãã¥ãŒãã£ã³ã°ãµãŒãã¹ã§ãã ç¹å®ã®ã€ãã³ãïŒäŸïŒS3ãžã®ãã¡ã€ã«ã®ã¢ããããŒãã»API Gatewayãžã®ãªã¯ãšã¹ããªã©ïŒãããªã¬ãŒãšããŠèªåçã«ã³ãŒããå®è¡ãããŸããä»åã¯ãããŒã¿ã®ååŸããå å·¥ã»ãã¡ã€ã«ã®æ ŒçŽãªã©ã®åŠçãLambda颿°ãšããŠå®è£
ããŸããã Secrets Manager Secrets Managerã¯ãèªèšŒæ
å ±ãAPIããŒãªã©ã®æ©å¯æ
å ±ãå®å
šã«ç®¡çã§ãããµãŒãã¹ã§ãã ã³ãŒãã«çŽæ¥èšè¿°(ããŒãã³ãŒãã£ã³ã°)ãããšã»ãã¥ãªãã£ãªã¹ã¯ãé«ãŸããããªæ©å¯æ
å ±ãäžå
管çããã³ãŒãããå®å
šã«ååŸã§ããŸãã æ§æå³ å
è¿°ãããµãŒãã¹ã䜿çšããŠãã·ã¹ãã ãæ§ç¯ããŠãããŸãã ã¢ãŒããã¯ãã£å³ã以äžã«ç€ºããŸãã æ³šæç¹ãšããŠã¯ãLambdaã®ããªã¬ãŒã¯å¥Lambdaããã®S3ãžã®ãã¡ã€ã«é
眮ãšãªã£ãŠããŸããå ããŠãã³ã¹ããAWSããçŽæ¥APIã§ååŸããã®ã§ã¯ãªããCUR(Cost and Usage Report) [ 1 ] ãèªåã§åºåãããŠããS3ãåç
§ããæ§æã«ãªã£ãŠããŸãã ã³ã¹ãååŸ ã§ã¯ãå®éã®åŠçã®æµãã远ã£ãŠãããŸãã sql_path = os.path.join(os.path.dirname(__file__), 'aws_cost.sql') with open(sql_path, 'r', encoding='utf-8') as f: query = f.read() query = query.replace('{{year}}', str(year)) query = query.replace('{{month}}', str(month)) query = query.replace('{{tts_rate}}', str(tts_rate)) raw = wr.athena.read_sql_query( query, database="test_db", ctas_approach=False, boto3_session=master_session ) ã³ã¹ã(CUR)ã¯ã管çã¢ã«ãŠã³ãã®S3ã«æ ŒçŽãããŠããŸãã SQLã®ã¯ãšãªãã¡ã€ã«ãèªã¿èŸŒã¿ã管çã¢ã«ãŠã³ãã®ã»ãã·ã§ã³ãå©çšããŠAthenaããŒãã«ãåç
§ããŸããã ããã«ãã£ãŠãã¢ã«ãŠã³ãããµãŒãã¹åäœã®çްããè«æ±ããŒã¿ãååŸã§ããŸãã ã³ã¹ãæŽåœ¢ ååŸããããŒã¿ãDF(DataFrame)ã«æ ŒçŽããŠãéèšã»å å·¥åŠçã«é²ã¿ãŸãã éèš è«æ±æžIDãè«æ±å
æ
å ±ãã¢ã«ãŠã³ãIDã§ã°ã«ãŒãã³ã°ããŠãååèšã³ã¹ããæ±ããŸãã éšéæ
å ±ã®çµå åAWSã¢ã«ãŠã³ããã©ã®éšçœ²ã®ç®¡èœãã瀺ãéšéæ
å ±ãçµåããé
賊察å¿ã«åœ¹ç«ãŠãŸãã DFã®Excelãã¡ã€ã«æžã蟌㿠ããŠãå¿
èŠãªããŒã¿ã¯ããã£ãã®ã§ãããããã¯åãã¡ã€ã«ã§å¿
èŠãªããŒã¿ãæœåºããæ®µéã§ãã äœæããäŒèšçšExcelãã¡ã€ã«ã¯ïŒã€ããã®å
2ã€ã¯ã颿°çãçµã¿èŸŒãŸãããã©ãŒããããã¡ã€ã«å
ã®æå®ã®äœçœ®ã«ããŒã¿ã転èšããå¿
èŠããããŸãã ããã§ç§ã¯ãPythonã³ãŒãã§Excelãã¡ã€ã«ãæäœã§ãããopenpyxl [ 2 ] ã®äœ¿çšãèããŠããŸããã OpenPyXLã¯ãPythonäžã§Excelãã¡ã€ã«ãçŽæçã«æäœã§ãã䟿å©ãªã©ã€ãã©ãªã§ãã以äžã®ã³ãŒãã®ããã«ãExcelãã¡ã€ã«ãåã蟌ãã§ãã»ã«ãæå®ããŠæžã蟌ã¿ãèªã¿èŸŒã¿ãè¡ããŸãã format_path = '/tmp/rpa_format.xlsx' output_path = '/tmp/sample1.xlsx' start_row = 11 start_col = 4 wb = openpyxl.load_workbook(format_path) ws = wb["ã·ãŒã1"] ws['I2'] = 'äŒèšã³ãŒã' ws['I4'] = 'ã€ã³ãã©éšé' for i, row in enumerate(sample1_df.values): for j, value in enumerate(row): cell = ws.cell(row=start_row + i, column=start_col + j) cell.value = value wb.save(output_path) 6~8è¡ç®ã®ããã«ã»ã«ãçŽæ¥æå®ããããšãã9~12è¡ç®ã®ããã«foræãåãããšã§ãæå®ã®äœçœ®(D11)ãã1ã»ã«ãã€æžã蟌ãããšãå¯èœã§ãã ãã£ããå®è¡ããŠã¿ãŸãã REPORT RequestId: cfc5c952-37f3-4d2f-bfac-c5fa22fd7438 Duration: 300000.00 ms Billed Duration: 300000 ms Memory Size: 256 MB Max Memory Used: 256 MB Status: timeout timeoutãšã©ãŒãçºçããŸãããã¡ã¢ãªãè¶³ããªãã£ãããã§ãã ã¡ã¢ãªãå¢ãããšããã REPORT RequestId: 5377a577-dd9b-47a4-b938-48b8f77efa1c Duration: 21806.13 ms Billed Duration: 21807 ms Memory Size: 2048 MB Max Memory Used: 584 MB Init Duration: 5069.78 ms åé¡ãªãåŠçå®äºã§ããŸããã ä»åã¯ã¡ã¢ãªã®å¢éã§å¯Ÿå¿ããŸããããåŠçèªäœããã£ãšè»œããããå Žåã«ã¯ãlxml [ 3 ] ããšããã©ã€ãã©ãªãååšããŸãã OpenPyXLã¯ãPythonäžã§Excelãã¡ã€ã«ãçŽæçã«æäœã§ãã䟿å©ãªã©ã€ãã©ãªã§ãããExcelãã¡ã€ã«ãæ§æããXMLãã¡ã€ã«å
šäœãã¡ã¢ãªã«èªã¿èŸŒãç¹æ§äžã倧éã®ããŒã¿ãæ±ãéã«ã¯ã¡ã¢ãªäžè¶³ãã¿ã€ã ã¢ãŠãã®åå ã«ãªãããšããããŸãã 察ããŠlxmlã¯ãã¹ããªãŒãã³ã°åŠçã«å¯Ÿå¿ããŠããããã¡ã€ã«å
šäœãã¡ã¢ãªã«èªã¿èŸŒãããšãªããå¿
èŠãªéšåã ããé æ¬¡åŠçããããšã§ãã¡ã¢ãªäœ¿çšéãæãã€ã€é«éãªããŒã¿åŠçãå¯èœã«ããŸãã ããããäžåºŠè©ŠããŠã¿ããšãããåºåãã¡ã€ã«ãå£ããŠããŸããŸããã åå ã調æ»ãããã£ãã®ã§ãããã¹ã±ãžã¥ãŒã«ã®éœåäžèŠéããŸããããã ãã¡ã€ã«åºå åºå äœã¯ãšããããäŒèšçšãã¡ã€ã«ã宿ããŸããïŒS3ã«ã¢ããããŒãããŠãããŸãã sample_files = [ ('/tmp/sample1.xlsx', f's3://{INVOICE_BUCKET_ID}/sample/year={year}/month={month}/sample1.xlsx'), ('/tmp/sample2.xlsx', f's3://{INVOICE_BUCKET_ID}/sample/year={year}/month={month}/sample2.xlsx'), ('/tmp/sample3.xlsx', f's3://{INVOICE_BUCKET_ID}/sample/year={year}/month={month}/sample3.xlsx'), ('/tmp/sample4.xlsx', f's3://{INVOICE_BUCKET_ID}/sample/year={year}/month={month}/sample4.xlsx'), ] for local_file, s3_path in sample_files: wr.s3.upload(local_file=local_file, path=s3_path) ãã¹ãæå®ããäœæããExcelãã¡ã€ã«ãã¢ããããŒãããŠããŸãã åé¡ãªãã¢ããããŒãã§ããŸããïŒããã«ãŠåŠçå®äºãšãªããŸãã ãŸãšã ä»åç§ã¯ãã»ãŒåç¬ã§ã·ã¹ãã ã®èšèšããå®è£
ãŸã§ãæ
åœãããŠããã ããŸãããAWSã®åºç€ãµãŒãã¹ãåŠã³ãªããé²ããäžã§ãç¹ã«IAMã«ããã¢ã¯ã»ã¹å¶åŸ¡ãšãS3ã»Athenaã»Glueã®é¢ä¿æ§ã®çè§£ã«èŠåŽããŸããã åœåã¯ããå€ãã®æ©èœããä»ã¯ã©ãŠããžã®å¯Ÿå¿ãèšç»ããŠããŸããããæãããã«äœæ¥ãé²ãŸããã¹ã±ãžã¥ãŒã«ã倧å¹
ã«ãã蟌ã¿ãŸãããããã§ãæ©èœã«åªå
é äœãã€ããéèŠãªéšåããå®è£
ãé²ããããšã§ããªããšã宿ã«ããã€ããããšãã§ããŸããã ãã®ãããªåçç¹ãããã€ã€ããAWSã«ã€ããŠåŠã³ãäžæµããäžæµãŸã§äžéãã®éçºå·¥çšãçµéšã§ããããšã¯ã倧ããªåç©«ã§ããããã®çµéšã掻ãããä»åŸã®OJTæ¥åã«èšãã§ãããããšæããŸãã åŠçã®çæ§ã«åã㊠å
¥ç€ŸããŠçŽ5ãæãçµã¡ãŸããããããã£ã¯ãç¹ãããã倧åã«ããŠããäŒç€Ÿã§ãããšåŒ·ã宿ããŠããŸãã ã客æ§ãããŒãããŒäŒæ¥æ§ãšã®ç¹ããã¯ãã¡ããã®ããšã瀟å¡ãšäŒæ¥ããŸã瀟å¡å士ã®ç¹ãããéåžžã«åŒ·ãã§ããéšçœ²ãè¶
ããã³ãã¥ãã±ãŒã·ã§ã³ã瀟å
ã€ãã³ããéåžžã«æŽ»çºã«è¡ãããŠããŸãã åãäŒç€Ÿã«ããŠããããŒã ã«ãã£ãŠé°å²æ°ãæåã倧ããç°ãªãã®ãé¢çœããšããã§ããã³ãã¥ãã±ãŒã·ã§ã³ã掻çºãªããŒã ãããã°ãå¹çãéèŠããããŒã ã瀟å
ã€ãã³ãã«ç©æ¥µçã«åå ããããŒã ãªã©æ§ã
ã§ãã äžå£ã«ããšã³ãžãã¢ããšèšã£ãŠãã倿§ãªåæ§ãæã€ã¡ã³ããŒãããããã®åŒ·ã¿ã掻ãããŠæ¥åã«åãçµãã§ããŸãã ãããã£ã®é°å²æ°ããã£ãšç¥ããããšããæ¹ã¯ããã²ã€ã³ã¿ãŒã³ã·ããã«ãåå ãã ãããçãããšãäŒãã§ããã®ã楜ãã¿ã«ããŠããŸãïŒ æ¬¡åã¯ã€ãã«æçµèµ°è
ïŒ ããŸã 25ããã®èšäºããæ¥œãã¿ã«ïŒïŒ åèæç® AWS ã³ã¹ããšäœ¿çšç¶æ³ã¬ããŒããšã¯ – AWS Data Exports ïž openpyxl · PyPI ïž lxml – Processing XML and HTML with Python ïž
ã¯ããã« ãã®èšäºã¯ããªã¬ãŒããã°äŒç»ã25æ°åãªã¬ãŒããã°ã®èšäºãã§ãã ããã«ã¡ã¯ã7æã«ã AWS Summit Japanã¬ã€ã ãã®èšäºã§ãæšæ¶ããŸãããã¯ã§ãïŒ çãããAWSã§EC2ãµãŒããŒãã©ã®ããã«äœæããŠããŸããïŒ ããããã»ãšãã©ã®æ¹ããAWSãããžã¡ã³ãã³ã³ãœãŒã«ã«ãã°ã€ã³ããŠããŠã¹ã§ã¯ãªãã¯ããŠäœæããæ¹æ³ãæãæµ®ãã¹ãã§ããããç§ãå
¥ç€ŸåãŸã§ã¯ããã§ãããããããããäŒç€Ÿã§ã¯ ã³ãŒã ã§ãµãŒããŒãäœæãã管çããŠããŸããã ãªãã§ããããïŒæåã§äœæ¥ãããšäºçްãªãã¹ãèµ·ããããããåŸãã誰ãäœãã©ã®ããã«å€æŽããã®ãã远跡ããããšãé£ããããã§ãã ãã®èšäºã§ã¯ã Terraform ãšããããŒã«ã䜿ããEC2ã€ã³ã¹ã¿ã³ã¹ãã³ãŒãã§ç®¡çããçµéšè«ãå
±æããããšæããŸãã çè
ãããã£ãŒã« å
¥ç€ŸææïŒ 2025幎4æ å
¥ç€Ÿåã®ã¹ãã« çµéšãã: JavaScript, React, Python çµéšãªã: Terraform, AWS çŸåšã®æ
åœïŒ ãµãŒãã¹ã·ã¹ãã ã°ã«ãŒã ç®æš AWSã³ã³ãœãŒã«ã§æåäœæããEC2ã€ã³ã¹ã¿ã³ã¹ãTerraformã®ã³ãŒãã«ç§»è¡ãã ç®æ¬¡ ç°å¢æ§ç¯ EC2ã¢ãžã¥ãŒã«ã®äœæ EC2ã€ã³ã¹ã¿ã³ã¹ã®äœæ æåŸã« 1. ç°å¢æ§ç¯ ãããã£ã§ã¯ããŒã ã§ååããŠéçºããããšãå€ããããã³ãŒããèšè¿°ããåã«ããŸãæåã«è¡ãã¹ãããšã¯ ãé©åãªäœæ¥ç°å¢ã ãæ§ç¯ããããšã§ãã a. S3ãã±ããã®äœæ Terraformã¯ã³ãŒããå®è¡ãããšãçŸåšã®ã€ã³ãã©ã®ç¶æ
ãèšé²ããã terraform.tfstate ãšãããã¡ã€ã«ãããŒã«ã«PCäžã«äœæãããŸãããã®æãããããŒã ã¡ã³ããŒAããµãŒããŒã远å ããã¡ã³ããŒBãããŒã¿ããŒã¹ã®èšå®ã倿Žããå Žåãäºäººã¯ããããå
容ã®ç°ãªã terraform.tfstate ãã¡ã€ã«ãæã€ããšã«ãªããŸãã ãã®ãããªç¶æ³ãç¶ããšãåŸã«ãªã£ãŠã©ããæ¬åœã®ã€ã³ãã©ã®ç¶æ
ãªã®ãåãããªããªã£ãŠããŸããããããããã®ããŒã«ã«PCã§ã¯ãªããããŒã å
šå¡ãå
±éã§ã¢ã¯ã»ã¹ã§ãããªã¢ãŒãã¹ãã¬ãŒãžã«ä¿ç®¡ããå¿
èŠããããŸããç§ãã¡ã®ããŒã ã§ã¯ãAWSã®S3 (Simple Storage Service) ãã±ããã« terraform.tfstate ãã¡ã€ã«ãä¿åããŠããŸãã ãŸãã以äžã®ã¿ãŒããã«ã®ããã«ãã±ããåãAWSãããã¡ã€ã«ãšãã£ãç°å¢å€æ°ãèšå®ããŸããä»åŸå®è¡ããã³ãã³ãã§ãããã®å€æ°ãåç
§ããããšã«ãªããŸãã $ export BUCKET_NAME=project-tfstate-bucket # ãã±ããå $ export AWS_PROFILE=terraform-user # ãããã¡ã€ã«å $ export AWS_DEFAULT_REGION=ap-northeast-1 # ãªãŒãžã§ã³ 次ã«ã以äžã®AWS CLIã³ãã³ããé ã«å®è¡ããS3ãã±ãããäœæããŸãã # 1. S3ãã±ãããäœæããŸãã $ aws s3api create-bucket --bucket $BUCKET_NAME --acl private --region $AWS_DEFAULT_REGION --create-bucket-configuration LocationConstraint=$AWS_DEFAULT_REGION # 2. å
šãŠã®ãããªãã¯ã¢ã¯ã»ã¹ããããã¯ããã»ãã¥ãªãã£ã匷åããŸãã $ aws s3api put-public-access-block --bucket $BUCKET_NAME --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true" # 3. ãã±ããã®ããŒãžã§ãã³ã°ãæå¹ã«èšå®ããŸããïŒèª€ã£ãŠãã¡ã€ã«ãäžæžãã»åé€ããŠã埩å
å¯èœïŒ $ aws s3api put-bucket-versioning --bucket $BUCKET_NAME --versioning-configuration Status=Enabled # 4. ãã±ããã«ä¿åãããå
šãŠã®ãªããžã§ã¯ããæå·åããããèšå®ããŸãã $ aws s3api put-bucket-encryption --bucket $BUCKET_NAME --server-side-encryption-configuration '{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }' b. Terraformç°å¢ã®æ§ç¯ (versions.tf) S3ãã±ããã®æºåãã§ããã®ã§ã次ã«Terraformã®ã³ãŒããèšè¿°ããŠãããŸãããã ãŸãããããžã§ã¯ãå
šäœã§äœ¿çšããTerraformãšAWS Providerã®ããŒãžã§ã³ãæå®ãã versions.tf ãã¡ã€ã«ãäœæããŸããã # versions.tf terraform { # ãã®ã³ãŒããTerraform 1.0å°ã§å®è¡ãããã¹ãããšãæå®ããŸãã required_version = "~> 1.0" required_providers { # AWSã€ã³ãã©ãæ±ãããã«HashiCorp補ã®AWS Providerã䜿çšããŸãã aws = { source = "hashicorp/aws" # AWS Providerã¯6.7.0å°ã䜿çšããããæå®ããŸãã version = "~> 6.7.0" } } } ã¡ããã©ä»åã®äœæ¥ã§ãAWS Providerã®ããŒãžã§ã³ãææ°ã® 6.7.0 ã«æŽæ°ããŸããïŒ c. ã·ã³ããªãã¯ãªã³ã¯ã®äœæ ç§ãã¡ã®ããŒã ã§ã¯ãéçºç°å¢ãšæ¬çªç°å¢ãåé¢ããŠäœæ¥ãé²ããŠããŸãããã®ãããåç°å¢ã§å
ã»ã©äœæãã versions.tf ãã¡ã€ã«ãåç
§ããŸãã ãã®æãã·ã³ããªãã¯ãªã³ã¯ (Symbolic Link) ã䜿çšããŸããåãããããèšãã°ããã·ã§ãŒãã«ããã¢ã€ã³ã³ããäœæãããããªãã®ã§ããå
ã®ãã¡ã€ã« ( versions.tf ) ãäžç®æã«çœ®ããŠãããåç°å¢ã®ãã£ã¬ã¯ããªã«ã¯ãã®å
ãã¡ã€ã«ãæããªã³ã¯ã ããäœæããã®ã§ãã 以äžã®ã³ãã³ãã§ environments/development ãã£ã¬ã¯ããªãäœæãããã®äžã« versions.tf ãã¡ã€ã«ãæãã·ã³ããªãã¯ãªã³ã¯ãäœæããŸããã $ mkdir -p environments/development # ln -s: ã·ã³ããªãã¯ãªã³ã¯ãäœæ $ ln -s ../../versions.tf environments/development/versions.tf d. AWSèšå®ãã¡ã€ã« (providers.tf) æåŸã«ãç§ãã¡ãã©ã®S3ãã±ãããšAWSã¢ã«ãŠã³ãã䜿çšããã®ããæå®ããèšå®ãã¡ã€ã«ãäœæããŸãã environments/development ãã£ã¬ã¯ããªå
ã« providers.tf ãã¡ã€ã«ãäœæãã以äžã®ããã«èšè¿°ããŸããã # /environments/development/providers.tf terraform { backend "s3" { bucket = "project-tfstate-bucket" # S3ãã±ããå key = "terraform.tfstate" # tfstateãã¡ã€ã«å region = "ap-northeast-1" # AWSãªãŒãžã§ã³ profile = "terraform-user" # AWSãããã¡ã€ã« } } # äœæ¥ã§äœ¿çšããAWSã¢ã«ãŠã³ã provider "aws" { region = "ap-northeast-1" profile = "terraform-user" } e. Terraformã®åæå ãããŸã§ã§S3ãã±ãããäœæããããããžã§ã¯ãã®ã«ãŒã« ( versions.tf )ããšãæ¥ç¶èšå® ( providers.tf )ããå«ãŸãããã¡ã€ã«ã®æºåãæŽããŸãããããããTerraformãåæåãããããžã§ã¯ããéå§ããããšãäŒããçªã§ãã ãã®åœ¹å²ãæ
ãã®ã terraform init ã³ãã³ãã§ãããã®ã³ãã³ãã¯ã以äžã®äºã€ã®åŠçãè¡ããŸãã ãã©ã°ã€ã³ã®ããŠã³ããŒã : versions.tf ãã¡ã€ã«ã«æå®ãããAWS ProviderïŒãã©ã°ã€ã³ïŒãã€ã³ã¿ãŒãããããæ¢ãã .terraform ãã£ã¬ã¯ããªå
ã«ã€ã³ã¹ããŒã«ããŸãã ããã¯ãšã³ããžã®æ¥ç¶ : providers.tf ãã¡ã€ã«ã«èšè¿°ãããæ
å ±ãåºã«S3ãã±ãããžæ¥ç¶ãã .tfstate ãã¡ã€ã«ã管çããæºåãæŽããŸãã environments/development ãã£ã¬ã¯ããªãžç§»åããã³ãã³ããå®è¡ããŸããã $ cd environments/development # äœæ¥ãã£ã¬ã¯ããªãžç§»å $ terraform init ã³ãã³ããå®è¡ããŠãã°ããåŸ
ã€ãšã以äžã®ãããªæåã¡ãã»ãŒãžã衚瀺ãããŸãã Terraform has been successfully initialized! S3 bucket does not exist ãšã©ãŒ ç§ã¯ terraform init ã®éçšã§S3ãã±ããåãééããŠå
¥åããŠããŸãããã®ãšã©ãŒã«ééããŸããïŒããåæ§ã®ãšã©ãŒãçºçããå Žåã¯ãèšå®ãã¡ã€ã«ã«ã¿ã€ãããªãã確èªããŠã¿ãŠãã ããã terraform init ãæåãããšãçŸåšã®ãã£ã¬ã¯ããªã« .terraform ãšããé ããã£ã¬ã¯ããªãäœæãããŸããã¿ãŒããã«ã§ tree ã³ãã³ãã䜿ã£ãŠç¢ºèªãããšãèšå®éãã«AWS Providerãæ£ããããŠã³ããŒããããŠããããšã確èªã§ããŸãã $ ls -la environments/development .terraform # .terraform ãã£ã¬ã¯ããªãäœæãããããšãç¢ºèª $ tree .terraform # .terraform ãã£ã¬ã¯ããªã®å
éšæ§é ãç¢ºèª .terraform âââ providers â âââ registry.terraform.io â âââ hashicorp â âââ aws â âââ 6.7.0 # Providerãã€ã³ã¹ããŒã«ãããããšã確èªïŒ â âââ darwin_arm64 â âââ LICENSE.txt â âââ terraform-provider-aws_v6.7.0_x5 âââ terraform.tfstate # S3ç¶æ
ãã¡ã€ã« 2. EC2ã¢ãžã¥ãŒã«ã®äœæ ç°å¢æ§ç¯ãå®äºããã®ã§ãããããæ¬æ Œçã«EC2ã€ã³ã¹ã¿ã³ã¹ãäœæããæéã§ãïŒ Terraformã§ã€ã³ã¹ã¿ã³ã¹ã管çããéããã¹ãŠã®ã³ãŒããäžã€ã®ãã¡ã€ã«ã«èšè¿°ããããšãå¯èœã§ããããããããã§ã¯ã¡ã³ããã³ã¹ãå°é£ã«ãªããããæ©èœããšã«çްããåå²ããã¢ãžã¥ãŒã«ïŒModuleïŒãšããŠç®¡çããŸããããããããšã§ã æè»æ§ ãš åå©çšæ§ ã倧å¹
ã«åäžããŸãã ããã§ã modules/instance ãã£ã¬ã¯ããªãäœæãããã®äžã«å¿
èŠãªã¢ãžã¥ãŒã«ãäœæããŸããã a. ã¢ãžã¥ãŒã«ã®èšèš (variables.tf) ç§ãã¡ãã¬ãŽãããã¯ãäœãæããã©ã®ãããã¯ãã©ããã£ãŠç¹ãããããèããªããã°ãªããŸããããã®éãçµã¿ç«ãŠèª¬ææžãåèã«ããã°ãå¿
èŠãªéšåãšçµã¿ç«ãŠã®é çªãåãããŸãããã Terraformã® variables.tf ãã¡ã€ã«ãããŸãã«ãã® ãå¿
èŠãªéšåãªã¹ãã ã®åœ¹å²ãæãããŸãããã®ãã¡ã€ã«ãéããŠãEC2ã€ã³ã¹ã¿ã³ã¹ãäœæããéã«å¿
èŠãªæ
å ±ïŒéšåïŒãæç¢ºã«äŒããããšãã§ããŸãã modules/instance ãã£ã¬ã¯ããªå
ã«ã以äžã®ããã« variables.tf ãã¡ã€ã«ãäœæããŸããã # /modules/instance/variables.tf # EC2ã€ã³ã¹ã¿ã³ã¹ã«å¿
èŠãªå€æ°ïŒæ
å ±ïŒãªã¹ã variable "instance_name_tag" { # ã€ã³ã¹ã¿ã³ã¹ã®Nameã¿ã° type = string # ããŒã¿å description = "EC2ã€ã³ã¹ã¿ã³ã¹ã®Nameã¿ã°ã«äœ¿çšããå€" # 説æ } variable "iam_role_name" { type = string description = "ã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¿ããããIAMããŒã«å" } variable "subnet_id" { type = string description = "ã€ã³ã¹ã¿ã³ã¹ãé
眮ãããµããããã®ID" } variable "vpc_security_group_ids" { type = list(string) description = "ã€ã³ã¹ã¿ã³ã¹ã«é©çšããã»ãã¥ãªãã£ã°ã«ãŒãIDã®ãªã¹ã" } variable "instance_type" { type = string description = "EC2ã€ã³ã¹ã¿ã³ã¹ã®ã¿ã€ã" default = "t4g.nano" # ããã©ã«ãå€ãå®çŸ© } b. ã¢ãžã¥ãŒã«ã®çµã¿ç«ãŠ (ec2.tf) ec2.tf ãã¡ã€ã«ã¯Terraformã®çµã¿ç«ãŠããã»ã¹ã«è©²åœããŸãã variables.tf ã§å®çŸ©ãããå¿
èŠãªéšåãã䜿ã£ãŠãEC2ã€ã³ã¹ã¿ã³ã¹ãšããææç©ãäœæãããšããã§ãã modules/instance ãã£ã¬ã¯ããªå
ã« ec2.tf ãã¡ã€ã«ãäœæããEC2ã€ã³ã¹ã¿ã³ã¹ãå®çŸ©ããã³ãŒããèšè¿°ããŸããã # /modules/instance/ec2.tf # 1. EC2ã€ã³ã¹ã¿ã³ã¹ã«ã€ã³ã¹ããŒã«ããOS data "aws_ami" "amazon_linux_2023" { most_recent = true # ææ°ããŒãžã§ã³ã®AMI owners = ["amazon"] # AmazonãæäŸããå
¬åŒAMI # å¿
èŠãªAMIã§ãã£ã«ã¿ãªã³ã° filter { name = "name" values = ["al2023-ami-2023.*-kernel-*-arm64"] # Amazon Linux 2023 ARMç } filter { name = "architecture" values = ["arm64"] } } data "aws_ami" : EC2ã€ã³ã¹ã¿ã³ã¹ãäœæããéã«ã¯AMI IDãæ¯åå¿
èŠã§ãããããããã®IDã¯é »ç¹ã«å€æŽãããããããã®éœåºŠä¿®æ£ããã®ã¯æéãããããŸãããã®ãããªå Žåã« data ãããã¯ã䜿çšãããšãèšå®ããæ¡ä»¶ïŒææ°çãAmazon Linux 2023ãªã©ïŒã«åã£ãAMIãèªåã§æ€çŽ¢ããŠãããŸãã # /modules/instance/ec2.tf ç¶ã... # 2. äžèšã§æ€çŽ¢ããOSãšvariables.tfã®éšåã䜿ããEC2ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã resource "aws_instance" "main" { ami = data.aws_ami.amazon_linux_2023.id # AMIãèšå® instance_type = var.instance_type # ã€ã³ã¹ã¿ã³ã¹ã¿ã€ããèšå® subnet_id = var.subnet_id # ãããã¯ãŒã¯ã®å Žæ(Subnet)ãèšå® vpc_security_group_ids = var.vpc_security_group_ids # ã»ãã¥ãªãã£ã°ã«ãŒããèšå® iam_instance_profile = aws_iam_instance_profile.main.name # IAM Role(æš©éãªã¹ã)ãèšå® # ãµãŒããŒååèµ·åæã«èªåã§å®è¡ãããã¹ã¯ãªãã (PostgreSQLã¯ã©ã€ã¢ã³ãã®ã€ã³ã¹ããŒã«) user_data = <<-EOF #!/bin/bash sudo dnf update -y sudo dnf install postgresql16 -y EOF # ã€ã³ã¹ã¿ã³ã¹ã®ããŒã ã¿ã°(Name Tag)ãèšå® tags = { Name = var.instance_name_tag } } user_data : ã€ã³ã¹ã¿ã³ã¹ã®ååèµ·åæã«äžåºŠã ãå®è¡ãããã¹ã¯ãªããã§ããããã«ããã°ã©ã ã®ã€ã³ã¹ããŒã«ã¹ã¯ãªãããªã©ãèšè¿°ããŠããã°ããµãŒããŒäœæãšåæã«å¿
èŠãªããã°ã©ã ãèªåã§ã€ã³ã¹ããŒã«ããããã䟿å©ã§ãã c. æš©éã®è¿œå (iam.tf) æ°ããäœæããEC2ã€ã³ã¹ã¿ã³ã¹ãä»ã®AWSãµãŒãã¹ïŒS3ãDBãªã©ïŒã«ã¢ã¯ã»ã¹ããã«ã¯ãæš©éïŒIAM RoleïŒãå¿
èŠã§ãã IAMé¢é£ã®ã³ãŒãããå¯èªæ§ãšåœ¹å²ã®åé¢ã®ããã« iam.tf ãã¡ã€ã«ã§ç®¡çããŸãã # /modules/instance/iam.tf resource "aws_iam_instance_profile" "main" { name = "${var.instance_name_tag}-profile" role = var.iam_role_name } d. çµæã®åºå (outputs.tf) ããã°ã©ãã³ã°ã§é¢æ°ã return ãéããŠçµæã®å€ãè¿ãããã«ãTerraformã®ã¢ãžã¥ãŒã«ã outputs.tf ãéããŠãåç
§ã§ããããã«å€ãè¿ãããšãã§ããŸãã environments/development ã§ã¢ãžã¥ãŒã«ã䜿çšããã³ãŒããã€ã³ã¹ã¿ã³ã¹æ
å ±ãæŽ»çšã§ããããã modules/instance ãã£ã¬ã¯ããªå
ã« outputs.tf ãã¡ã€ã«ãäœæããŸããã # /modules/instance/outputs.tf # äœæãããEC2ã€ã³ã¹ã¿ã³ã¹ã®IDãšãã©ã€ããŒãIPã¢ãã¬ã¹ãè¿ããŸãã output "instance_id" { value = aws_instance.main.id # è¿ãå€ description = "äœæãããEC2ã€ã³ã¹ã¿ã³ã¹ã®ID" # 説æ } output "private_ip" { value = aws_instance.main.private_ip description = "äœæãããEC2ã€ã³ã¹ã¿ã³ã¹ã®ãã©ã€ããŒãIPã¢ãã¬ã¹" } ããã§ å
¥å ïŒ variables.tf ïŒã çµã¿ç«ãŠ ïŒ ec2.tf , iam.tf ïŒããã㊠åºå ïŒ outputs.tf ïŒãŸã§ãTerraformã«å¿
èŠãªèšèšãå®äºããŸããïŒ æ¬¡ã®ã¹ãããã§ã¯ããã®èšèšãåºã«EC2ã€ã³ã¹ã¿ã³ã¹ãäœæããŠã¿ãŸãããïŒ 3. EC2ã€ã³ã¹ã¿ã³ã¹ã®äœæ ãããŸã§ã§ modules/instance ãšãããã£ã¬ã¯ããªå
ã«ãåå©çšå¯èœãªEC2ã€ã³ã¹ã¿ã³ã¹ã®ã¢ãžã¥ãŒã«ãäœæããŸãããããããã¯ãã¹ããã1ã§æºåãã environments/development ã«æ»ããå®éã«çµã¿ç«ãŠãŠäœæããçªã§ãã a. ã¢ãžã¥ãŒã«ã®åŒã³åºã instance ã¢ãžã¥ãŒã«ãåŒã³åºããå¿
èŠãªããŒã¿ãæž¡ãããã«ã environments/development ãã£ã¬ã¯ããªã§ main.tf ãã¡ã€ã«ãäœæããŸãã # /environments/development/main.tf # 'instance'ã¢ãžã¥ãŒã«ã'terraform_ec2'ãšããååã§åŒã³åºããŸãã module "terraform_ec2" { # ã¢ãžã¥ãŒã«ã®ãã¹ source = "../../modules/instance" # ã€ã³ã¹ã¿ã³ã¹ã®ããŒã ã¿ã° instance_name_tag = "terraform-instance" # IAMããŒã« iam_role_name = "instance-role" # ã€ã³ã¹ã¿ã³ã¹ã¿ã€ã instance_type = "t4g.nano" # ãããã¯ãŒã¯ã®å Žæ(Subnet) subnet_id = "subnet-01e..." # å®éã®ç°å¢ã«åã£ãå€ã«å€æŽããŠãã ãã # ã»ãã¥ãªãã£ã°ã«ãŒã vpc_security_group_ids = ["sg-0fe...", "sg-0e3..."] # å®éã®ç°å¢ã«åã£ãå€ã«å€æŽããŠãã ãã } source ã§ã¢ãžã¥ãŒã«ã®ãã¹ãæå®ãããã®äžã« variables.tf ã§å®çŸ©ããå®éã®å€ãäžã€ãã€èšè¿°ããŠãããŸãã b. ãããã€ãšå®è¡ ããã§èšèšãšçµã¿ç«ãŠã®æºåããã¹ãŠå®äºããŸãããããããã¯ãå®éã«AWSäžã§EC2ã€ã³ã¹ã¿ã³ã¹ãäœæããäœæ¥ã ããæ®ã£ãŠããŸãïŒïŒ ãŸã terraform plan ã³ãã³ãã§ãã©ã®ãªãœãŒã¹ã äœæïŒ + ïŒ ã 倿ŽïŒ ~ ïŒ ã**åé€ïŒ - ïŒ**ãããã®ããäºåã«ç¢ºèªããŸãã environments/development ãã£ã¬ã¯ããªã§ã以äžã®ã³ãã³ããå®è¡ããŠã¿ãŸãããã $ terraform plan ãããšãTerraformãã³ãŒããåæããããããAWSã§ã©ã®ãããªäœæ¥ãå®è¡ãããã®ãããã® èšç»ïŒplanïŒ ã衚瀺ããŠãããŸãã Plan: 2 to add, 0 to change, 0 to destroy. + resource "aws_iam_instance_profile" "main" { ... } + resource "aws_instance" "main" { ... } èšç»ãèŠããšãIAMãããã¡ã€ã«1ã€ãšEC2ã€ã³ã¹ã¿ã³ã¹1ã€ãæ°ããäœæãããäºå®ã§ããããšãåãããŸããïŒ æçµçãªèšç»ã«åé¡ããªããã°ã terraform apply ã³ãã³ãã§å®éã®ãããã€ãéå§ããŸãã $ terraform apply ãã®ã³ãã³ããå®è¡ãããšãæ¬åœã«äœæ¥ãå®è¡ããã®ããæåŸã®ç¢ºèªãæ±ããããŸãã Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes æåŸã« yes ãå
¥åãããšãTerraformãAWSãšéä¿¡ããŠã€ã³ã¹ã¿ã³ã¹ã®äœæãéå§ããŸãïŒ äœæ¥ãå®äºãããšããã®ãããªã¡ãã»ãŒãžã衚瀺ãããŸãã Apply complete! Resources: 2 added, 0 changed, 0 destroyed. AWSã³ã³ãœãŒã«ã§ç¢ºèªãããšããã®ããã«ã³ãŒãã®ã¿ã§EC2ã€ã³ã¹ã¿ã³ã¹ãäœæãããããšã確èªã§ããŸãïŒ 4. æåŸã« ä»åã®åŠã³ ä»åã®åããŠã®Terraformãããžã§ã¯ããéããŠãåã«EC2ã€ã³ã¹ã¿ã³ã¹ãã³ãŒãã§äœæããæ¹æ³ã ãã§ãªããã€ã³ãã©ãæ±ãäžã§ã®å®åçãªèŠç¹ãåŠã¶ããšãã§ããŸããã ã³ãŒãã§ã€ã³ãã©ã管çããçç± : ããŠã¹ã¯ãªãã¯ã§ã¯ãªãã³ãŒãã§ã€ã³ãã©ã管çããããšã§ãåå©çšå¯èœãªãéšå( Modules )ããšãããçµã¿ç«ãŠãã空é( Environments )ããåé¢ããã³ãŒãã®éè€ãé²ããæè»æ§ã倧å¹
ã«åäžãããããšãã§ããŸããã ãªã¢ãŒãã§ã®ç¶æ
管ç : terraform.tfstate ãã¡ã€ã«ãS3ã«ä¿åããããšã§ãããŒã ã¡ã³ããŒå
šå¡ãåãç¶æ
ãåºæºã«äœæ¥ã§ããç°å¢ãæ§ç¯ã§ããããšãåŠã³ãŸããã åŠçã®çãããž ç§ã¯AWSã®çµéšãã»ãšãã©ãªããTerraformãšããããŒã«ãååãèããããšãããçšåºŠã§ãããããããä»åãããžã§ã¯ããçµããŠããã°ãšããŠå
容ããŸãšããéçšã§ãéææãšå
±ã«ãããããããã«å€ãã®æè¡ã«ææŠããããšããèªä¿¡ãåŸãããšãã§ããŸããã ç§ããã®ããã«æããããšãã§ããã®ãããããã£ã® æ°ååãã®äœç³»çãªç ä¿®ãšãæé·ã奚å±ããæå ã®ãããã ãšèããŠããŸããä»ã§ã¯AWSãã€ã³ãã©ãããã¯ãšã³ãæè¡ã«ãææŠããŠã¿ãããšããç®æšãã§ããŸããã ãããã£ã§ã¯ãå
¥ç€ŸåŸ1ã¶æéã® å°å
¥ç ä¿® ã«å§ãŸãããšã³ãžãã¢ã®åæãã¡ãšå
±ã«ãããžã§ã¯ããé²ãã æè¡ç ä¿® ããããŠ3ã¶æããšã«3ã€ã®ç°ãªãããŒã ãçµéšããªããå
茩ãã¡ãšå®åãåŠã¶9ã¶æéã® OJT ãŸã§ãçŽ1幎éã«ããã£ãŠæ°åãäŒç€Ÿã«æ
£ããæé·ã§ããããäœç³»çãªããã°ã©ã ãæŽã£ãŠããŸãã ãã®èšäºãèªãã§ãã ãã£ãŠããçãããããããã£ã§ç§ãã¡ãšäžç·ã«åŠã³ãæé·ãã仲éã«ãªããããšãé¡ã£ãŠããŸããã©ããå€ãã®é¢å¿ããå¯ãããã ããã°å¹žãã§ã 次ã¯ãç³ç°ããã®åºçªã§ãã æŽŸæãªèšäºã楜ãã¿ã§ã åèè³æ Terraform: Resource: aws_instance
ã¯ããã« ã¯ãããŸããŠããããã£ã®é«å£ã§ãã ãçè
ãããã£ãŒã«ã å
¥ç€ŸææïŒ2025幎4æ å
¥ç€Ÿåã®ã¹ãã«ïŒ PythonãReactãäž»ã«äœ¿çš gitã䜿ã£ãããŒã éçºçµéšã¯ããã«ãœã³(2,3æ¥çšåºŠ)ã®ã¿ çŸåšã®æ
åœïŒç¬¬äžéçºããŒã (ãããã£ãããããŒãžããããããªã©ãæ
åœ) ã¿ãªããã¯Gitã䜿ã£ãŠéçºãããããšããããŸãã?Gitã¯ãã¡ã€ã«ã®å€æŽå±¥æŽãªã©ãèšé²ããããŒãžã§ã³ç®¡çã·ã¹ãã ã§ããããäžåºŠã§ã䜿ã£ãããšããããªããã git add ãã git commit ãã git push ããšãã£ãã³ãã³ããããã¯ãæãèŠããŠãããããããŸããã ãŸãã䜿ã£ãããšããªãæ¹ã«ãšã£ãŠã¯ãä»åŸããŒã ã§éçºããéã®å¿
é ã®ããŒã«ãšãªããŸãããããªé¢šã«èª°ããåœããåã®ããã«äœ¿ã£ãŠãããããã®ã³ãã³ãã§ãããè£åŽã§äžäœäœãèµ·ããŠããã®ããæ·±ãèããããšã¯ãããŸãã? ããã§ããã®èšäºã§ã¯Gitã³ãã³ãã䜿çšããã«commitãããæ¹æ³ã玹ä»ããŸãã ãã®ããã»ã¹ãéããŠãGitãã©ã®ããã«å€æŽå±¥æŽãèšé²ããŠããã®ãããã®ä»çµã¿ãçè§£ããäžå©ãšãªãã°å¹žãã§ãã(Gitã«ã€ããŠãåç¥ãªãæ¹ã¯åŒç€Ÿã® æ°äººç ä¿®ã®è³æ ã䜵ããŠã芧ãã ãã) äžè¬çãªcommitãŸã§ã®æµã äžè¬çãªcommitãŸã§ã®æµãã¯ä»¥äžã®ããã«ãªããŸãã 1. git init 2. ãã¡ã€ã«ã®ç·šé 3. git add (ç·šéãããã¡ã€ã«) 4. git commit ãŸãã¯ãå¿
èŠãªãã¡ã€ã«ãçšæããããã« git init ããŸãããã®åŸããã¡ã€ã«ãç·šéãã git add ã§å€æŽãç¥ãããŠã commit ããŸãã ä»åã¯ããã¡ãã®æé ãæåã§è¡ããŸãã å®è¡ç°å¢ ãã®èšäºã§ç޹ä»ããã³ãã³ãæäœã¯ã macOS ãæ³å®ããŠããŸãã ãŸããæé ã®éäžã§ Python ãš Git (確èªããããã«äœ¿çš)ãå¿
èŠã«ãªãããããããããã€ã³ã¹ããŒã«ããŠãããŠãã ããã Windowsããå©çšã®æ¹ãž Windowsç°å¢ã§é²ããå Žåã¯ãGit for Windowsã«ä»å±ããã Git Bash ããš Python ãã€ã³ã¹ããŒã«ããŠããã ãããšã§ãåæ§ã®æäœãå¯èœã§ãã git init git initãšã¯ git initã³ãã³ãã¯Gitã§å¿
èŠãªãªããžããªããã¡ã€ã«ãäœæããã³ãã³ãã§ããåºæ¬çã«ã¯ååã®ã¿ãã®ã³ãã³ãã䜿çšããŸãã git initãå®è¡ãããš.gitãšããé ããã£ã¬ã¯ããªãäœæãããŸãããã®ãã£ã¬ã¯ããªã®äžã§Gitã«é¢ããå
šãŠã®ãã¡ã€ã«ãæ ŒçŽããŠããŸãã äœæããããã® å
·äœçã«ã¯ä»¥äžã®ãããªãã£ã¬ã¯ããªãäœæããŠããŸãã .git/hooks: ç¹å®ã®Gitã€ãã³ããçºçããéã«èªåçã«å®è¡ãããã¹ã¯ãªãããé
眮 .git/info:excludeãé
眮(gitã§è¿œè·¡ãããªãã«ãŒã«) .git/objects/: ãªããžã§ã¯ã(åŸè¿°)ãé
眮 (/ããã·ã¥å€ã®äž2æ¡) /info: è¿œå æ
å ± /pack: ããã¯ãã¡ã€ã«ãé
眮ãã .git/refs: ç¹å®ã®ã³ãããããã·ã¥ãæããã€ã³ã¿ãä¿åãã /heads: ããŒã«ã«ãªããžããªã®ãã©ã³ããæãã³ãããããã·ã¥ãæ ŒçŽ /remotes: ãªã¢ãŒããªããžããªã®ãã©ã³ããæãã³ãããããã·ã¥ãæ ŒçŽ /tags: ã¿ã°ã®åç
§ãæ ŒçŽ .git/logs: åãã©ã³ããHEADã§å®è¡ããã¢ã¯ã·ã§ã³ãèšé²ãã æé ã§ã¯ããã£ããgit initãæåã§è¡ãªã£ãŠãããŸãã 1.äœæ¥çšã®ãã©ã«ããäœæããŸã $ mkdir git_manual 2.äœæãããã©ã«ãã«ç§»åããŸã $ cd git_manual 3.Gitãªããžããªã®åæèšå®ã«å¿
èŠãªãã£ã¬ã¯ããªæ§é ãäœæããŸã $ mkdir -p .git/hooks .git/info .git/objects/info .git/objects/pack .git/refs/heads .git/refs/remotes .git/refs/tags .git/logs .git/ãäœæããåŸã¯ãconfigã®èšå®ãšçŸåšã®ãã©ã³ããèšå®ããŸãã configã§ã¯ããã¡ã€ã«ã®å®è¡æš©éã®å€æŽã远跡ãããã©ããããã¡ã€ã«åã®å€§æåã»å°æåãåºå¥ãããã©ãããªã©ãèšå®ããŸãã 4..git/configãäœæãå¿
èŠãªæ
å ±ãèšè¿°ããŸã $ cat <<EOF > .git/config ãå®è¡ããåŸä»¥äžãã³ããããŠãã ããã [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true EOF 5..git/HEADãäœæããmainãã©ã³ããHEADã«ããŸã $ echo "ref: refs/heads/main" > .git/HEAD git statusã³ãã³ãã䜿çšããŠããããŸã§äžæãè¡ããŠãããã©ãã確èªããŠã¿ãŸãããã $ git status On branch main No commits yet nothing to commit (create/copy files and use "git add" to track) äžèšã衚瀺ããããOKã§ãã (è£è¶³: git initããããšå®éã«ã¯hookã®ãµã³ãã«ãçæãããŸãããä»åã¯å¿
èŠãªãããçç¥ããŠããŸã) commit commitã®ä»çµã¿ã«ã€ã㊠ç¶ããŠcommitãããŠãããŸããããã®åã«commitã®ä»çµã¿ã«ã€ããŠèª¬æããŸãã commitãããéã ã³ãããã¡ãã»ãŒãž ã¿ã€ã ã¹ã¿ã³ã ã³ããããäœæãã人ç©ã®æ
å ± ã³ããããã人ç©ã®æ
å ± ãã¡ã€ã«ã®å·®å ã³ãããæç¹ã§ã®ãã£ã¬ã¯ããªã®éå±€æ§é ãšå
šãã¡ã€ã«(treeãªããžã§ã¯ã) ãªã©ã®æ
å ±ãä¿åããå¿
èŠããããŸããGitã§ã¯ããããå
šãŠããŸãšã㊠ã³ããããªããžã§ã¯ã ãšããŠç®¡çããŠããŸããã³ããããªããžã§ã¯ãã¯äžæã«èå¥ããããã«ããã·ã¥å€(SHA-1)ãçæãããããããŒãšããŠããŸãã(ãã®ä»çµã¿ãã³ã³ãã³ãã¢ãã¬ã¹ã¹ãã¬ãŒãžãšåŒã³ãŸã) ã³ããããªããžã§ã¯ãã¯ãã£ã¬ã¯ããªã®éå±€æ§é ãå
šãã¡ã€ã«ã®æ
å ±ãæ¯åä¿åããŸãããã®ãããGitã«ãããcommitãšã¯ ãã¡ã€ã«ã®ãå·®åããèšé²ããã®ã§ã¯ãªãããªããžããªã®ãã¹ãããã·ã§ããããèšé² ããŠããŸãã commitã®æµã 倧ãŸããªcommitã®æµãã¯ã 1. ãã¡ã€ã«å
容ãGitã管çã§ãã圢ã«å€æãã(BLOBã®äœæ) 2.ã€ã³ããã¯ã¹ãã¡ã€ã«ã®äœæ 3. treeãªããžã§ã¯ããäœæ 4. ã³ããããªããžã§ã¯ããäœæ 5. HEADã«ããã·ã¥å€ãç»é² ãšãªã£ãŠããŸãã ã€ã³ããã¯ã¹ãã¡ã€ã«ã®äœæãã git add ã«è©²åœãããã以éã git commit ã«è©²åœããŸãã ã³ããããªããžã§ã¯ããäœæããã ãã§ã¯ãçŸåšã®ãã©ã³ãã§äžçªææ°ã®ã³ããããã©ããªã®ãããããªããããGitã«ç¥ãããå¿
èŠããããŸãã ããã§ã.git/refs/headsã«ã³ããããªããžã§ã¯ãã®ããã·ã¥å€ãä¿åããŸããããã«ãããææ°ã®ã³ããããäžæã«ç¹å®ããããšãã§ããŸãã ãŸããBLOBã»ã€ã³ããã¯ã¹ãã¡ã€ã«ã»treeãªããžã§ã¯ãã»ã³ããããªããžã§ã¯ãã®äœæã¯æ¬¡ã®å³ãããªæé ã§äœæãããŸãã å
ã»ã©ãGitã«ãããcommitãšã¯ ãªããžããªã®ãã¹ãããã·ã§ããããèšé²ããŠãã ãšè¿°ã¹ãŸãããããã®ãŸãŸä¿åããã®ã¯ããŸãè³¢ãæ¹æ³ã§ã¯ãããŸããã ããã§ããªããžã§ã¯ããå§çž®ããããšã§å®¹éãå¹ççã«æ¶è²»ããŠããŸãã commitã®æé ããã§ã¯ãä»åã®ç®çã§ããcommitãããŠãããŸãã 1.é©åœãªãã¡ã€ã«ã远å ããŸã(äŸãšããŠexample.txtãäœæ) $ echo "first commit" > example.txt 2.ã³ããããªããžã§ã¯ãã®äœæ å
ã»ã©ã®å³ãèŠããšãBLOBã»treeãªããžã§ã¯ãã»ã³ããããªããžã§ã¯ãã®äœææé ã¯åºæ¬çã«å
±éããŠããŸãããŸããããããã®å·¥çšã§åã®ã¹ãããã§çæããããã·ã¥å€ãå¿
èŠãšãªããŸãã ããã§ä»åã¯ããããäžé£ã®æµããèªååã§ãããããã³ããããªããžã§ã¯ããäœæããã·ã§ã«ã¹ã¯ãªãããäœæããŸããã 以äžã®ã·ã§ã«ã¹ããªã¯ããcommit.shãšããŠä¿åããŠãã ããã #!/bin/bash set -euo pipefail # äœ¿ãæ¹: ./manual_commit.sh <ãã¡ã€ã«å> "<ã³ãããã¡ãã»ãŒãž>" if [ "$#" -ne 2 ]; then echo "Usage: $0 <ãã¡ã€ã«å> \"<ã³ãããã¡ãã»ãŒãž>\"" exit 1 fi FILE="$1" MSG="$2" GIT_DIR=".git" # --- Step 1: BLOBãªããžã§ã¯ãã®äœæ --- echo "==============================" echo " BLOBãªããžã§ã¯ãã®äœæ" echo "------------------------------" # ãã¡ã€ã«å
容ããBLOBãªããžã§ã¯ãã®çããŒã¿ãäœæ tmp_blob=$(mktemp) trap 'rm -f "$tmp_blob"' EXIT blob_size=$(wc -c <"$FILE" | tr -d '[:space:]') { printf "blob %s\0" "$blob_size"; cat "$FILE"; } > "$tmp_blob" # ããã·ã¥ãèšç®ããzlibã§å§çž®ããŠ.git/objectsã«ä¿å blob_hash=$(shasum "$tmp_blob" | cut -d' ' -f1) path="$GIT_DIR/objects/${blob_hash:0:2}/${blob_hash:2}" mkdir -p "$(dirname "$path")" python3 -c "import sys,zlib;sys.stdout.buffer.write(zlib.compress(sys.stdin.buffer.read()))" < "$tmp_blob" > "$path" echo "BLOB äœæå®äº: $blob_hash" echo "==============================" echo "" echo "==============================" echo " ã€ã³ããã¯ã¹ãã¡ã€ã«ã®æåäœæ" echo "------------------------------" # --- Step 2: ã€ã³ããã¯ã¹ãã¡ã€ã«ã®äœæ --- python3 -c ' import sys, os, hashlib, struct, binascii def create_index(file_path, blob_hash_hex): header = struct.pack(">4sII", b"DIRC", 2, 1) # Signature, Version 2, 1 Entry stat_info = os.stat(file_path) ctime_sec = int(stat_info.st_ctime) ctime_nsec = stat_info.st_ctime_ns % 10**9 mtime_sec = int(stat_info.st_mtime) mtime_nsec = stat_info.st_mtime_ns % 10**9 dev = stat_info.st_dev ino = stat_info.st_ino mode = stat_info.st_mode uid = stat_info.st_uid gid = stat_info.st_gid size = stat_info.st_size blob_hash_bin = binascii.unhexlify(blob_hash_hex) path_bytes = file_path.encode("utf-8") # ãã¡ã€ã«åã®é·ãããã©ã°ãšããŠäœ¿çš flags = len(path_bytes) entry = struct.pack( ">IIIIIIIIII20sH", ctime_sec, ctime_nsec, mtime_sec, mtime_nsec, dev, ino, mode, uid, gid, size, blob_hash_bin, flags ) + path_bytes + b"\x00" # ããã£ã³ã°ã远å ããŠ8ãã€ãå¢çã«æãã entry_len_with_pad = (len(entry) + 7) & ~7 entry += b"\x00" * (entry_len_with_pad - len(entry)) index_content = header + entry checksum = hashlib.sha1(index_content).digest() with open(".git/index", "wb") as f: f.write(index_content + checksum) if __name__ == "__main__": create_index(sys.argv[1], sys.argv[2]) ' "$FILE" "$blob_hash" echo "ã€ã³ããã¯ã¹äœæå®äº" echo "==============================" echo "" # --- Step 3: treeãªããžã§ã¯ãã®äœæ --- echo "==============================" echo " treeãªããžã§ã¯ãã®äœæ" echo "------------------------------" # ã€ã³ããã¯ã¹ãèªã¿åã代ããã«ãåã®ã¹ãããã§åŸã倿°ã䜿çšããŸã mode="100644" blob_hash_text="$blob_hash" file_name="$FILE" tmp_tree=$(mktemp) tmp_tree_header=$(mktemp) trap 'rm -f "$tmp_tree" "$tmp_tree_header"' EXIT { printf "%s %s\0" "$mode" "$file_name"; echo -n "$blob_hash_text" | xxd -r -p; } > "$tmp_tree" tree_size=$(wc -c <"$tmp_tree" | tr -d '[:space:]') { printf "tree %s\0" "$tree_size"; cat "$tmp_tree"; } > "$tmp_tree_header" # ããã·ã¥ãèšç®ããå§çž®ããŠä¿å tree_hash=$(shasum "$tmp_tree_header" | cut -d' ' -f1) path=".git/objects/${tree_hash:0:2}/${tree_hash:2}" mkdir -p "$(dirname "$path")" python3 -c "import sys,zlib;sys.stdout.buffer.write(zlib.compress(sys.stdin.buffer.read()))" < "$tmp_tree_header" > "$path" echo "treeãªããžã§ã¯ãäœæå®äº: $tree_hash" echo "==============================" echo "" # --- Step 4: ã³ããããªããžã§ã¯ãã®äœæ --- echo "==============================" echo " ã³ããããªããžã§ã¯ãã®äœæ" echo "------------------------------" author="hoge <hoge@example.com>" timestamp=$(date +'%s %z') # ã³ããããªããžã§ã¯ãã®çããŒã¿ãäœæ commit_content="tree $tree_hash author $author $timestamp committer $author $timestamp $MSG " tmp_commit=$(mktemp) trap 'rm -f "$tmp_commit"' EXIT commit_size=$(printf "%s" "$commit_content" | wc -c | tr -d '[:space:]') { printf "commit %s\0" "$commit_size"; printf "%s" "$commit_content"; } > "$tmp_commit" # ããã·ã¥ãèšç®ããå§çž®ããŠä¿å commit_hash=$(shasum "$tmp_commit" | cut -d' ' -f1) path=".git/objects/${commit_hash:0:2}/${commit_hash:2}" mkdir -p "$(dirname "$path")" python3 -c "import sys,zlib;sys.stdout.buffer.write(zlib.compress(sys.stdin.buffer.read()))" < "$tmp_commit" > "$path" echo "ã³ããããªããžã§ã¯ãäœæå®äº: $commit_hash" echo "==============================" echo "" ã·ã§ã«ã¹ã¯ãªããã«å®è¡æš©éãäžããŠãã ãã $ chmod +x commit.sh 第1åŒæ°ã«ç·šéãããã¡ã€ã«ã第2åŒæ°ã«ã³ãããã¡ãã»ãŒãžãå
¥åããŠå®è¡ããŠãã ãã $ ./commit.sh example.txt "first commit" ============================== BLOBãªããžã§ã¯ãã®äœæ ------------------------------ BLOB äœæå®äº: 5ec586d228b5ff1e8c845c4ed8c2d01f3a159b24 ============================== ============================== ã€ã³ããã¯ã¹ãã¡ã€ã«ã®æåäœæ ------------------------------ ã€ã³ããã¯ã¹äœæå®äº ============================== ============================== treeãªããžã§ã¯ãã®äœæ ------------------------------ treeãªããžã§ã¯ãäœæå®äº: 2a154faaf71f2b3a17055d393504c1349395b049 ============================== ============================== ã³ããããªããžã§ã¯ãã®äœæ ------------------------------ ã³ããããªããžã§ã¯ãäœæå®äº: aa5e60c3c7b817707e4c4f2e29995451406bb319 ============================== å®äºãããšããããã®ããã·ã¥å€ã衚瀺ãããŸãããã®ãã¡ãã³ããããªããžã§ã¯ãã®ããã·ã¥å€ãGitã«ç¥ãããŸãã 3.HEADã«ããã·ã¥å€ãç»é²ããŸã $ echo "aa5e60c3c7b817707e4c4f2e29995451406bb319" > .git/refs/heads/main 4.commitã§ããã確èªããŸã $ git log --show-signature commit aa5e60c3c7b817707e4c4f2e29995451406bb319 (HEAD -> main) Author: hoge <hoge@example.com> Date: Tue Aug 19 16:27:35 2025 +0900 first commit ããã·ã¥å€ãAuthorã衚瀺ãããŠããã°å®äºã§ãããç²ãæ§ã§ãã!! è£è¶³ ä»åã¯ãBLOBãäœæããåŸã«ã€ã³ããã¯ã¹ãã¡ã€ã«ãäœæããŸããããã€ã³ããã¯ã¹ãã¡ã€ã«ãäœæããã«ãã³ããããªããžã§ã¯ããäœæããããšãå¯èœã§ãããã®å Žåã«ãé¢çœãæåãèŠãããŸãã®ã§ãã·ã§ã«ã¹ã¯ãªããã倿ŽããŠãã²ãã£ã¬ã³ãžããŠã¿ãŠãã ããã çµããã« ä»åã¯ãæåã§commitãããŠã¿ãŸãããGitã¯éåžžã«äŸ¿å©ãªããŒã«ã§ãããæ®æ®µäœæ°ãªã䜿ã£ãŠããã³ãã³ãã¯ãç§ãã¡ã®ä»£ããã«è€éãªåŠçãèªåã§å®è¡ããŠãããŸãããããããã®è£åŽã«ããè«ççãªä»çµã¿ãçè§£ããããšã¯åãªãè±ç¥èã§ã¯ãããŸãããããã¯Gitã«éãããããããããŒã«ã«å
±éããããšã§ãããæ¬è³ªçãªçè§£ããã©ãã«ã·ã¥ãŒãã®åã«ã€ãªãããŸãã ãã®èšäºããæ®æ®µã¯æèããªãéšåã«ãç®ãåãããã£ãããšãªããæè¡ãžã®çè§£ãããæ·±ãããã£ãããšãªãã°å¹žãã§ãã ãã®èšäºãèªãã åŠçããã«åã㊠å
¥ç€ŸããŠçŽ4ã¶æã§ãããåŒç€Ÿã¯æ¬åœã«æ§ã
ãªããšã«ææŠã§ããç°å¢ã ãšæããŠããŸãã ç§ã®å Žåã¯æ°ããã€ã³ãã©ç°å¢ã®æ§ç¯ããäŒç»äŒè°ã§ã®ãã¡ã·ãªããŒã¿ãŒãªã©ã«åãçµã¿ãŸããããããã¯å
šãŠåææŠã§ããããã©ã®å Žé¢ã§ãåšå²ã®æåããµããŒããããã倧ããæé·ã§ãããšå®æããŠããŸãã æ§ã
ãªæè¡ã«è§ŠããŠã¿ããæ¹ãéçºã ãã§ãªãäŒç»ã«ãåå ããŠã¿ããæ¹ã«ãšã£ãŠã¯ãåŒç€Ÿã¯éåžžã«é
åçãªç°å¢ã ãšæããŸãã ãŸããåŒç€Ÿã®æ°äººç ä¿®ã§äœ¿çšããŠããè³æãå
¬éããŠããŸãã®ã§ãèå³ã®ããæ¹ã¯ãã² ãã¡ã ãã芧ãã ããã æ¬¡ã¯ãå€§åæ°äººã®ãã¯ããã®èšäºã§ãã ã©ãããæåŸ
ãã ããã åèæç® https://drew.silcock.dev/blog/artisanal-git/ Git
ã¯ããã« ãšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒãããŠããŸããèŠå·ã§ãã ãšã³ãžãã¢ã®ããã®ããã¥ã¡ã³ãã©ã€ãã£ã³ã° ïŒãžã£ã¬ããã»ããŒã㣠è /ã¶ãã«ãªãŒã»ãµã©ã»ã³âã©ã€ã»ã³ è /ãžã§ã³ã»ã©ã³ããŒã³ è /ããŒãããã»ããŒãã§ã¹ è /ãã€ãã£ã»ãŠã©ãŒã¿ãŒããŠã¹ è /岩ç¬ã矩æ èš³ïŒ ãã€ã³ããŒãœãŒã¹ã®èгç¹ããèªãã èšé²ãããã°ã«ããããšæããŸãã çµè« ã€ã³ããŒãœãŒã¹ã®èгç¹ããèŠãããã¥ã¡ã³ãã©ã€ãã£ã³ã°ã®éèŠãã€ã³ãã¯ä»¥äžã®ãšããã§ãã READMEã®éèŠæ§ ãããžã§ã¯ãã®æåã«èŠãããã¥ã¡ã³ããšããŠãREADMEã¯æ¥µããŠéèŠã§ãã ååããã»ã¹ ããã¥ã¡ã³ãç·šéã¯ã³ãŒãã¬ãã¥ãŒãšåæ§ã«ååçãªããã»ã¹ã§ããããã£ãŒãããã¯ãåãå
¥ããŠæ¹åããŠããããšã倧åã§ãã å¹çå ä»è
ãšã®ååã¯æéççž®ã«ã€ãªããã匷ã人æã®ã³ã³ããªãã¥ãŒã·ã§ã³ãå¹çãé«ããŸãã 建èšçãªãã£ãŒããã㯠å人ãéé£ãããã³ã³ãã³ãæ¹åãç®çãšãããã£ãŒãããã¯ãéèŠã§ãã æè¬ã®å§¿å¢ ã³ã³ããªãã¥ãŒã·ã§ã³ã«å¯ŸããŠã¯å¿
ãæè¬ã瀺ããé©åã«æ€èšããŠåãå
¥ãããã©ããã倿ããŸãã å®ç§äž»çŸ©ã®åé¿ å
¬éæã«å®ç§ãªããã¥ã¡ã³ãã¯ååšããªããããå
¬éåŸã®ãã£ãŒãããã¯ãšä¿®æ£ãéèŠããŸãã æç¢ºãªè²¬ä»»è
æçµæ¿èªè
ãã³ãŒããªãŒããŒãæç¢ºã«ãã管ç責任ãæç¢ºã«ããŸãã ãã£ãŒãããã¯ã®éèŠ ãŠãŒã¶ãŒãµãŒãã€ããã£ãŒãããã¯ãã£ã³ãã«ãéããŠãç¶ç¶çãªæ¹åãå³ããŸãã ä¿¡é Œé¢ä¿ã®æ§ç¯ ãã£ãŒãããã¯ã®åæ ç¶æ³ãäŒãã瀟å
ã§ã®å°èŠæš¡ãªDevRelé¢ä¿ãç¯ããŸãã é©åãªç®¡ç ããã¥ã¡ã³ããªãŒããŒã決ããæŸçœ®ããããªããžããªãé²ããŸããå¿
èŠã«å¿ããŠå»æ¢ã®å€æãè¡ããŸãã è²¢ç®ãžã®å ±é
¬ ã³ã³ããªãã¥ãŒã·ã§ã³ã«å¯ŸããŠã¯ãé©åãªç§°è³ãšå ±é
¬ãæäŸããŸãã ã€ã³ããŒãœãŒã¹ã®èгç¹ã®éèŠãªèšè¿°ã®æç² CHAPTER1 èªã¿æã®çè§£ README ã€ã³ããŒãœãŒã¹ã«éãããããããREADMEã¯èª°ããæåã«ã¿ãããã¥ã¡ã³ãã§è¶
éèŠã CHAPTER4 ããã¥ã¡ã³ãã®ç·šé ã³ãŒãã¬ãã¥ãŒãšåãã§ãããã¥ã¡ã³ãç·šéã¯ååçãªããã»ã¹ãåãåã£ããã£ãŒãããã¯ãåããããŠæ¹åããŠãã ãŸãã«ããã¯ã€ã³ããŒãœãŒã¹ãšå矩ããååããã»ã¹ããšããçšèªã§åºã調ã¹ãŠãããšãã€ã³ããŒãœãŒã¹ã¯ãã£ãšåºãããèŠããã ããã ç·šéã¯ä»äººãšããã°æçã«ãªã å¹çåãšããæå³ã§ããèªåã§ããããæ©ãã§ãããæéã䜿ãããã¯ä»äººã«ãŸãããŠãã£ãŒãããã¯ãããã£ãã»ããæéççž®ã«ãªããåçŽã«ã€ã³ããŒãœãŒã¹ã«ãããããã¡ãªãããããŸãããããã«åŒ·ã人ãã³ã³ããªãã¥ãŒãããã»ããæéççž®ã«ãªãã ãã£ãŒãããã¯ã¯ãæ¹é£ãããã®ã§ã¯ãªããã³ã³ãã³ãã®æ¹åãç®çãšãããã®ã§ãã ããã¯ãã³ã³ããªãã¥ãŒããããšãã®éèŠãªãã€ã³ãèšå®ã管çãããã©ã¹ãããã³ããã¿ãŒãããŒã ã«å¯ŸããŠäžå¹³äžæºãèšãå Žã§ã¯ãªãã å¿
ããã£ãŒãããã¯ããããŠæ¹åããªããã°ãããªããã§ã¯ãªããå¿
ãããã®ã¯ãæè¬ã®ã¿ å¿
ãã³ã³ããªãã¥ãŒãããããããããšã¯æè¬ã®ã¿ãã¬ãã¥ãŒãããŒãžã¯ã¡ãããšæ€èšããŠåãå
¥ãããã©ããã倿ãããã CHAPTER7 ã³ã³ãã³ãã®å
¬é å®å¿ããããªãªãŒã¹æã«å®ç§ãªããã¥ã¡ã³ãã¯ãªããå
¬éããŠãããã£ãŒãããã¯ããããŠä¿®æ£ããŠããã°ãã ã€ã³ããŒãœãŒã¹åããéã®ãã€ã³ãèšå®ã«åœãŠã¯ãŸããäžå®å
šãšããã£ãŠãŠããã®ã ãã æçµæ¿èªè
ã¯æç¢ºã«ããããæå®³ãªããã¥ã¡ã³ãããªãªãŒã¹ããŠã¯ãããªã åãå
¥ããéã®å¶çŽã¯ã¡ãããšã€ããããã³ãŒããªãŒããŒããã©ã¹ãããã³ããã¿ãŒãæç¢ºã«ãããã CHAPTER8 ãã£ãŒãããã¯ã®åéãšçµã¿èŸŒã¿ ãã£ãŒãããã¯ãã£ã³ãã«ã®äœæãäœã£ãŠãŠãŒã¶ãŒãµãŒãã€ãããã ãããã€ã³ããŒãœãŒã¹ã«é¢é£ããããªããžããªç®¡çè
ãå©çšè
ãã³ã³ããªãã¥ãŒãããŠãããæ¹ã«ã¢ã³ã±ãŒãåããã ãŠãŒã¶ãŒã®ãã£ãŒãããã¯ãäŒãã£ãŠããããšããŠãŒã¶ãŒã«å±ãããä¿¡é Œé¢ä¿ãæ§ç¯ãã ã³ã³ããªãã¥ãŒãããã£ãŒãããã¯ãä¿¡é Œé¢ä¿ãäœãããã€ãŸãã瀟å
ã§ã®å°ããDevRelé¢ä¿ãšèšããã CHAPTER11 ããã¥ã¡ã³ãã®ä¿å®ãšéæšå¥šå ããã¥ã¡ã³ããªãŒããŒã決ãããNGãªç¶æ
ã¯ãããã¥ã¡ã³ãã®è²¬ä»»ã¯å
šå¡ã«ãã = 誰ã責任ãè² ã£ãŠããªãç¶æ
ã ãŸãã«ç®¡çè
äžåšã®ãŸã³ããªããžããªããããªã£ãŠã¯ãããªããæšãŠã倿ãå«ããã³ãŒããªãŒããŒã決ãããã ããã¥ã¡ã³ãã®ä¿å®ã«å ±ãã ã³ã³ããªãã¥ãŒãããŠãããããç§°è³ãšå ±é
¬ã¯åœç¶ã ã ãã€ã³ãããã çµããã« ã€ã³ããŒãœãŒã¹ãšãã芳ç¹ããèªãããšã§ãæ®æ®µèŠèœãšããã¡ãªããã¥ã¡ã³ãã®å¥¥æ·±ããåèªèã§ããŸãããä»åã玹ä»ãããã€ã³ãããçããã®æ¥ã
ã®æ¥åãããŒã éå¶ã«å°ãã§ã圹ç«ãŠã°å¬ããã§ãã ãã®åŠã³ã掻ãããããŒã ã®ããã¥ã¡ã³ãæåãããã«è¯ããã®ã«ã§ããããããããããæ¢æ±ãç¶ããŠãããããšæããŸãã
ã¯ããã« ããã«ã¡ã¯ïŒæ°å1幎ç®ã®ãªã¹ããŸã§ãã çŸåšããžã§ãããŒãæéäžã§ããµãŒãã¹ã·ã¹ãã ã°ã«ãŒã 第äºéçºããŒã ã«æå±ããŠããŸããæå±å
ã§ã¯ããããã£ãã€ã³ãã¯ã©ãã®éçšéçºæ¥åãæ¥ã
è¡ã£ãŠããŸãã ãããã£ãã€ã³ãã¯ã©ãã§ã¯ãéçºèšèªãšããŠRubyãå©çšããŠããŸããä»åã¯ãéçºç°å¢ãæ§ç¯ããäžã§ã€ãŸãããããšãããããåŸãåŠã³ããŸãšããŠã¿ãŸããã ãã®èšäºãéããŠãç¥èã®æŽçãæ°ããªåŠã³ã®ãã£ããã«ãªãã°å¬ããã§ãã çè
ãããã£ãŒã« å
¥ç€ŸïŒ2025幎4æ å
¥ç€Ÿåã®ã¹ãã« RubyïŒååãèããããšã¯ããçšåºŠãç°å¢æ§ç¯ã¯ããããšããªã çŸåšã®æ
åœïŒãµãŒãã¹ã·ã¹ãã ã°ã«ãŒã 第äºéçºããŒã ïŒãããã£ãã€ã³ãã¯ã©ãïŒ RUBY_CONFIGURE_OPTS ã§ã®ã€ãŸã¥ã ä»åãmacOS ã§rbenv ãšããããŒã«ãå©çšããŠãRuby ã®ã€ã³ã¹ããŒã«ãè¡ããŸããããã®ãšããSSLã©ã€ãã©ãªãæå®ããŠã€ã³ã¹ããŒã«ãå®è¡ããŸããã ç°å¢æ§ç¯ãã° $ brew install openssl@3 ... $ export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@3)" $ rbenv install 3.3.3 ==> Downloading ruby-3.3.3.tar.gz... -> curl -q -fL -o ruby-3.3.3.tar.gz https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.3.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 21.0M 100 21.0M 0 0 11.9M 0 0:00:01 0:00:01 --:--:-- 11.9M ==> Installing ruby-3.3.3... ruby-build: using libyaml from homebrew ruby-build: using gmp from homebrew -> ./configure "--prefix=$HOME/.rbenv/versions/3.3.3" --enable-shared --with-libyaml-dir=/opt/homebrew/opt/libyaml --with-gmp-dir=/opt/homebrew/opt/gmp --with-ext=openssl,psych,+ --with-openssl-dir=/opt/homebrew/opt/openssl@3 -> make -j 10 -> make install ==> Installed ruby-3.3.3 to /Users/{ãŠãŒã¶å}/.rbenv/versions/3.3.3 ããã§ããããªããšãæã£ãŠããŸããã export ã³ãã³ããå®è¡ããŠãããªâŠ ç¢ºããã®ã³ãã³ããã·ã§ã«èµ·åæã®èšå®ãã¡ã€ã«ã§äœ¿ã£ãŠããæ°ãããïŒ RUBY_CONFIGURE_OPTS 㯠.zshrc ã .zsh_profile ã«èšé²ãããŠããã®ã§ã¯ïŒ ãããã .zshrc ã .zsh_profile ã®äžèº«ãèŠãŠã RUBY_CONFIGURE_OPTS ã¯èšé²ãããŠããŸããã§ããããããä»åã®ç§ã® åéãããŠããç¹ ã§ããã æ¹ããŠç°å¢æ§ç¯ã®ãã°ãèŠãŠã¿ããšä»¥äžã®ã³ãã³ããå®è¡ãããŠããŸãã ./configure make make install ãã調ã¹ãŠã¿ããšããããã¯ãœãŒã¹ã³ãŒããããœãããŠã§ã¢ããã«ãã»ã€ã³ã¹ããŒã«ããããã®æšæºçãªæé ã®ããã§ãã RUBY_CONFIGURE_OPTS 㯠ãã«ãããã»ã¹äžã«äœ¿ãããç°å¢å€æ° ã ã£ãã®ã§ãã ä»åã¯ãã®æ°ã¥ãããã£ããã«ã ãœãããŠã§ã¢ãã©ã®ããã«ã€ã³ã¹ããŒã«ãããã®ã ãã®åºæ¬çãªæµãã«ã€ããŠæŽçããŠã¿ãããšæããŸãã ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããããŸã§ ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããããŸã§ã®åŠçããïŒã€ã®ã³ãã³ããšãšãã«èª¬æããŠãããŸãã configure ./configure ã¯ããœãããŠã§ã¢ããã«ãããããã®èšèšå³ãäœæããåŠçã§ãã $ ./configure [ãªãã·ã§ã³] ./configure ã§ã¯äž»ã«ä»¥äžã®åŠçãè¡ãããŸãã 䜿çšãããŠããç°å¢ïŒOSãã©ã€ãã©ãªïŒãèª¿æ» ãã®çµæãããšã«ãç°å¢ã«æé©ãªèšå®ãã¡ã€ã«ïŒMakefile ãªã©ïŒãèªåã§äœæ ç°å¢æ§ç¯ãã°ã® ./configure ãå®è¡ãããè¡ãèŠãŠã¿ããšã --with-openssl-dir=/opt/homebrew/opt/openssl@3 ãšãããªãã·ã§ã³ãå«ãŸããŠããŸããããã¯æåã«èšå®ããç°å¢å€æ° RUBY_CONFIGURE_OPTS ã®å
容ãåæ ãããŠããããšã瀺ããŠããŸãã ä»åã® export ã³ãã³ãã¯ããã®ãªãã·ã§ã³ãæå®ããããã«äœ¿çšããã³ãã³ãã§ããããšãããããŸããã -> ./configure "--prefix=$HOME/.rbenv/versions/3.3.3" --enable-shared --with-libyaml-dir=/opt/homebrew/opt/libyaml --with-gmp-dir=/opt/homebrew/opt/gmp --with-ext=openssl,psych,+ --with-openssl-dir=/opt/homebrew/opt/openssl@3 make make ã¯ãäœæãããèšèšå³ãåºã«ããœãããŠã§ã¢ãçµã¿ç«ãŠãåŠçã§ãã $ make [ãªãã·ã§ã³] [察象ãã¡ã€ã«] make ã§ã¯ãäž»ã«ä»¥äžã®åŠçãè¡ãããŸãã configureã§äœæãããMakeFileã«åºã¥ããŠãœãŒã¹ã³ãŒããã³ã³ãã€ã« å®è¡ãã¡ã€ã«ãäœæ ç°å¢æ§ç¯ãã°ã§ã¯ã以äžã®ããã« make ãå®è¡ãããŠããŸããããã®ã³ãã³ãã§ã¯å¯Ÿè±¡ãã¡ã€ã«ãæå®ãããŠããªããããããã©ã«ãã§ Makefile ãåç
§ããŠããŸãããããŠã -j ãªãã·ã§ã³ã¯è€æ°ã®åŠçã䞊åã§å®è¡ããããã®ãã®ã§ããrbenvã§ã¯ã·ã¹ãã ã® CPU ã³ã¢æ°ãååŸããŠãèªåçã« -j ã®å€ã調æŽããŠããããã§ãã -> make -j 10 make install make install ã¯ãçµã¿ç«ãŠããããœãããŠã§ã¢ãé
眮ïŒã€ã³ã¹ããŒã«ïŒããåŠçã§ãã $ make install make install ã§ã¯ãäž»ã«ä»¥äžã®åŠçãè¡ãããŸãã Makefile ã«å®çŸ©ããã install ãšããã©ãã«ããåŠçãå®è¡ make ã«ãã£ãŠäœæãããå®è¡ãã¡ã€ã«ãæå®ããããã£ã¬ã¯ããªã«ã³ã㌠ç°å¢æ§ç¯ãã°ã§ã¯ã以äžã®ããã« Ruby ã /home/hogeta/.rbenv/versions/3.3.3 ã«ã€ã³ã¹ããŒã«ãããŠããããšãããããŸãããã®ã€ã³ã¹ããŒã«å
ã®ãã¹ã¯ã ./configure ã®å®è¡æã«æå®ãããã¹ã«åºã¥ããŠããŸãã -> make install ==> Installed ruby-3.3.3 to /Users/{ãŠãŒã¶å}/.rbenv/versions/3.3.3 äŸãããªãã°âŠ ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ã®æµãããé販ã§äŸããŠã¿ããšâŠ ./configure ã¯ãéè²©ã®æ³šæãã©ãŒã ã«å
¥åã make ã¯ã泚æãåããŠãå庫ã§ååãçµç«ãŠã make install ãååãå®¶ã«é
éã fig. ãœãããŠã§ã¢ã€ã³ã¹ããŒã«ãšé販ã®å¯Ÿå¿é¢ä¿ ãã®ããã«çœ®ãæããããšã§ããœãŒã¹ããã®ã€ã³ã¹ããŒã«æé ãã©ã®ããã«åœ¹å²åæ
ãããŠããããã€ã¡ãŒãžãããããªã£ãã®ã§ã¯ãªãã§ããããã ãŸãšã export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@3)" ã¯ãã·ã§ã«èµ·åæã®èšå®ã§ã¯ãªãrbenv install ã®ããã®èšå®ã ã£ã ä»åã®ãããªã€ã³ã¹ããŒã«æã«æšæºãšç°ãªãèšå®ã䜿çšããã±ãŒã¹ã§ã¯ããã®äžé£ã®æµããç¥ã£ãŠããå¿
èŠãããããã§ãã æ®æ®µäœæ°ãªã䜿çšããŠããããŒã«ãã³ãã³ãã§ããåçãç¥ãããšã§å¯Ÿå¿ã§ããåé¡ãå¢ãããšæããŸããã ä»åã®çµéšã掻ãããŠãä»åŸãå®è¡ãããŠããåŠçãåæããªããæ¥åã«å±ãã§ãããããšæããŸãã åŠçã®çæ§ã«åã㊠ãããã£ã«ã¯ãä»åã®ç°å¢æ§ç¯ãã¯ãããäºçްãªçåã§ãæ°è»œã«è°è«ãã§ããäžå¯§ã«ã¢ããã€ã¹ãããããæåããããŸãã ä»åã®ä»¶ãéããŠããããã£ã§ã¯ æ¥é ããæŽ»çºãªã³ãã¥ãã±ãŒã·ã§ã³ãè¡ãããŠãã ããšãæ¹ããŠå®æããŸããã ç§ã¯äŒç€Ÿã§åãããã§ã³ãã¥ãã±ãŒã·ã§ã³ã¯æ¬ ãããªãèŠçŽ ã ãšèããŠããŸãããã®ç¹ã«ãããŠããããã£ã¯éåžžã«è¯ãç°å¢ã ãšæããŠããŸãã ãããªãããã£ã§ãäžç·ã«æ¥œããåããŠã¿ãŸãããïŒçæ§ãšãäžç·ã§ããæ¥ããå¿ããæ¥œãã¿ã«ããŠããŸãïŒ åèæç® https://www.postgresql.jp/docs/17/install-make.html#CONFIGURE https://github.com/rbenv/ruby-build/blob/master/bin/ruby-build https://www.ibm.com/docs/ja/aix/7.2.0?topic=m-make-command#make__row-d3e116694
ãªãŒãã³ã¹ããŒã¹ãã¯ãããžãŒ(OST)ã瀟å
ãšç€Ÿå€ã§ããããå®è·µããäºäººã®åžäŒè
ã«ãã察è«èšäºã§ããã©ã¡ãã10äººèŠæš¡ã§è¡ãããOSTã§ããã ããŒãã¯éãã©OSTèªäœã«å¯Ÿããææã課é¡ã«ã¯è峿·±ãéãããããŸããã ã¯ããã« ãªãŒãã³ã¹ããŒã¹ãã¯ãããžãŒïŒOpen Space Technologyã以äžOSTïŒã¯ãåå è
ãèªç±ã«ããŒããåºãåããèªçºçã«è©±ãåãå Žãäœãææ³ã§ãã ã4ã€ã®ååãããããŸãã ããã«ãã£ãŠãã人ã¯ã誰ããé©ä»»è
ã§ãã äœãèµ·ããããšããããèµ·ããã¹ãå¯äžã®ããšã§ãã ãã€å§ãŸãããšãå§ãŸã£ãæãé©åãªæã§ãã ãã€çµããããšãçµãã£ãæãçµããã®æã§ãã èŠããã«ãäžäžã»åœ¹å²é¢ä¿ãªã誰ã§ãåå ããŠããããOSTã§è©±ãããããšã¯å
šéšåŠã³ãšãªãããŸãããã€è©±ãåºããŠããããããã€è©±ãçµããŠãããã§ããã£ãŠããšã§ãããã£ã¡ãããããã£ãŠããšã§ç¹ã«æè¡å匷äŒãããã¯ã«ã³ãã¡ã¬ã³ã¹ã®äžã§ããè¡ãããå Žã®äœãæ¹ã«ãªããŸãã 詳现ã¯ã ããªãŒãã³ã¹ããŒã¹ãã¯ãããžãŒïŒOSTïŒãã§ã°ã°ã£ãŠã¿ãŠãã ããïŒ ïŒä»ã«ãèãšãããªã³ãªã©ã4 ã€ã®åœ¹å²ãªããŠã®ããããŸããïŒ ä»åã¯ã瀟å€ã³ãã¥ããã£ãšç€Ÿå
ããŒã ã§ããããOSTãå®è·µããèŠå·ïŒç§ïŒãšè¥¿åããã«ããã®éãã«ã€ããŠéè«ããããšããã£ãã®ã§ãããããã¿ã«å¯Ÿè«é¢šã«èšäºã«ããŸããã åžäŒè
ãããã£ãŒã« èŠå·ïŒInnerSource Commons Japan Meetupã§ãããŒã ã®å£ãã¶ã£å£ãïŒå£ã®ä¹ãè¶ãæ¹ãäžç·ã«èãããïŒããšããããŒãã®OSTãäž»å¬ãã€ã³ããŒãœãŒã¹ã®å®è·µè
ã³ãã¥ããã£ã§ã®ãã¡ã·ãªããŒã¿ãŒãåãããïŒInnerSource Commons Japanã¯ã InnerSource Commons ã®æ¥æ¬ããŒã«ã«ã³ãã¥ããã£ã§ããOSSã®éçºã®ä»æ¹ã»ã³ãã¥ããã£ã®åœ¢ææ¹æ³ãªã©ãããšããã瀟å
ã«åãå
¥ããããããšãããã®ã§ããïŒ è¥¿åïŒç€Ÿå
ã§ãè·å Žã§ã®æ©ã¿äºããããŒãã«ããOSTã宿œãåŽåçµåã®å·è¡å§å¡é·ãšããç«å ŽããäŒç€Ÿå
ã®ã³ãã¥ãã±ãŒã·ã§ã³æŽ»æ§åãé¢ä¿æ§éžæã«åãçµãã å¯Ÿè« â ããããã®OSTã®ããŒããšåå è
å±€ã«ã€ããŠæããŠãã ãã èŠå·ïŒç€Ÿå€OSTã§ã¯ãã€ã³ããŒãœãŒã¹ çµç¹å
ã®å£ãšæããŠããããšã¯ãªã«ãïŒããšãã倧ããŒãã§éå¬ããŸãããåå è
ã¯çŽ10åã§ãã€ã³ããŒãœãŒã¹ã«é¢å¿ãããããããã¯æ¢ã«å®è·µããŠããæ¹ã
ãéãŸããŸãããæ¥çãäŒç€Ÿãéãæ¹ã
ãéãŸãããäžäžé¢ä¿ã®å£ããããŒã éã®å©å®³é¢ä¿ããªã©ã«ã€ããŠè°è«ããŸããã è³æã¯å
¬éããŠãããã¡ãã§ãã 西åïŒç€Ÿå
OSTã§ã¯ãè·å Žã§ã®æ©ã¿äºããšãã倧ããŒãã§ãéå¶ãµã€ããããããŠ10åã»ã©ãåå ããŸãããOSTãã®ãã®ã®éŠŽæã¿ãèããšæã£ãŠããã®ã§ã€ãã³ãã¿ã€ãã«ãããŠããªã³ã«ãã§ããšãããæ±ããŠãã¢ã€ã¢ã€ã誰ããšè©±ãåã£ãŠã¿ãŸãããïŒããšãã謳ãæå¥ã§ãOSTããšããåèªã¯ããŸãåºããã«åéãããŸãããããŒããšããŠã¯ãæ°èŠäºæ¥ã«ã€ããŠããä»åŸã®ãã£ãªã¢ã«ã€ããŠããè©äŸ¡ã®äžãæ¹ããªã©ãããªãå
·äœçãªè·å Žã®èª²é¡ãæãããŸãããå
šäžè¬ç€Ÿå¡ã察象ã«ããã®ã§ãããåå è
ã®å€§åããšã³ãžãã¢è·ã§ããããã®ãããã¯ã€ãã³ãåå ã«å¯Ÿããéšçœ²ããšã®æåã®å·®ããã£ãã®ããªãšæããŸãã â åå è
ã®ç©æ¥µæ§ãè°è«ã®æ·±ãããªãŒãã³ãã«éãã¯ãããŸãããïŒ èŠå·ïŒç€Ÿå€ã®å Žåãã¿ãªããèªçºçã«åå ãããŠããã®ã§ãç©æ¥µæ§ãé«ãã£ãã§ãããç¹ã«ãã€ã³ããŒãœãŒã¹ã«ã€ããŠç¥èŠããã人ã»äœããã®åœ¢ã§å®è·µããŠããäººã»æ©ã¿ãæ±ããŠãã人ãéãŸã£ããã®ã§ãéåžžã«æ¿ãè°è«ãã§ããŸãããæ°ããåå è
ãšéå¶ã®æ¹ã®äººæ°ãã©ã³ã¹ãè¯ãã£ããšæããŸããäŒç€Ÿåãå
·äœçãªäºäŸãåºããªããããæ¯èŒçãªãŒãã³ã«è©±ããé°å²æ°ããããŸãããç°ãªãäŒç€Ÿã®æ¹ã
ã ããããããããããã解決ãããããã¡ã§ã¯ããããŠããããšãã£ãçµéšãççŽã«å
±æã§ãããšæããŸãã 西åïŒç€Ÿå
ã®å Žåã¯å°ãéããŸããã瀟å
ã®ã»ãããŒçšäŒè°å®€ãåããŠã®éå¬ã§ããã®ã§ããšããããæ¥ãŠã¿ãããšãã声ããããåå ã®åæ©ãæ§ã
ã§ãããã»ãã·ã§ã³ãã¹ã¿ãŒããããšãã©ã®åãæŽ»çºã«è°è«ããããŠããŸããã èŠå·ïŒå°è±¡ã«æ®ã£ãã»ãã·ã§ã³ãšããããŸããïŒ è¥¿åïŒèªåãåå ããã®ã§ãããå¶æ¥ã®æ¹ãåºããããšã³ãžãã¢ã«ããããããšãäŒããã«ã¯ããšããããŒãã®ã»ãã·ã§ã³ãå°è±¡çã§ããããšã³ãžãã¢ã«ã¯ããããããããã§ãããšäŒãããããããã£ãŠã©ããã£ããå®çŸã§ããŸããïŒãã£ãŠèãã»ããåã®ããã«ãªããããšãã話ã§çãäžãããŸããããã ãããã§ïŒã€æ°ã¥ãããããŸããŠãåã瀟å
ã§ããã¯ã°ã©ãŠã³ããå
±éããŠããã»ããè°è«ããããã ãããšæã£ãŠããã®ã§ãããããã瀟å€ã®äººå士ã®ã»ããåŸè
ãããªããããæ·±ã話ããã®ã§ã¯ãªãããšããããšã«ãæ°ã¥ããŸãããããã¯æ£çŽãªãšããç²ç¹ã§ããã èŠå·ïŒããããããããããŸãããã瀟å€OSTã§ã¯ãããšããšã®äººéé¢ä¿ãèãåãæ©ã¿ã ãã«ãã©ãŒã«ã¹ããããšãã§ããŠæ·±ãçžè«ã§ããããªããŠããšã¯ã«ãŠã³ã»ã©ãŒã«çžè«ããããšããããã£ãããšã«è¿ãã®ããã 西åïŒããå°ã人æ°ãéãŸãããªãšæã£ãŠãããã§ãããåå è
åéæã«ãè·å Žã§ã®æ©ã¿ãã®äŸãšããŠæãããã®ãããã£ãªã¢ãã©ã³ãããããŒã ããžã§ã³ããªã©ã§ãéããå°è±¡ãäžããŠåå ã®ããŒãã«ããããŠããŸã£ãŠããå¯èœæ§ããããŸãããã£ãšã©ã€ããªäŸãå€ãçšæããŠãããã£ããããããŸããã â å Žã®é°å²æ°ã¥ããã§å·¥å€«ããç¹ã¯ãããŸããïŒ èŠå·ïŒç€Ÿå€OSTã§ã¯WeWorkãšããå Žæãéžã³ãããªã³ã¯ïŒããŒã«ãïŒïŒãçšæããã®ã奜è©ã§ããïŒãããŒã«é£²ã¿ãªããã¯æé«ããå Žæã®éããã»ãããïŒç©ºæ°æïŒãªã©ãéåžžã«è¯ãã£ãããšãã声ããããŸããããªã©ãã¯ã¹ããé°å²æ°ã察話ãä¿é²ãããšæããŸãã 西åïŒèŠå·ããã®ç€Ÿå€OSTãåèã«ããã¡ããã¢ã«ã³ãŒã«ãå«ããããªã³ã¯ãšãããšã¯ãµã³ãã€ããããã«ãããªã©ã®è°è«ã®åéã«çæã§é£ã¹ããã軜é£ãçšæããŸãããé£ã¹ãããšã«éäžããŠããŸããªãããã«ç®žããã©ãŒã¯ãå¿
èŠãªãªãŒããã«ãªã©ã¯é¿ããŸãããéå§ãŸã§ã¯ãããã®BGMãæµãããããã®ã§ããåå 人æ°ãå°ãªãããšããã£ãŠãæåã¯å°ãéããã®ç©ºæ°ã§ããã èŠå·ïŒãªãã»ã©ããBGMãå Žäœãã¯ã»ããšå€§äºã§ããããWeWorkã¯ããããæ®éã«ã³ã¯ãŒãã³ã°ã¹ããŒã¹ãšããŠåããŠããæ¹ãããäžã ã£ãã®ã§ãã«ãã§ã®ãããªç掻é³ããããããªæãã§ããããããããã£ãã®ãããããªãã 西åïŒãããã瀟å
OSTã§ãã£ãŠãã³ãã¥ããã£ã¹ããŒã¹ãªã©ãããåºãå Žæã§ãã£ãŠãããã£ãã®ããªãéäžåå ããŠãããã人ãããããã â ã»ãã·ã§ã³ã®é²ãæ¹ã«éãã¯ãããŸãããïŒ èŠå·ïŒç€Ÿå€OSTã§ã¯ã1ã»ãã·ã§ã³35åïŒè°è«30åãçºè¡š5åïŒã¯ã¡ããã©ããã£ãããšããè©äŸ¡ãåŸãŸããããŸãã2ã»ãã·ã§ã³ç®ã§ã¯ããã®å Žã®æµãã§æ·±è¿œãããããšããã«ã€ããŠããŒããæ°ããäœæããããšããæè»ãªå¯Ÿå¿ãè¡ããŸããããã ãåžäŒè
åŽãããæ·±å ãããããšæ±ºããŠããŸã£ããšããããããããã¯ããã£ãã®ãæªãã£ãã®ãã 西åïŒç€Ÿå
OSTã§ãã»ãŒåæ§ã®æéé
åã§ããããããŒãããæŒé£ã®å Žæã宎äŒã®ãåºéžã³ãããããã£ãªã¢ãã©ã³ã®æ©ã¿ããŸã§å¹
åºããæéé
åã®èª¿æŽãé£ããå Žé¢ããããŸããããŸãä»åäžè¬åå è
ãå°ãªãããšããç§å«ãéå¶åŽãå
šå¡ã»ãã·ã§ã³ã«å
¥ã£ãŠããŸã£ãããšã§ãå³å¯ãªã¿ã€ã ããŒããåºæ¥ãªãã£ãã®ã¯åçã§ãã â OSTå®è·µããåŸãæå€§ã®åŠã³ã¯äœã§ããïŒ èŠå·ïŒãInnerSourceãšããåã軞ã§ããæ©ã¿æ¹ã®è»žã«å¯Ÿããèãæ¹ã¯å€æ§ã ããšããæ°ã¥ãã倧ããã£ãã§ãããŸããåå è
ããã¯ã宿éå¬ãããïŒããšãã声ããããç¶ç¶çãªã³ãã¥ããã£åœ¢æã®å ŽãšããŠã®äŸ¡å€ãæããŸããã 西åïŒã瀟å
ã®ç¥ããªãäººã«æ©ã¿ã話ãããšã®ããŒãã«ãã«å¯ŸããèªèãåŸãã®ãšãéšçœ²ã«ãã£ãŠæåã«å·®ããããããšãåèªèããŸãããä»ã«ã¯ãæ©ã¿ãããã¢ã€ã¢ã€ããšãããã€ãã¹ã®ããŒãã§åãããããããŸã®è·å Žç°å¢ãããããããæ¹æ³ãã®ãããªãã©ã¹ã®ããŒãã§æ€èšããã¹ãã ã£ãããšæããŸããããã ãåå è
ããã¯å¥œè©ã®å£°ãå€ãèãããã®ã§æ¬¡åã«ã€ãªããããšæã£ãŠããŸãã â ãïŒäººã話ããããšãããããŸããïŒã§ã¯ã瀟å
ã»ç€Ÿå€OSTã®ã話ãããä»åŸã®OSTéå¬ã«é¢ããæåèŠå ããŸãšããŠã¿ãããšæããŸãã ããã OSTã®æåèŠå ïŒïŒ ææ¬²ãã倿§ãªåå è
ãéãã èªçºçã«åå ããããšãã人ãå€ãã»ã©è°è«ã¯æŽ»çºã«ãªãã ç°ãªãéšçœ²ã»äŒç€Ÿã»æ¥çã®äººãéãŸããšãççŽãªæèŠäº€æãå
·äœçãªçµéšå
±æãããããã æ°èŠåå è
ãšéå¶ã¡ã³ããŒã®äººæ°ãã©ã³ã¹ããããšå®å¿æãçãŸããã é©åãªããŒãèšå® 瀟å€OSTã§ã¯ãçµç¹ã®å£ããšããæœè±¡åºŠã®ããããŒãã§åºããã®ããè°è«ãå¯èœã«ãªã£ãã 瀟å
OSTã§ã¯ãè·å Žã®æ©ã¿ããããŒãã«ããããäŸç€ºãããè°é¡ã®éããšç€Ÿå
ã®äººã«è©±ãããšã«å¯Ÿããå¿ççããŒãã«ãªã©ãããåå è
ãå¢ãã«ããã£ãã ã©ã€ããªããŒããå
·äœäŸãæ··ããããšã§ãåå ã®ããŒãã«ãäžããããã å®å¿æããå Žã¥ãã 瀟å€OSTã§ã¯äººéé¢ä¿ãåžèãªããããããççŽã«æ©ã¿ãæ·±ã話ããããã£ãã 瀟å
OSTã§ã¯é¢ä¿æ§ãè¿ãåãããŒãã«ãã£ãŠã¯è©±ãã«ãããåºãå Žåããããããã¯ããŒãéžã³ãã¡ãããšèããå¿
èŠãããç¹ã WeWorkãšãã£ãå¿«é©ãªå Žæéžã³ãããªã³ã¯ïŒããŒã«å«ãïŒã®çšæã奜è©ã éãã§ãããç©ºæ°æã察話ãä¿é²ããæèŠäº€æãèªç¶ã«é²ãããããããçæŽ»é³ããããããªç©ºéãããã®ããã ã¯ããŒãºããªå ŽããããªãŒãã³ãªå Žãããããã ã ãŸãšã 瀟å€ãšç€Ÿå
ãã©ã¡ããè¯ããšããããšã¯ãããŸããããOSTã¯å Žã®ãã¶ã€ã³ã«ãã£ãŠå€§ããææãå€ããããšãä»å2ã€ã®OSTã®çµæãæ¯èŒããããšã§ããããŸããã ã¿ãªãããOSTãå®è·µããéã«ã¯ããåå è
ããããŒãããå Žãã®ç¹æ§ãèæ
®ãããã¶ã€ã³ãå¿ãããŠã¿ãŠãã ããïŒïŒ OSTãã£ã¡ãããã§ããïŒïŒ
ã¯ããã« ããã«ã¡ã¯ããããã£ã®ä»²äžã§ãã ä»åã¯ãTerraformã䜿çšããŠECSã¯ã©ã¹ã¿ãŒã§ãContainer Insightsããæå¹ã«ããæ¹æ³ã説æããŸãã Container Insightsãšã¯ ãContainer Insightsãã¯ãAmazon EKSãAmazon ECSã§åäœããã³ã³ããåãããã¢ããªã±ãŒã·ã§ã³ããã€ã¯ããµãŒãã¹ã®ç£èŠã»åæãè¡ãAWSãµãŒãã¹ã§ããã³ã³ããã®å¥å
šæ§ãããã©ãŒãã³ã¹ãå
æ¬çã«ææ¡ã§ããŸãã å®ã¯ãContainer Insightsãã«ã¯ããªãã¶ãŒãããªãã£ã匷åããã Container Insightsããšããããã1ã€ã®èšå®ããããŸãã ããªãã¶ãŒãããªãã£ã匷åããã Container Insightsãã¯ããContainer Insightsãã®é²åçã§ãåŸæ¥ã®ç£èŠæ©èœã倧å¹
ã«æ¡åŒµãããµãŒãã¹ã§ãã åŸæ¥ã®ãContainer Insightsãã¯ãCPU䜿çšçãã¡ã¢ãªäœ¿çšéãªã©ã®ã€ã³ãã©ã¬ãã«ã®ç£èŠãäžå¿ã§ããããããªãã¶ãŒãããªãã£ã匷åããã Container Insightsãã§ã¯ãAPIã®ã¬ã¹ãã³ã¹æéããšã©ãŒçãªã©ãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®è©³çްãªè¿œè·¡ãå¯èœãšãªã£ãŠããŸãã ããªãã¶ãŒãããªãã£ã匷åããã Container Insightsãã䜿çšããããšã§ãéå®³ã®æ ¹æ¬åå ãããè¿
éã«ç¹å®ã§ããããã«ãªããŸãã Terraform ã§ Container Insights ãæå¹ã«ããæ¹æ³ ã¯ã©ã¹ã¿ãŒã®èšå®ã«ä»¥äžã®é
ç®ãå
¥ãããšãContainer Insightsããæå¹ã«ãªããŸãã resource "aws_ecs_cluster" "blacklist_db_update_batch" { name = "test-cluster" setting { name = "containerInsights" value = "enabled" } } å
ã»ã©ç޹ä»ããããªãã¶ãŒãããªãã£ã匷åããã Container Insightsããäœ¿ãæ¹æ³ã調ã¹ãŠã¿ãŸããã ã©ããã enhanced ãšããèšå®ãããããã§ãã resource "aws_ecs_cluster" "blacklist_db_update_batch" { name = "test-cluster" setting { name = "containerInsights" value = "enhanced" } } èšå®ã§ããŸããïŒ ãããã« ä»åã¯ãTerraformã䜿çšããŠECSã¯ã©ã¹ã¿ãŒã§ãContainer Insightsããæå¹ã«ããæ¹æ³ã説æããŸããã ç°¡åã«èšå®ã§ããã®ã§ããã²ããªãã¶ãŒãããªãã£ã匷åããã Container Insightsãã®èšå®ãæ€èšããŠã¿ãŠãã ããã