ã¯ããã« 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ãã®èšå®ãæ€èšããŠã¿ãŠãã ããã
ã¯ããã« çããããã«ã¡ã¯ïŒ æ°åäžå¹Žç®ã®å®®æã§ãïŒ çŸåšã®æ¥åã§ã¯ãäž»ã«OpenID Connect(OIDC)ã䜿çšããåºå¹¹ã·ã¹ãã ãéçšããŠããŸãã ãã®ããä»åã¯ãæ¥åãéããŠåŠãã OIDCã®åºç€ã«ã€ããŠçºä¿¡ããŠãããããšæããŸãã ãã®èšäºã®åæ ä»åã®ãã³ãºãªã³ã¯Windowsã®PowerShellãåæã«ããŠããŸãã ãããããMacãLinuxã§ãåäœãããšèããŠãããŸãããä¿èšŒã¯ã§ããŸããã 以äžã®èšäºçãé²èЧããOIDCã®æŠèŠãããã£ãŠããåæã§èª¬æããŸãã https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe ãã³ãºãªã³æºå ä»å䜿çšãããœãŒã¹ã³ãŒãã®ã¯ããŒã³ ãŸããæºåãšããŠä»å䜿çšããOIDCã®ãµãŒã㌠django-oidc-provider ãGit cloneããexampleãã£ã¬ã¯ããªã«ç§»åããŸãã $ git clone https://github.com/juanifioren/django-oidc-provider.git $ cd django-oidc-provider/example ãã®exampleãã£ã¬ã¯ããªã«ã¯ãå®éã«django-oidc-providerãå°å
¥ããéã®OpenID Provider(OP)ã®å®è£
äŸããããŸãã Dockerã³ã³ããã®äœæ exampleãå°ãå€ããã®ãŸãŸã§ã¯åããªãã£ãç¹ãšä»åã®ãã³ãºãªã³ã®éœåäžãDockerFileã®å
容ã以äžã«å€æŽããŠãã ããã â»ãããŸã§ãã¹ãã§ãããããã¹ãŒããŒãŠãŒã¶ãŒæ
å ±ããã¡ã€ã«ã«çŽæžãããŠããŸãã FROM python:3.10 WORKDIR /app COPY . /app RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt RUN python manage.py migrate RUN python manage.py creatersakey # ç°å¢å€æ°ã§ããã©ã«ãã®ã¹ãŒããŒãŠãŒã¶ãŒæ
å ±ãèšå® ENV DJANGO_SUPERUSER_USERNAME=admin ENV DJANGO_SUPERUSER_EMAIL=admin@example.com ENV DJANGO_SUPERUSER_PASSWORD=admin # ã¹ãŒããŒãŠãŒã¶ãŒãäœæïŒæ¢åã®å Žåã¯ã¹ãããïŒ RUN python manage.py createsuperuser --noinput || echo "Superuser already exists" EXPOSE 8000 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] 以äžã®ã³ãã³ãã§å®éã«èµ·åããŠã¿ãŸãããïŒ $ docker build -t django-oidc-provider . $ docker run -d -p 8000:8000 django-oidc-provider http://localhost:8000 ã§ä»¥äžã®ç»åã確èªåºæ¥ããæåã§ãã ãã¹ãClientã®è¿œå Create your clients ãã¯ãªãã¯ããŸãããã ããã§ããclientã¯OPã䜿çšããã¯ã©ã€ã¢ã³ãã®ããšãæããRelying Party(RP)ãšãåŒã°ããŸãã ã¯ãªãã¯åŸããã°ã€ã³ç»é¢ã衚瀺ããããããIDããã¹ã¯ãŒãã©ã¡ãã admin ãå
¥åããŸãããã ãã°ã€ã³åŸã¯ å·Šãµã€ãããŒã®Clientsã®é£ ã«ãã +Add ãã¯ãªãã¯ããŸãã ãã®åŸã以äžãå
¥åããŸããïŒãã以å€ã¯ãã®ãŸãŸã§OKã§ãïŒ Name: ãã¹ã Response types code id_token id_token token Redirect URIs: http://example.com Scopes: openid profile email address phone å
¥åäŸ ãã®åŸãSaveãã¯ãªãã¯ããçæããclientã確èªãããšä»¥äžã®ããã«Client IDãšClient Secretãèªåçæãããããšã確èªã§ããŸãïŒä»¥äžã¯ãããŸã§äŸã§ãïŒã ãããã®æ
å ±ã¯ããªã¯ãšã¹ããéä¿¡ããclientãæ£èŠã®clientã§ããããšãOPã確èªããããã«äœ¿çšããŸãã ãã®åŸã®ãã³ãºãªã³ã§äœ¿çšããããããããã®æ
å ±ãã¡ã¢ããŠãããŸãããã ãã¹ããŠãŒã¶ã®äœæ å·Šãµã€ãããŒã®Usersã®é£ ã«ãã +Add ãã¯ãªãã¯ããŸãã ãããšã以äžã®ç»é¢ã«é·ç§»ããããã以äžã®æ
å ±ãå
¥åãSaveãã¯ãªãã¯ããŸã Username: test_user01 password: test_user01 ãããšã以äžã®ç»é¢ãžé·ç§»ãããã First name: user01 Last name: test Email address: example@google.com ãšå
¥åãSaveãã¯ãªãã¯ããŸãã ããã§ãäžæºåã¯å®äºããŸããã ãã³ãºãªã³ å®éã«èšå®ããOPã«å¯ŸããŠãã°ã€ã³ããŠã¿ãŸãããã ä»åã¯ãOIDCã®ã·ãŒã±ã³ã¹ã®äžã§æãäžè¬çãªAuthorization Code Flowã§è©ŠããŠã¿ãŸãã ãã°ã€ã³ïŒAuthorization RequestïŒ åãã«ãã©ãŠã¶ã® ã·ãŒã¯ã¬ãããã©ãŠã¶ã¢ãŒã ãç«ã¡äžãã以äžã®URLã匵ãä»ããŠãã ããã http://localhost:8000/authorize/?client_id=ãå
ã»ã©çæãããClient IDã&redirect_uri=http://example.com&response_type=code&state=123456&scope=openid+profile+email ãã®URLã¯ãOPã«å¯ŸããŠèªå¯ã³ãŒãã®çºè¡ãèŠæ±ããAuthorization Requestã§ãã ããã§ã¯ã /authorize ãšã³ããã€ã³ããæå®ããŠããŸããããšã³ããã€ã³ããã©ã®URLã«ååšãããã®æ
å ±ã¯ã .well-known/openid-configuration ãåç
§ããã°ç¥ãããšãã§ããŸãã å®éã«ãã©ãŠã¶ã§ã¢ã¯ã»ã¹ããŠã¿ããšãä»å䜿çšãã authorization_endpoint çã®URLãèšèŒãããŠããã®ã確èªã§ããŸããããã¯OIDCã®DiscoveryïŒçºèŠïŒæ©èœãšåŒã°ããŸãã 以äžã«äž»èŠãªãã©ã¡ãŒã¿ã®è©³çްãäžéšæç²ããŠèª¬æããŸãã client_id : client(RP)ã®èå¥å redirect_uri : èªèšŒçµäºåŸã«ãªãã€ã¬ã¯ããããURIã response_type : èªèšŒåŸã«ã©ã®æ
å ±ãè¿ããïŒAuthorization Code Flowã ãš code ãæå®ïŒ scope : ClientãOPã«èŠæ±ããããŠãŒã¶ãŒæ
å ±ã®ç¯å²ïŒãããã£ãŒã«ãã¡ãŒã«ã¢ãã¬ã¹ãªã©ïŒãæå®ããŸããããã§èŠæ±ããã¹ã³ãŒãã«å¯Ÿå¿ããæ
å ±ããåŸã®UserInfoã¬ã¹ãã³ã¹ã§ååŸã§ããŸãã 匵ãä»ããåŸEnterãæŒããšããã°ã€ã³ç»é¢ã衚瀺ããããããå
ã»ã©äœæãããŠãŒã¶ã§ãã°ã€ã³ããŸãã 以äžã®ç»é¢ãžç§»åããŸãã ãã®ç»é¢ã¯ãClientã«å¯ŸããŠä»¥äžã®æ
å ±ãæž¡ãããšããŠãŒã¶ã«å¯ŸããŠèš±å¯ãæ±ããŠããããšãæå³ããŸãã ããã§ã¯Acceptãã¯ãªãã¯ããŸãã ãã®åŸãexample.comã«ãªãã€ã¬ã¯ãããŸãã ãªãã€ã¬ã¯ãããéã®URLãã©ã¡ãŒã¿ã«ååšããcodeã¯èªå¯ã³ãŒãã®ããšã衚ããããŒã¯ã³ã®çºè¡ã«äœ¿çšããŸãã ãã®èªå¯ã³ãŒãã䜿çšããŠãå®éã«ããŒã¯ã³ãçºè¡ããŠã¿ãŸãããã 以äžã®ã³ãã³ããPowerShellã«åŒµãä»ããŸãããã ãã®ã³ãã³ãã¯Token Requestãéä¿¡ãããã®ã§ãããOPã«å¯ŸããŠããŒã¯ã³ã®çºè¡ãç³è«ããŸãã $ curl -s -X POST -H "Cache-Control: no-cache" -H "Content-Type: application/x-www-form-urlencoded" "http://localhost:8000/token/" -d "client_id=ãå
ã»ã©çæãããClient IDã" -d "client_secret=ãå
ã»ã©çæãããClient Secretã" -d "code=ãçºè¡ãããèªå¯ã³ãŒãã" -d "state=123456" -d "redirect_uri=http://example.com" -d "grant_type=authorization_code" ãããšã以äžã®äŸã®ãããªã¬ã¹ãã³ã¹ãè¿ã£ãŠããŸãã { "access_token": "df6e0afa50e14a879f151feda46295b7", "refresh_token": "d6649365913f4c56abefe3f2b8b8732d", "token_type": "bearer", "expires_in": 3600, "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1YjBmY2I5NDI4NTI1YjM0MGRlZWM4ZjJlNTFhYmNlIn0.eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwMDAiLCJzdWIiOiIxIiwiYXVkIjoiOTI0NDIyIiwiZXhwIjoxNzU0OTgxMTkwLCJpYXQiOjE3NTQ5ODA1OTAsImF1dGhfdGltZSI6MTc1NDk3NjE0MiwiYXRfaGFzaCI6ImlkRHRjVjdvYzl4Ny1yTFNoSTg5bHcifQ.fzlqjsHJycYrSx2EsGjsGsgLZC3z4mRVpKPATG0D_mU6bDD7ZLv4G3Sk5kXmibBekaLR5zBIUr84ZmQ77qo3CdARxLOn7rB4CLE3-9d-JEoQpwI9uHac3iQXdx6HVN2zBQJjm6CPkx8t0Z9-d1ErRzJiAeiJChPq4JbxsmtFJzgFwssdKeUdMwgsjR64wIY8uP9KV9NFG3X0vKfnAVSPdsp9QpfV68xkqwmhnotKHShSbDYsNPOAIGvryCxyb74h87BEVxk8OHmg79SsyXkf2eBpaA9ykg43EK-tMh2MZg3dfLqoFb0ZbUYgojJACMBsXAo9_WdF5MeEUczMsSs8HQ" } äž»èŠãªéšåãæç²ãããšã Access Token : ãŠãŒã¶æ
å ±ãååŸããããã«äœ¿çšãããããŒã¯ã³ã§ãã Refresh Token : ID TokenãšAccess Tokenãåçæããéã«äœ¿çšãããããŒã¯ã³ã§ãã IDããŒã¯ã³ ã¯: OPãæ£èŠãªãã®ã§ããããšãšããŠãŒã¶ãŒãèªèšŒãããŠããããšã蚌æããããŒã¯ã³ã§ãã IDããŒã¯ã³æ€èšŒ ãã®åŸãID Tokenã®äžèº«ãæ€èšŒããOPãæ£èŠãªãã®ã§ããã確èªããŸããä»åã¯æåã§IDããŒã¯ã³ãæ€èšŒããŸãããã 以äžã®Webãµã€ã(jwt.io)ã«ID Tokenã匵ãä»ããŠã¿ãŸãããã https://www.jwt.io/ja 匵ãä»ããåŸã以äžã®ç»é¢ãå³åŽè¡šç€ºãããã¯ãã§ãã äž»èŠãªéšåã以äžã«æç²ããŸãã ããããŒéšå alg : 眲åã¢ã«ãŽãªãºã kid : 眲åã®æ€èšŒã«äœ¿çšããéµã®id ãã€ããŒãéšå iss : ID Tokenã®çºè¡å
ã§URLã衚瀺ãããŸãã sub : ãŠãŒã¶ã®èå¥åïŒIDïŒã瀺ããŸãã aud : ID Tokenã䜿çšããClientã瀺ããŸãã exp : ID Tokenã®æå¹æéïŒUnix timeïŒ at_hash : ã¢ã¯ã»ã¹ããŒã¯ã³ãããã·ã¥åãããã®ãã¢ã¯ã»ã¹ããŒã¯ã³ãæ£ãããã®ãã©ãããæ€èšŒããããã«äœ¿çš ãããã®å€ãå®éã®ãã®ãšèŠæ¯ã¹ããšæ£ãããã®ã§ããããšã確èªã§ããã¯ãã§ãã ãŸããIDããŒã¯ã³ã¯ . ã§åºåããã3ã€ã®éšåïŒããããŒã»ãã€ããŒãã»çœ²åïŒããæ§æãããŠãããæåŸã®éšåã眲åã§ãã http://localhost:8000/jwks ã«ã¢ã¯ã»ã¹ãããšçœ²åã®æ€èšŒã«äœ¿çšããå
¬ééµã®æ
å ±ããããŸãã IDããŒã¯ã³ã®çœ²åã¯ãããããŒãšãã€ããŒãã . ã§é£çµãããã®ããèšç®ããããã·ã¥å€ããOPãæã€ç§å¯éµã§æå·åãããã®ã§ããRPåŽã§ã¯ãOPã®å
¬ééµã䜿ã£ãŠãã®çœ²åã æ€èšŒ ããŸããããã«ãããããŒã¯ã³ãæ¹ãããããŠãããã確ãã«ãã®OPããçºè¡ããããã®ã§ããããšã確èªã§ããŸãã詳ããæ€èšŒããã»ã¹ã¯è€éãªããçç¥ããŸãã â»äœè«ã§ãããjwt.ioã®ä»æ§äžID Tokenãã眲åã®æ€èšŒã«å¿
èŠãªå
¬ééµããå·Šäžã«èªåã§å²ãåºããŠãããŸããå®éã«ã http://localhost:8000/jwks ã®æ
å ±ãšæ¯èŒããŠã¿ããšäžèŽããã¯ãã§ãã UserInfo Request IDããŒã¯ã³ã®æ€èšŒãçµäºããåŸãå®éã«ãŠãŒã¶æ
å ±ãååŸããŸãã 以äžã®ã³ãã³ããPowerShellã§å©ããŠãã ããã $ curl -s -X GET -H "Authorization: Bearer ãçºè¡ãããã¢ã¯ã»ã¹ããŒã¯ã³ã" "http://localhost:8000/userinfo/" ãããšãAuthorization Requestã®Scopeã§æå®ãããprofile, emailã®æ
å ±ãååŸã§ããŸãã { "sub": "2", "given_name": "user01", "family_name": "test", "nickname": "test_user01", "email": "example@google.com" } æåŸã« OIDCã¯ã ãããããã®ãããªæµããšãªã£ãŠããŸãã ä»åã¯äžé£ã®æµããæäœæ¥ã§è¡ããŸããããå®é䜿çšããéã¯ãOIDCã®Clientçšã©ã€ãã©ãªã䜿çšãããããOPã®ã¢ãã¬ã¹ïŒissãã©ã¡ãŒã¿ïŒãClient ID, Client Secretããæå®ããŠããŸãã°ãããšã¯ã»ãŒãã¹ãŠèªåã§ãã£ãŠãããŸãã
æŠèŠ ããã«ã¡ã¯ããããã£ã®å±±ç°ã§ãã 2025/07/17ã«ãECSçµã¿èŸŒã¿Blue/Greenãããã€ããªãªãŒã¹ãããŸããã https://aws.amazon.com/jp/blogs/news/accelerate-safe-software-releases-with-new-built-in-blue-green-deployments-in-amazon-ecs/ åŸæ¥ãECSã®çµã¿èŸŒã¿ãããã€æ©èœã¯ããŒãªã³ã°ã¢ããããŒãã«ãã察å¿ããŠããããBlue/Greenãããã€ãè¡ãããã«ã¯CodeDeployã䜿çšããå¿
èŠããããŸããã ä»åã®å€æŽã«ããECSã ãã§Blue/Greenãããã€ãå¯èœã«ãªã£ãã»ããCodeDeployã«ããå¶çŽããªããªããŸããã ãããã®å€æŽç¹ã«ã€ããŠè§£èª¬ããŠãããŸãã ALB + ECSæ§æã®å Žåã«åŸæ¥ãšæ¯ã¹ãŠã©ããªããã解説ããŸã CodeDeploy Blue/Greenãããã€ãšæ¯ã¹ãŠå€ããããš åã«CodeDepoloyãèŠããªããªãããšããç¹ä»¥å€ã«ã仿§ã®éãã¯ããã€ããããŸãã åãæ¿ãæ¹æ³ (äžèšã¯ãã¹ããªã¹ããŒ(ã«ãŒã«)æå¹æã®ãã¿ãŒã³ã§ãããç¡å¹æã¯ãã¹ããã©ãã£ãã¯ã®ã·ããã¯ã¹ããããããŸã) åºæ¬çãªåäœåçã¯CodeDeployã®ãã®ãšåãã§ããã以äžã®ç¹ã§ç°ãªããŸãã æ¬çªã»ãã¹ããã©ãã£ãã¯ã®ç®¡çããªã¹ããŒåäœãããªã¹ããŒã«ãŒã«åäœã«å€ãã£ã CodeDeploy Blue/Greenã§ãã¹ãçšã¢ã¯ã»ã¹ãè¡ãã«ã¯ããŒããå€ãããããªãã£ã ã«ãŒã«ã«å€ãã£ãããšã«ãããããããªã©ã®æ¡ä»¶ã§ãåãæ¿ããããããã«ãªã£ã åžžã«Blue/Greenäž¡æ¹ã®ã¿ãŒã²ããã°ã«ãŒããžã®åç
§ãä¿æããããã«ãªã£ã CodeDeploy Blue/Greenã§ã¯äœ¿ããªãæ¹ã®ã¿ãŒã²ããã°ã«ãŒããžã®åç
§ã¯å€ããŠãã ECS Blue/Greenã§ã¯éã¿ä»ãã§äž¡æ¹ä¿æããããã«ãªã£ã ã©ã€ããµã€ã¯ã«ãã㯠CodeDeployåæ§ã«ã決ããããã¿ã€ãã³ã°ã«ã©ã€ããµã€ã¯ã«ããã¯ãèšå®ãããŠãããLambdaãåŒã³åºããŠåŠçãå®è¡ãå¿
èŠã«å¿ããŠãããã€ã忢ãããããšãã§ããŸãã ããã¯ã®çš®é¡ ååã¯ç°ãªã£ãŠããŸãããåç+αã®ããã¯ãçšæãããŠããŸãã CodeDeploy Blue/Green BeforeInstall / AfterInstall AfterAllowTestTraffic BeforeAllowTraffic / AfterAllowTraffic ECS Blue/Green PRE_SCALE_UP / POST_SCALE_UP TEST_TRAFFIC_SHIFT / POST_TEST_TRAFFIC_SHIFT PRODUCTION_TRAFFIC_SHIFT / POST_PRODUCTION_TRAFFIC_SHIFT REONCILE_SERVICE ããã¯æ»ãå€ã®çš®é¡ ããã¯ã§åŒã³åºãããLambdaãè¿ãããšã®ã§ããå€ãšããŠã IN_PROGRESS ã远å ã«ãªã£ãŠããŸãã SUCCEEDED æå(ãããã€ç¶è¡) FAILED 倱æ(ãããã€ã忢ããŠããŒã«ããã¯) IN_PROGRESS å®è¡äž IN_PROGRESSãè¿ããå Žåã30ç§åŸã«ãŸãLambdaãåŒã³åºãããŸãã å¥éãã³ã°ã©ã³ã®ç¢ºèª(ex. E2Eãã¹ã)ãåŒã³åºãããã®çµäºãåŸ
ã€ããšãã£ãå Žåã«äœ¿çšã§ããŸãã CodeDeployã®å¶çŽããã®éæŸ CodeDeployã䜿çšããå ŽåãECSã®DeploymentControllerãšã㊠CODE_DEPLOY ãæå®ããå¿
èŠããããŸãããã®ã¢ãŒãã§ã¯ECS serviceã®ä¿ã€æ©èœãå¶éããããšããåé¡ããããŸããã ex) networkConfigurationãªã©ãäžéšã®ECS serviceã®èšå®ãçŽæ¥æŽæ°ã§ããªããªããCodeDeployã§ã®ãããã€ã§æŽæ°ããå¿
èŠããã ãã®ããã§ãããã€åŽã§ãµãŒãã¹å®çŸ©ã管çããå¿
èŠããã£ã ECSãæã€ãµãŒããããã¬ãŒã«ãŒã®æ©èœã¯äœ¿ãããCodeDeployåŽã®æ©èœã§ä»£æ¿ããå¿
èŠããã ECS Service Connectã䜿ããªã ECS Blue/Greenã§ã¯ ECS ã®æå®ã«ãªãããããã®å¶çŽããªããªããŸãã 以äžãåºæ¬çã«ã¯ECS Blue/Greenã®æ¹ã䜿ãåæãè¯ããªã£ãŠããŸãã AWSå
¬åŒãšããŠãECS Blue/Greenãæšå¥šããŠãããAWSã³ã³ãœãŒã«äžã§ã¯æ¢ã«ECSãµãŒãã¹ã®æ°èŠæ§ç¯æã«CodeDeployãéžæã§ããªããªã£ãŠãããããä»åŸã®æ§ç¯ã«ã¯ECS Blue/Greenã䜿ããããšããã§ãã (åŸè¿°ã®æ³šæç¹ãèŠç¢ºèª) Terraformã§ã®èšå® ECS Blue/Green察å¿ã¯ AWS Provider v6.4.0ããå
¥ã£ãŠããŸãããäžå
·åãããããv6.6.0以éã䜿ã£ãŠãã ãã https://github.com/hashicorp/terraform-provider-aws/issues/43552 èæ
®äºé
ECS Blue/Greenã§ã¯ãªã¹ããŒã«ãŒã«åäœã§ãã©ãã£ãã¯ã管çããããã«ãªã£ãã®ã ããããã«ããTerraformã§ã¯èšå®ã§ããªããã¿ãŒã³ãçºçããŠããŸã£ãŠããåé¡ããããŸãã ãªã¹ããŒã«ã«ãŒã«ã1ã€ãããªãå Žåã以äžã®ããã«èšå®ããŠããããšæããŸãã resource "aws_lb_listener" "listener" { ... default_action { type = "forward" target_group { ... } } } ããã§ default_action ã§ããã©ã«ããªã¹ããŒã«ãŒã«ã®ã¢ã¯ã·ã§ã³ãå®çŸ©ããŸããããã®ã«ãŒã«ã®ARN㯠Terraformã§ååŸããããšãã§ããŸãã ãECS Blue/Greenã®èšå®æã«ARNãå¿
èŠã«ãªãããããã®èšå®ã¯è¡ããªãããšã«ãªããŸãã ãªã®ã§ãdefault_actionã¯ãããŒã®èšå®ãšããŠå®è³ªäœ¿çšãããå¥éãªã¹ããŒã«ãŒã«ãå®çŸ©ããå¿
èŠããããŸãã ãªãã以äžã®ããã«dataã§ååŸã§ããªãããæ€èšŒããŸããããpriorityã®å€ã«defaultãåãä»ãã倱æããŸããã ata "aws_lb_listener_rule" "default" { listener_arn = aws_lb_listener.listener.arn priority = "default" } èšå® ALB resource "aws_lb_listener" "listener" { ... # åºæ¬çã«ãã®ã«ãŒã«ã«ã¯æ¥ãªãæ³å® default_action { type = "fixed-response" fixed_response { content_type = "text/plain" message_body = "Not Found" status_code = "404" } } } # ARNãååŸã§ããããã«ãå¥éãªã¹ããŒã«ãŒã«ãçšæ # ãã¹ãçšã«ãŒã«ãçšæããå Žåã¯ãå¥éãã1ã€äœã resource "aws_lb_listener_rule" "prd" { listener_arn = aws_lb_listener.listener.arn priority = 100 action { type = "forward" # CodeDeployãšç°ãªãã2ã€ã®TGãäž¡æ¹ç»é²ããŠweightã§å¶åŸ¡ãã forward { target_group { arn = aws_lb_target_group.blue.arn weight = 100 } target_group { arn = aws_lb_target_group.green.arn weight = 0 } } } # default_action代ããã«äœ¿ãå Žåã¯ãå¿
ããããããæ¡ä»¶ã«ããŠãã # ä»ã®ã«ãŒã«ãããå Žåã¯priorityãšããããŠèŠèª¿æŽ condition { path_pattern { values = ["*"] } } } äžèšèæ
®äºé
ãèžãŸãã default_action ããããŒã«ããŠå¥éãªã¹ããŒã«ãŒã«ãçšæ CodeDeployãšç°ãªããã¿ãŒã²ããã°ã«ãŒãã2ã€ãšãç»é²ããŠããå¿
èŠãã ã¿ãŒã²ããã°ã«ãŒãèªäœã®èšå®ã¯åŸæ¥ãšå€ãããªãã®ã§å²æ ECS resource "aws_ecs_service" "service" { ... deployment_controller { type = "ECS" } deployment_configuration { strategy = "BLUE_GREEN" bake_time_in_minutes = 1 # åãæ¿ãåŸã«Greenç°å¢ãæ®ããŠããæé(å)ãèŠèª¿æŽ } deployment_circuit_breaker { enable = true rollback = true } network_configuration { # ããã¯å€ããã } load_balancer { target_group_arn = aws_lb_target_group.blue.arn container_name = "app" container_port = 8080 advanced_configuration { alternate_target_group_arn = aws_lb_target_group.green.arn production_listener_rule = aws_lb_listener_rule.prd.arn # ãã¹ãçšãªã¹ããŒã«ãŒã«ãçšæããå Žå # test_listener_rule = "<ãã¹ãçšãªã¹ããŒã«ãŒã«ARN>" role_arn = "<Blue/Greenåãæ¿ãçšã®ARN>" } } lifecycle { ignore_changes = [ task_definition, desired_count ] } depends_on = [ "<ALB>" ] } åŸæ¥ãšã®äž»ãªéã deployment_controllerã type = ECS ã«èšå®ããããã§ãdeployment_configurationã§ strategy = BLUE_GREEN ãèšå®ããããšã§ECS Blue/Greenã®èšå®ã«ãªã load_balancerã®èšå®ã« advanced_configuration ãå¢ãã alternate_target_group_arn: GreenåŽã®ã¿ãŒã²ããã°ã«ãŒãARN production_listener_rule: æ¬çªçšãªã¹ããŒã«ãŒã«ARN test_listner_rule: ãã¹ããªã¹ããŒã«ãŒã«ARN role_arn: Blue/Greenåãæ¿ãã«äœ¿ãããRoleã®ARN(å¥éäœæãå¿
èŠ) å¿
èŠãªããªã·ãŒ Assume Role Policy { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToECSForInfrastructureManagement", "Effect": "Allow", "Principal": { "Service": "ecs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } Policy AmazonECSInfrastructureRolePolicyForLoadBalancers äžèº« { "Version": "2012-10-17", "Statement": [ { "Sid": "ELBReadOperations", "Effect": "Allow", "Action": [ "elasticloadbalancing:DescribeListeners", "elasticloadbalancing:DescribeRules", "elasticloadbalancing:DescribeTargetGroups", "elasticloadbalancing:DescribeTargetHealth" ], "Resource": "*" }, { "Sid": "TargetGroupOperations", "Effect": "Allow", "Action": [ "elasticloadbalancing:RegisterTargets", "elasticloadbalancing:DeregisterTargets" ], "Resource": "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*" }, { "Sid": "ALBModifyListeners", "Effect": "Allow", "Action": "elasticloadbalancing:ModifyListener", "Resource": [ "arn:aws:elasticloadbalancing:*:*:listener/app/*/*/*" ] }, { "Sid": "NLBModifyListeners", "Effect": "Allow", "Action": "elasticloadbalancing:ModifyListener", "Resource": [ "arn:aws:elasticloadbalancing:*:*:listener/net/*/*/*" ] }, { "Sid": "ALBModifyRules", "Effect": "Allow", "Action": "elasticloadbalancing:ModifyRule", "Resource": [ "arn:aws:elasticloadbalancing:*:*:listener-rule/app/*/*/*/*" ] } ] } åè: Amazon ECS infrastructure IAM role for load balancers (EFSãã€ããããService Connectãã€ãããããŠããå Žåã¯è¿œå ã®ããªã·ãŒãå¿
èŠãªã®ã§æ³šæ) åŸæ¥ã¯ecs_serviceã®ã»ãšãã©ã®é
ç®ã ignore_changes ã§ç¡èŠããå¿
èŠããã£ããããã®å¿
èŠã¯ãªããªã ãããã€ã§å€ããtask_definitionããªãŒãã¹ã±ãŒã«ã§å€ããdesired_countã ãignoreããã°ãã serviceã¯ãã¹ãŠTerraformã§ç®¡çãã圢ã«ã§ããã ãã¡ããåŸæ¥åæ§ã®ç®¡çæ¹æ³ã«ããŠããã ãã®ä» ãããã€æã®Role(or User)ã«ä»¥äžã®ããªã·ãŒãå¿
èŠ { "Version": "2012-10-17", "Statement": [ { "Action": "iam:PassRole", "Effect": "Allow", "Resource": ["{äžèšrole_arnã«æå®ããarn}"], "Condition": { "StringEquals": {"iam:PassedToService": "ecs.amazonaws.com"} } } ] } CodeDeploy Blue/Greenããã®åãæ¿ã å
¬åŒã«ç§»è¡æ¹æ³ã解説ãããŠããŸãã ãã皌åäžã®ã·ã¹ãã ãç§»è¡ãããã®ã¯æ£çŽå°é£ã ãšæã£ãæ¹ãè¯ãã§ãã åè¿°ã®ããã«æ§æãäžéšå€ãã£ãŠããããããã€åã«å€æŽããªããã°ãªããªã åãæ»ããã§ããªã deploymentControllerãCODE_DEPLOY â ECSã«ã¯ã§ããããéã¯äžå¯èœ åãæ»ããªãã®ãèŽåœçãªã®ã§ã€ã³ãã¬ãŒã¹ã§ã®ã¢ããããŒãã¯é¿ããã»ããè¯ãããããªãALB+ECSã®ã»ããããã1ã€äœã£ãŠåãæ¿ããã®ãããã§ãããã æ³šæäºé
ãªã¹ããŒã«ãŒã«ã®forward以å€ã®ã¢ã¯ã·ã§ã³ãæ¶æ»
ãã 2025/08/01æç¹ã§æ¬äºè±¡ã«ã€ããŠæ«å®å¯Ÿå¿ãããforward以å€ã®ã¢ã¯ã·ã§ã³ãèšå®ãããŠãããš ãããã€ã倱æãã ããã«ãªããŸãã Blue/Greenãããã€å¯Ÿè±¡ãšãªããªã¹ããŒã«ãŒã«ã«ã¯éåžžãforwardã¢ã¯ã·ã§ã³1ã€ã ããã€ããŠããç¶æ
ã«ãªã£ãŠããã¯ãã§ãã äžæ¹ã authenticate-oidc ã®ããã«èªèšŒãä»ããå Žåãã¢ã¯ã·ã§ã³ã¯2ã€ã«ãªããŸãã ex) Terraformã§ã®äŸ resource "aws_lb_listener_rule" "prd" { ... action { type = "authenticate-oidc" ... } action { type = "forward" ... } } ãã®ç¶æ
ã§Blue/Greenãããã€ãè¡ããšã forward以å€ã®actionãæ¶æ»
ããŸã ãäžèšã§ã¯authenticate-oidcã®ã¢ã¯ã·ã§ã³ãæ¶ããŠããŸããŸãã CodeDeploy Blue/Greenã§ã¯ä¿æããŠãããã®ã§ãECS Blue/Greenã®ã¿ã§çºçããäºè±¡ã§ãã CanaryãªãªãŒã¹ãæªå®è£
CodeDeployãšç°ãªãããªãªãŒã¹æŠç¥ãéžæãããã©ã¡ãŒã¿ãååšãããCanaryãªãªãŒã¹ãã§ããŸããã ãã®ãã¡å®è£
ããããã§ã¯ãããŸãããçŸæ®µéã§ã¯äžæ¬ãªãªãŒã¹ããã§ããŸããã ecspressoã®åãæ±ã ãããã€ã«ecspressoã䜿çšããŠããå Žåã®ã¿åœ±é¿ããŸãã ECS Blue/Greenã«ç§»è¡ããããšã«ããããµãŒãã¹å®çŸ©ãå
šãŠTerraformã§ç®¡çã§ããããã«ãªãããããã€ã§ã®æžãæããäžèŠã«ãªããŸãããã€ãŸããã¿ã¹ã¯å®çŸ©ã®ã¿ã®ãããã€ã§ãããªã£ããšããããšã«ãªããŸãã äžæ¹ã§ecspressoã¯ãµãŒãã¹å®çŸ©ã»ã¿ã¹ã¯å®çŸ©ãã»ããã§ç®¡çããããšãåæãšããŠããããã®æ©æµãåããããšãã§ããŸãããäžå¿ã¿ã¹ã¯å®çŸ©ã®ã¿ã§ã®å®è¡ã¯å¯èœã ãæ³å®ããäœ¿ãæ¹ã§ã¯ãªãããµããŒãå€ãšæèšãããŠããŸãã https://github.com/kayac/ecspresso/issues/871 ãã®ããã ãµãŒãã¹å®çŸ©ããããã€åŽã§ç®¡çãã(TerraformåŽã§å€æŽããªã)éçšãç¶ç¶ãã ecspressoã§ã®ãããã€ãããã ãµããŒãå€ãšç¥ãã€ã€(èªå·±è²¬ä»»ã§)䜿ã ã®3æãè¿«ãããããšãšãªããŸãã ãããã« ä»åã¯ã2025/07/17ã«ãªãªãŒã¹ããããECSçµã¿èŸŒã¿Blue/Greenãããã€ã«ã€ããŠè§£èª¬ããŸããã åèã«ãªãã°å¹žãã§ãã
ãã®èšäºã¯ããªã¬ãŒããã°äŒç»ã25æ°åãªã¬ãŒããã°ãã®èšäºã§ãã ã¯ããã« ããã«ã¡ã¯ãæ°å1幎ç®ã®å€§æã§ãã å
æ¥ãåããŠfirewalldãšããããŒã«ã«è§ŠããŸããã ãããäžè¬çãªACLãšåãããã«éä¿¡å
ã¢ãã¬ã¹(sources)ã«ã€ããŠèšå®ããããæå³ããªããã±ãããééããŠããŸãèšå®ã«æ©ãŸãããŸããã ä»åãªããã®ãããªæåã«ãªã£ãã®ããæ³å®éãåäœãããã«ã¯ã©ã®ãããªèšå®ã«ããã°è¯ããã«ã€ããŠããã®çµéšãèžãŸããããã§ãfirewalldã«å§ããŠè§Šãã人ã«åããŠãŸãšããããšæããŸãã çè
ãããã£ãŒã« å
¥ç€Ÿææ: 2025幎4æ å
¥ç€Ÿåã®ã¹ãã«: ãããã¯ãŒã¯, Linux çŸåšã®æ
åœ: ISPãªãã¬ãŒã·ã§ã³ã»OAããŒã ä»åã©ã®ãããªèšå®ãæå
¥ããŠããã®ã ããã€ã³ã¿ãã§ãŒã¹(ä»®: eth1)ã«ãããŠãIPã¢ãã¬ã¹(ä»®: 192.0.2.1)ããã®ã¿ãµãŒãã¹(ä»®: 22/tcp)ãèš±å¯ããã«ãŒã«ã远å ããããšã«ãªããŸããã ãã®ãšããç§ã¯ä»¥äžã®ãããªèšå®ã«å€æŽããŸããã æå³ãšããŠã¯”eth1ã«å°éãããã±ããã«ã€ããŠãéä¿¡å
IPã¢ãã¬ã¹ã192.0.2.1ãå®å
ããŒãã22/tcpãªã蚱寔ãšãã£ãå
·åã§ãã ããããå®éã®æåãšããŠã¯ã 192.0.2.1以å€ã®ãã¹ããã¢ã¯ã»ã¹å¯èœ ãšãªããŸããã firewalldåºæ¬ãšACLãšã®éã ãªããã®ãããªæåã«ãªã£ãã®ãã®åã«ããŸãfirewalldãã©ã®ããåäœãããã玹ä»ããããšæããŸãã ãŸããfirewalldã¯ãå€ãã®äººãè§ŠããŠããã§ããã”ãããã³ã«ãIPã¢ãã¬ã¹ãšããŒãçªå·ã®éä¿¡å
ãå®å
ãèš±å¯/æåŠã®ã¿ã§ã«ãŒã«ãèšè¿°ããACL”ãšã¬ã€ã€ãç°ãªããã®ã§ãã ACLã€ã¡ãŒãžå³ firewalldã¯ç¬èªã®æŠå¿µã«åºã¥ããŠèšå®ããäžèšã®ãããªã«ãŒã«ãçæãããã®ã§ãããšããèªèãéèŠã«ãªããŸãã äžè¬çãªACLã¯ãã€ã³ã¿ãã§ãŒã¹ãäžå¿ã§ãããã€ã³ã¿ãã§ãŒã¹ããšã«ã«ãŒã«ã远å ããŠããããšæããŸãã äžæ¹ãfirewalldã¯ã” ãŸãŒã³ “ãšãããã®ãäžæ žãšãªã£ãŠããããã®ãŸãŒã³ã«ã€ã³ã¿ãã§ãŒã¹ãéä¿¡å
IPã¢ãã¬ã¹ã远å ããŠãããŸãã ãã®ãŸãŒã³ãšã¯ããã®ã€ã³ã¿ãã§ãŒã¹ãéä¿¡å
IPã¢ãã¬ã¹ãã©ã®çšåºŠä¿¡é Œã§ããããã©ã®ãããªã«ãŒã«ã§ãã±ãããééããããã®ãããã¡ã€ã«ã®ãããªãã®ã§ãã firewalldã«ããã©ã«ãã§ååšãããŸãŒã³ã®çš®é¡ 1 ãã±ãããå°éãããšãéä¿¡å
IPã¢ãã¬ã¹ã次ã«ã€ã³ã¿ãã§ãŒã¹ã®é ã§å
ã«ããããããŸãŒã³ã«å²ãæ¯ãããŸã 2 ã æåã«éä¿¡å
IPã¢ãã¬ã¹ãããããããå€å®ãã 1ã§ãããããªããã°ã次ã«åä¿¡ããã€ã³ã¿ãã§ãŒã¹ã§å€å® ãŸããŸãŒã³ã«ã¯ãééãå¯èœãªããŒãçªå·ããããã³ã«ãåŸè¿°ãããªããã«ãŒã«ãå²ãåœãŠãããŸãã æåã®èšå®ã®åé¡ç¹ ACLã§ã¯éä¿¡å
IPã¢ãã¬ã¹ã¯èš±å¯(æåŠ)ã®ã«ãŒã«ã®äžéšãªãããåæ§ã ãšèªèããŠããŸããã ããããfirewalldã«ãããŠã®éä¿¡å
IPã¢ãã¬ã¹ã¯ããŸãŒã³ã®æ¯ãåãã®ããã®ã«ãŒã« 3 ã§ãã ä»åã®ã±ãŒã¹ã¯ãsourcesã«ãããããªããŠããinterfacesã«ãããããŠããŸããpublicãŸãŒã³ã§è©äŸ¡ãããããã«ãªã£ããããã¢ã¯ã»ã¹ãå¯èœãšãªã£ãèš³ã§ãã ã§ã¯ãæå³ããéãã®åäœããããã«ã¯ã©ã®ããã«ãããã ç§ã¯æ¬¡ã®ããã«ãªããã«ãŒã«ã䜿çšããŠèšå®ã倿ŽããŸããã ãªããã«ãŒã«ã§ã¯ãACLã®ã«ãŒã«ãšäŒŒããããªèšå®æ¹æ³ã§ãéä¿¡å
/å®å
ã®IPã¢ãã¬ã¹ãããŒãçªå·ããããã³ã«ã®çµã¿åããã§èš±å¯/æåŠãå¯èœã§ãã ä»åã®èŠä»¶ã§ã¯ã”192.0.2.1ããã®SSH”ãèš±å¯ãèŠä»¶ãªããã以äžã®ãããªãªããã«ãŒã«ã远å ããŸããã ããã§æå³ããããã«192.0.2.1ããã®ã¿SSHãéãããã«ãªããŸããã firewalldã§èšå®ããã«ã¯ firewalldãäžæãèšå®ããã«ã¯ããŸãfirewalldã®ã¢ãããŒããçè§£ããããšã倧åã§ãã ã€ã³ã¿ãã§ãŒã¹ãéä¿¡å
ã¢ãã¬ã¹ã§ãŸãŒã³ã«æ¯ãåãããã®ãŸãŒã³ã§ãã±ãããééãããããæ±ºå®ããŸãã ãã®ä»çµã¿ãçè§£ããããã§ãééããããã«ãŒã«ãå®å
ããŒãçªå·ããªããã«ãŒã«ãªã©ã«èœãšãããããšãéµã«ãªãããšæããŸãã ãŸãšã firewalldã«ãããsourcesã¯ãäžè¬çãªACLã®ãã㪔蚱å¯/æåŠããIPã¢ãã¬ã¹”ã®èšå®ã§ã¯ãããŸããã§ããã sourcesã¯ãŸãŒã³ãéžæããããã®èšå®é
ç®ã§ãã ãããACLã®ãããªèšå®ã远å ããã®ã§ããã°ããªããã«ãŒã«ã䜿çšããããšã§å¯èœãšãªããŸãã ãçµããã«ã åŠçã®çæ§ã«åã㊠ãŸã å
¥ç€ŸããŠéããªãã§ããããããã£ã«ã¯ãæé·ã»ææŠãæ¯ããŠãããä»çµã¿ãæŽã£ãŠãããšæããŠããŸãã å¶åºŠã¯ ãã¡ã ã§ç޹ä»ãããŠãããã®ãç¡æã§äœ¿ããUdemyãªã©æ°å€ãæã£ãŠããŸãããå
¥ç€ŸåŸã® ç ä¿® ãé
åã®äžã€ã§ãã ãŸããé
å±åŸãå°ã£ãŠããããšãããã°äžå¯§ã«æå°é ããææŠãããããšãããã°ããããåãå
¥ããæåããããŸãã ãããªãããã£ã§ã¯ããã®å¶åºŠã»æåãæŽ»çšããŠææŠããŠããã仲éãåéäžã§ãã æé·ã»ææŠã軞ã«ããŠãã人ã«ã¯ããšãŠãè¯ãç°å¢ã ãšæããŸãã ãã®èšäºãã芧ã«ãªã£ãŠããããªãããäžç·ã«åããããšæã£ãŠé ããŸããšå¹žãã§ãã æ¬¡ã¯ããªã¹ããŸããã®èšäºã§ãã ã©ããªèšäºã楜ãã¿ã§ããã åèæç® åäºåå®çŸ©ããããŸãŒã³ã«ã€ããŠ: https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/10/html/configuring_firew all s_and_packet_filters/using-and-configuring-firewalld#firewalld-zones ïž Previous Behaviorã®ã»ã¯ã·ã§ã³: https://firewalld.org/2023/04/zone-priorities ïž https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/10/html/configuring_firewalls_and_packet_filters/adding-a-source ïž
ã¯ããã« ãã¯ããããããŸããIWS ã§ã æè¿ãã¯ã©ãŠãã³ã¹ãææ¡ã®ãããAWS Lambda ã䜿ã£ãŠåã¢ã«ãŠã³ãã®å©çšæãååŸãããšããã®ãããŠããŸãããããã€ãããã¢ã«ãŠã³ãããããŒã¿ãååŸããããšããŠããã®ã§ãããããããã« AWS Lambda ãäœããšããã®ã¯ããããªãã£ãã®ã§ã¹ã€ããããŒã«ã䜿ã£ãŠä»æã®ã¢ã«ãŠã³ãã®ããŒã¿ã1ç®æããååŸã§ããããã«ããŸãããä»åã¯ãã®ããšã«ã€ããŠæžããŠã¿ããããšæããŸãã ã¹ã€ããããŒã«ïŒ ç°¡åã«èšããš IAM ããŒã«ã䜿ã£ãŠåã¢ã«ãŠã³ãã®åãæ¿ããç°¡åã«ã§ããããã«ãããã®ã§ãã äœæãã IAM ããŒã«ã®æã£ãŠããããªã·ãŒã®ç¯å²å
ã§ã¹ã€ããå
ã®ã¢ã«ãŠã³ããæäœã§ããŸããä»å㯠ã¹ã€ããå
ã®ã¢ã«ãŠã³ã A ã«ãã AWS Lambda ããã¹ã€ããå
ã® ã¢ã«ãŠã³ã B ã§ get_cost_and_usage ã䜿ã£ãŠã³ã¹ããååŸããŸãã ãã£ãŠã¿ã ãŸãã¯ã¹ã€ããå
ã®ã¢ã«ãŠã³ãã§ IAM ããŒã«ãäœæããŸãã IAM ããŒã«ã®äœæã®ä¿¡é Œããããšã³ãã£ãã£ã§ãAWS ã¢ã«ãŠã³ãããéžæãäžã®éžæã§ã¯ãå¥ã® AWS ã¢ã«ãŠã³ããã§ã¹ã€ããå
ã®ã¢ã«ãŠã³ã ID ãå
¥åããŸãã ããã ãã§ããããšã¯éåžžã®ããŒã«äœææãšåãããã«ããªã·ãŒã®èšå®ãªã©ãè¡ã£ãŠãã ãããã¹ã€ããå
ã®ã¢ã«ãŠã³ãã®æºåã¯ããã ãã§ãã AWS Lambda åŽæºå 䜿çšããã®ã¯ boto3 ã® sts_client.assume_role ã§ã # ã¹ã€ããå
ã®ã»ãã·ã§ã³ base_session = boto3.Session(region_name="ap-northeast-1") sts_client = base_session.client("sts") # ã¹ã€ããå
ã®ã»ãã·ã§ã³ assumed_role = sts_client.assume_role( RoleArn="<äœæãã IAM ããŒã«ã® ARN>", RoleSessionName="AssumeRoleSession", ) ãªããšããã ãã§ããã¬ã¹ãã³ã¹ã® Credentials ã®äžã«ã¢ã¯ã»ã¹ããŒãã·ãŒã¯ã¬ããããŒãšãã£ãæ
å ±ãå
¥ã£ãŠããã®ã§ããã䜿ã£ãŠæ°ããã»ãã·ã§ã³ãçºè¡ããã ãã§ã¹ã€ããããŒã«ãã§ããŸãã credentials = assumed_role["Credentials"] assume_role_session = boto3.Session( aws_access_key_id=credentials["AccessKeyId"], aws_secret_access_key=credentials["SecretAccessKey"], aws_session_token=credentials["SessionToken"], ) # ã¹ã€ããå
ã¢ã«ãŠã³ãã§ ce ã䜿ããïŒ ce = assume_role_session.client("ce") ããšã¯ client("ce") ãªã©ã䜿ã£ãŠããªã·ãŒã®ç¯å²å
ã§æäœãã§ããŸãã res = ce.get_cost_and_usage( TimePeriod={"Start": start, "End": end}, Granularity="MONTHLY", Metrics=["UnblendedCost"], ) total_amount = float(res["ResultsByTime"][0]["Total"]["UnblendedCost"]["Amount"]) # ã¢ã«ãŠã³ã B ã®æé : 300 USD ãŸãšã å¥ã® AWS ã¢ã«ãŠã³ããæäœã§ãããã¹ã€ããããŒã«ãããã£ãŠã¿ãŸãããä»åã¯ã³ã¹ããååŸããŠã¿ãã ãã§ãããããªã·ãŒãå€ããã°åœç¶ Amazon ECS ãæäœããã Amazon Cloudwatch ãæäœããããã§ãããããããã¢ã«ãŠã³ãããå¥ã®ã¢ã«ãŠã³ãã«å¯ŸããŠç°¡åã« CLI ã䜿ãããšããããšã ãã§ãèŠããŠãããšãã€ã圹ã«ç«ã€ãããããŸããã ã¿ãªããããã²ãã¹ã€ããããŒã«ã圹ç«ãŠãŠã¿ãŠãã ããïŒ
ããã«ã¡ã¯ãNIFTY engineeringããã°éçšããŒã ã§ãã ããã°éçšããŒã ã§ã¯ããããã£ã®ãšã³ãžãã¢ã«ã€ããŠã®æ
å ±ãäžã®äžã«åºããããã®æŽ»åãããŠããŸãã ãã®æŽ»åã®äžç°ãšããŠããªã¬ãŒããã°ã宿œããŠããŸãã æšå¹Žå¥œè©ã ã£ãæ°åãªã¬ãŒããã°ãä»å¹Žã宿œããŠããŸãïŒïŒ ããªã¬ãŒããã°äŒç»ã24æ°åãªã¬ãŒããã°ããããŸãïŒ æ¬èšäºã«ã25æ°å瀟å¡ã®ããã°èšäºã®ãªã³ã¯ããŸãšããŠãããŸãã®ã§ããã²ãã§ãã¯ããŠãã ããã 25æ°åãªã¬ãŒããã°ã¯ä»¥äžã®ã¹ã±ãžã¥ãŒã«ã§æçš¿äºå®ã§ãããæ¥œãã¿ã«ïŒ æçš¿äºå® å·çè
èšäºã¿ã€ãã« 2025幎7æ28æ¥ å®®æãã ãã€ãã³ãåå ã¬ããããŸãŸã§AWSãè§Šã£ãŠããªãã£ãäžå¹Žç®ããAWS Summitã«åå ããŠããŸãã 2025幎7æ29æ¥ moriãã Rancher Desktopã«ãã£ã¹ã¯ãç°åžžæ¶è²»ãããåé¡ã®å¯ŸåŠæ³ 2025幎8æ5æ¥ å€§æãã (ä»®)Firewalldã®åŒã£ããã£ããã€ã³ã 2025幎8æ13æ¥ ç³ç°ãã æªå® 2025幎8æ19æ¥ ãªã¹ããŸãã æªå® 2025幎8æ22æ¥ é«å£ãã gitã³ãã³ãã䜿ããã«commitãã 2025幎8æ26æ¥ ãã¯ãã æªå® 2025幎8æ29æ¥ ããŸã 25ãã ïŒä»®ïŒãªã³ãã¬ã®ãã¡ã€ã«ãµãŒããAzureãã¡ã€ã«å
±æãžãªãã¬ã€ã¹
ã¯ãããŸããŠïŒ ããã«ã¡ã¯ïŒ2025幎床æ°åãšã³ãžãã¢ã®ãã¯ã§ãã OJTãšããŠãã€ãããã£ããŒã ã«æå±ããŠããŸãã ãããããé¡ãããŸã AWS Summitã£ãŠäœïŒ AWS Summitã¯ã AWS(Amazon Web Service) ã®æè¡ãäžå¿ã«éå¬ãããITã€ãã³ãã§ããAmazonãšãããšãããã®ç©æµäŒç€Ÿã®âŠ?ããšæããããããŸãããããã®éãã§ãïŒ ãã®ã¢ããŸã³ãéå¶ããAWSã¯ãç°¡åã«èšããšã ã€ã³ã¿ãŒãããã§ã³ã³ãã¥ãŒã¿ãåãããµãŒãã¹ ã§ãã 以åã¯Webãµã€ãããµãŒãã¹ããã«ã¯ã24æé皌åã§ããé«äŸ¡ãªPCãµãŒããŒã賌å
¥ããèªåã§ç®¡çããªããã°ãªããŸããã§ããããAWSã䜿ãã°ããããã§å¿
èŠãªåã ãæè»ã«ã³ã³ãã¥ãŒã¿ãåããããšãã§ããŸãã ãããªAWSã«é¢é£ãããã¹ãŠã®ããšãéãŸãã幎1åéå¬ãããæ¥æ¬æå€§ã®ã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ã€ãã³ããAWS Summitã§ãïŒ ä»å¹Žã¯6æ25æ¥ãš26æ¥ã®2æ¥éãå¹åŒµã¡ãã»ã§éå¬ãããç§ã¯2æ¥é£ç¶ã§åå ããŸããã åå ç³ã蟌ã¿ããã»ãã·ã§ã³äºçŽãŸã§ AWS Summitã«åå ã®ããã«ã¯ãå
¬åŒWebããŒãžããäºåã«ç³è«ããå¿
èŠããããŸãïŒ https://aws.amazon.com/jp/summits/japan (æ¥å¹Žã¯ãªã³ã¯ã倿Žãããå¯èœæ§ããããŸã) ãªã³ã¯ãã¯ãªãã¯ãããšãã€ãã³ãå
šäœã®å
容ãšãšãã«ãã©ããªæè¡è¬æŒ(ã»ãã·ã§ã³)ãããã®ãã確èªã§ããŸããæ§ã
ãªã»ãã·ã§ã³ããããŸãããåã»ãã·ã§ã³ã«ã¯ ãLevelã ããããŸããAWSã«æ
£ããŠããªãæ¹ã¯ãAWSåå¿è
åãã®Level 100ïœ200ã®ã»ãã·ã§ã³ãå
ã«äºçŽããããšãããããããŸãã 人æ°ãªã»ãã·ã§ã³ã¯ããã«æºåžã«ãªã£ãŠããŸããŸãããåœæ¥äŒå Žã«ç©ºåžãããã°ãèªç±ã«å
¥å ŽããŠèãããšãã§ããã®ã§ãããŸãå¿é
ããå¿
èŠã¯ãããŸããã ç§ã¯èãããã£ãã»ãã·ã§ã³ãã»ãšãã©æºåžã§äºçŽã¯åºæ¥ãªãã£ãã®ã§ãããåœæ¥äŒå Žã§å
šéšåå ã§ããŸããã äœããã£ãŠããã°ããããªïŒ å¿
é äºåäºçŽã®åŸããã€ããŒãžããã¢ã¯ã»ã¹ã§ããQRã³ãŒã 身å蚌 (ååºãå
蚱蚌ç) ãããšãããã® æ°Ž ããã°ãã㯠(ããã«ãã£ã沢山ããããªã) PCïŒã¯ãŒã¯ã·ã§ããã«åå ãããªã) å¹åŒµã¡ãã»ãžGoïŒ äŒå Žã«å
¥å Žããããã«ã¯ãäºåç»é²ã®åŸã«çºè¡ããããã€ããŒãžã® QRã³ãŒã 㚠身å蚌 ãçšæããŸãã å
¥å£ã§ç¢ºèªåŸãå
¥å ŽèšŒïŒãã±ããïŒãåãåãããšãã§ããŸãã åå9æããå§ãŸãããŠã§ã«ã«ã ããã©ãŒãã³ã¹ããæ°ã«ãªã£ãã®ã§ãå°ãæ©ãã«å°çããŸãããæ©ãæéã ããããæã£ãããå
¥å Žåã¯é·ããªãã£ãã§ãã ä»å¹Žã¯å
ç4,000人ã«ã¯ãã·ã§ã³ãšãåŒåœãããããç¹å
žããããŸããïŒã¯ãã·ã§ã³ã¯åºèª¿è¬æŒãäºåã«äºçŽããŠããã°ããã®è¬æŒäŒå Žã®åžã§åãåãããšãã§ãããåŒåœã¯9æ20åé ã«é
åžãçµäºããŸããã æ¥å¹ŽããåŒåœãã»ãããªããå°ãæ¥ãã æ¹ãããã§ãã ããããæ¥œãã¿ã®æéã§ãïŒ äŒå Žã«å
¥ã£ãããããããæ¬æ Œçã«Summitãæ¥œããæéã§ãïŒåå¿è
ã®èŠç¹ã§ã2æ¥éåããªãããããã¯æ¥œãããïŒããšæã£ãããšã玹ä»ããŸãã ãŸãã¯åºèª¿è¬æŒãèŽãã æ°ããã»ãã·ã§ã³ã®äžã§äœãèãã¹ããè¿·ã£ãããåºèª¿è¬æŒãèŽããŸãããã AWS Summitã®æãæ žãšãªãã»ãã·ã§ã³ã§ãAWSã®æ°ããæè¡ãšæ§ã
ãªäŒæ¥ã®æåäºäŸã玹ä»ããŸãã åºèª¿è¬æŒãèããŠããAWSãæ¥æ¬åœå
ã§è²ŽéãªäŸ¡å€ãçã¿åºããŠãããã ããæã£ã以äžã«å·šå€§ãªæè¡ãªãã ãªããšæ°ã¥ããAWSãžã®èå³ãæ¹§ããŸããã äŒæ¥ããŒã¹ãäžéãåã£ãŠã¿ãã GitLabãIBMãIBMãPostmanãAMDãªã©ãªã©éŠŽæã¿ã®ããäŒæ¥ã¯ãã¡ãããããããªãµãŒãã¹ããããã ïŒããšæãäŒæ¥ãŸã§ãæ§ã
ãªäŒæ¥ãåºå±ããŠããŸãã åããŒã¹ã§ã¯ãèªç€Ÿã®æè¡ããµãŒãã¹ãã¢ããŒã«ããããã«ç¬ç¹ãªã€ãã³ããéå¬ããŠããããããèŠãã ãã§ããšãŠãè峿·±ããæ¥œããçµéšã§ããã äžéšã®ããŒã¹ã§ã¯ããã®å Žã§æ°è»œã«èãã ããã»ãã·ã§ã³ ãéå¬ããŠãããšãããããã®ã§ãèå³ã®ããããŒããããã°åå ããã®ãããã§ãããã ãããŠãããŒã¹ãåã£ãŠãããšãäž¡æäžæ¯ã® æŠå©å ãæã«å
¥ããããšãã§ããŸããããããã¹ããã«ãŒã䟿å©ã°ããºãç³ãèš³ãªããããããããããããŸãã®ã§ãAWS Summitã«åå ãããšãã¯ããã²ããã°ããã¯ãæã£ãŠè¡ããŸãããïŒ ã²ãŒã ã§åŠã¶ãAWSäœéšã©ã ãã»ãã·ã§ã³ãé£ããã§ãããšæãæ¹ã«ã¯ããããããããã§ãïŒ AWSäœéšã©ãã¯AWSã«åããŠè§Šããåå¿è
ã®æ¹ããŒãããæ¥œããåŠç¿ã§ããäœéšåããŒã¹ã§ãã Cloud Quest: ã²ãŒã ã§AWSã®ã¹ãã«ãåŠãã§ãããŸãã SIMULEARN : ãã£ããã§AIãšè©±ãããªãããããžãã¹åé¡ãAWSã§ã©ã®ããã«è§£æ±ºããããåŠã¶ã·ãã¥ã¬ãŒã·ã§ã³ã§ãã ç§ã¯Cloud Questã1æéã»ã©äœéšããŠã¿ãŸãããäœéšãå§ãããšãå®ç¿çšã®ä»®AWSã¢ã«ãŠã³ããããã«äœæãããå¿
èŠãªãã¡ã€ã«ããã¹ãŠçšæãããŠããã®ã§ãæ¬åœã«ãåŠç¿ãã«éäžã§ããã®ãè¯ãã£ãã§ãã ãAWSäœãããããªãçŽ äººã ãã©âŠããšããæ¹ã¯ãã²åå ããŠã¿ãŠãã ããïŒ ãã®ä»ã«ã ãã³ãºãªã³ãã¯ãŒã¯ã·ã§ããã§ãã ãšãã¹ã ããAWSã®æè¡ã掻çšããæ§ã
ãªãããžã§ã¯ããå±ç€ºãããŠãã å±ç€ºããŒã¹ ããããŸããã äœè£ããã£ããåãã®ã楜ãã¿ã®äžã€ã§ãïŒ æåŸã« æåã¯ããAWSã®ç¥èããªããšæ¥œãããªãã®ã§ã¯…ããšå¿é
ããŠããã®ã§ãããAWS Summitã¯ãå°éå®¶ã ãã®ã€ãã³ããã§ã¯ãªããç§ã®ãããªæ°äººãšã³ãžãã¢ãäžç·ã«æ¥œãã¿ãªããåŠã¹ãããšãŠãææçŸ©ã§æ¥œããæéã§ããã ITãè¶
ããã¢ãã¡ãŒã·ã§ã³å¶äœãç©æµã®èªååãé£å廿£ç©ã®åé¡è§£æ±ºã«è³ããŸã§äœ¿ãããAWSã®å§¿ã«ãã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ã®ç¡éã®å¯èœæ§ãæããŸããã ä»åã®çµéšã§ãAWSã¯é£ããæè¡ãšããåèŠããªããªããä»åŸãããã£ã§æ°ããæè¡ããã£ã𿢿±ããããšæã貎éãªãã£ãããåŸãŸããã ãã®èšäºãèªãã§ããçããããæ¬¡ã®Summitã§ãäŒãã§ããããšãé¡ã£ãŠããŸã
CCoEãçç£æ§åäžã«é¢ããä»äºãããŠããç³å·ã§ãã ä»åã¯éçºçç£æ§åäžãç®æããŠã2025幎3æããæ§ã
ãªAIãšãŒãžã§ã³ãã詊ããŠã¿ã å人çãª ææ³ãæžããŠããããšæããŸããGitHub Copilot以å€ã®ããŒã«ã¯æ°æ¥ãã1ã¶æäœ¿çšããã ããªã®ã§ãæ·±ã䜿ã蟌ãã ããã§ã¯ãããŸããã GitHub Copilot Agent mode / Coding Agent è¯ãç¹ GitHubæäŸã®å®å¿æãšå°æ¥æ§ãžã®æåŸ
GitHubãšã®é«ãèŠªåæ§ å°ãç¹ åŸé課éèŠçŽ ãããïŒPremium RequestïŒ äžéã§æµè¡ããŠããæ©èœãå®è£
ããããŸã§æéå·®ããã ChatGPTã§ç°¡åãªã³ãŒãçæã詊ãã以å€ã§ã¯ãGitHub Copilotãç§ãæ¬æ Œçã«äœ¿ã£ãæåã®ã³ãŒãã£ã³ã°AIã§ãããããã£ã§ã¯2023幎9æããæ£åŒå°å
¥ãããŠããŸãã VSCodeãšçµ±åãããŠããããäœ¿ãæ¹ã«è¿·ãããšããªããåããŠã³ãŒãã£ã³ã°AIãäœ¿ãæ¹ã«ãæé©ã ãšæããŸããGitHub.comäžã§ã¬ãã¥ãŒãã¹ãã£ã³çµæãå³Copilotã§ä¿®æ£ã§ããã®ã芪åã§ãã çŽ2幎é䜿ãç¶ããŠããŸããããã®éã«å©çšå¯èœãªã¢ãã«ãå¢ããEditã¢ãŒããAgentã¢ãŒããªã©ã远å ããçç£æ§ã¯å€§å¹
ã«åäžããŠããŸããæè¿ã§ã¯Instructionãã¡ã€ã«ãèªèããŠãããã±ãŒã¹ãå¢ããæ¥ã
çå®ã«äŸ¿å©ã«ãªã£ãŠããŸãã äžæ¹ã§ãææ°ã®ãã¬ã³ãæ©èœããŸã åã蟌ãŸããŠããªãããšããããŸããã§ããå¿
èŠãªæ©èœã¯æçµçã«ãã¹ãŠCopilotã«çµ±åãããçµå±ã¯Copilotã«èœã¡çãã®ã§ã¯ãªãããšå人çã«ã¯æåŸ
ããŠããŸãã Cline / Roo Code Copilot Agent modeãäžè¬å
¬éããããŸã§ã®éã«ãClineãRoo Codeãªã©ã®ããŒã«ã詊ããããšã¯ãããŸãããååãªææ³ãæžããã»ã©äœ¿ã蟌ãã§ããªããããããã§ã¯å²æããŸãã Devin â»2025幎3ææç¹ã«ãããDevinã®ææ³ãšãªããŸã è¯ãç¹ æ©ã段éããèªç«åAIãšãŒãžã§ã³ããšããŠå®æåºŠãé«ãã£ã GitHubãSlackããç°¡åã«å©çšã§ãã Devinèªäœããã©ãŠã¶ããšãã£ã¿ãŒãå
èµããŠãããç¬ç«ããç°å¢ã§ã¿ã¹ã¯ãå®è¡ã§ãã å°ãç¹ èªèšŒæ
å ±ã®ç®¡çãé£ãã BotãšããŠã®Devinã«åŒ·ãæš©éãä»äžããã SAML/SSOãå©çšããã«ã¯Enterpriseãã©ã³ãå¿
èŠ èªç«åAIãšãŒãžã§ã³ããäœéšããã®ã«æé©ãªSaaSã ãšæããŸãã Devinäžã§æ§ã
ãªæ©èœã詊ããŸãããGitHubãSlackãªã©å¿
èŠãªIntegrationãæã£ãŠããŸãã éãããç¯å²ã§äœ¿ãåã«ã¯åé¡ã¯å°ãªãã§ãããå
šç€Ÿå±éãèãããšãã¢ã«ãŠã³ã管çãèªèšŒæ
å ±ç®¡çãåŸé課éã®äºç®ç®¡çãªã©ã®èª²é¡ãåºãŠããŸãããããã«å¯Ÿå¿ããã«ã¯éçšã«ãŒã«ããã£ããæ±ºããŠããå¿
èŠããããŸããDevinãäºæãã¬åäœãããå Žåã瀟å
ã®AIæ®åã«ãæªåœ±é¿ãåãŒãå¯èœæ§ããããããå±éãããšããŠãããŒã åäœã§æ®µéçã«é²ããã®ãè³¢æã§ãã Jules è¯ãç¹ GoogleæäŸã®ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ã ç¡æã§äœ¿ããïŒ1æ¥60ã¿ã¹ã¯ïŒ å°ãç¹ ãŸã ãããªãã¯ããŒã¿æ®µéã§æ©èœãéå®ç GitHubãªããžããªãšã®é£æºãå¿
é çŸæç¹ã§ã¯ãšã³ãžãã¢åãã®ç¡æAIã³ãŒãã£ã³ã°äœéšSaaSãšããå°è±¡ã§ãã çŽç²ãªã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããªã®ã§ãDevinã®ãããªæ±çšæ§ã¯ãªããGitHubãšã®é£æºãå¿
èŠãšãªããŸããDevinãèªåçã«ãã«ãªã¯ãšã¹ããŸã§äœæããã®ã«å¯ŸããJulesã¯ãã©ã³ãäœæãŸã§ã§æ¢ãŸããªã©ãæäŸäŒç€Ÿããšã«AIãšãŒãžã§ã³ãã®äœæ¥ç¯å²ãç°ãªããŸãã Claude Code è¯ãç¹ å
éšããã³ããã®åªç§ãã宿ã§ãã ãšãã£ã¿ãŒãGUIã«çžãããã«å©çšã§ãã å°ãç¹ åŸé課éèŠçŽ ãããïŒAPIïŒ CLIã ãšæ¥æ¬èªå
¥åãããäžäŸ¿ 䜿çšåã¯äžéã®ããŸãã®è©å€ã®é«ãã«æççã§ããããå®éã«äœ¿ã£ãŠã¿ããšäœéšãéåžžã«è¯ãã£ãã§ãã ä»ã®AIãšãŒãžã§ã³ããšåæ§ã«ãèšç»ç«æ¡ â ã¿ã¹ã¯å â åŠçããšããåºæ¬çãªæµãã¯å
±éããŠããŸããã鲿ã®äŒãæ¹ãçµæãµããªãŒã®é©åãããããŠä»ã®äœæ¥ãéªéããã«åäœããç¹ãåªããŠããŸããå
éšã§äœ¿ãããŠããã§ãããããã³ãããéåžžã«åªç§ã ãšããããšãäŒãã£ãŠããŠãããããç·åçã«è¯ãäœéšãçã¿åºããŠããŸãã CLIã«ã€ããŠã¯ããšãã£ã¿ãŒãå æããªãïŒè€æ°ã®ã¿ã¹ã¯ã䞊åå®è¡ã§ããç¹ã§æå©ãªã€ã³ã¿ãŒãã§ãŒã¹ã ã£ããã ãšåçºèŠããæ°åã§ãã CLIã§ã®æ¥æ¬èªå
¥åã¯ããäžäŸ¿ã§ã¯ãããŸãããé·æã®ããã³ãããå¿
èŠãªå Žåã¯ã«ã¹ã¿ã ã¹ã©ãã·ã¥ã³ãã³ããæŽ»çšã§ããŸãããææªã³ããããã°ããã®ã§æ
£ããã°ãããŸã§å°ããã®ã§ã¯ãããŸããã§ããã Kiro è¯ãç¹ Specã¢ãŒãã«ããèŠä»¶å®çŸ©ããè¡ãäœéšãåªããŠãã AWSæäŸã®ãšãã£ã¿ãŒ å°ãç¹ å©çšã«ã¯Waitlistã®ç»é²ãå¿
èŠ Kiroã«ããã³ãŒãã£ã³ã°åŠçãéåžžã«é
ã ã»ãã·ã§ã³åãã«ããIAM Identity Centerãã°ã€ã³ãçŽããã¡ãã£ãšé¢å Kiroã¯ãšãã£ã¿ãŒã®åºæ¬æ©èœãšããŠãAIãšãŒãžã§ã³ãã广çã«æŽ»çšããããã®äžã€ã®æš¡ç¯è§£çãæäŸããŠããŸãã Claude Codeã®Planã¢ãŒããRoo Codeã®Architectã¢ãŒããªã©é¡äŒŒæ©èœã¯ãããŸãããããèŠä»¶å®çŸ© â Design Doc â ãã©ã³äœæãã察話圢åŒã§èªååããŠãããäœéšã¯ãã°ãããã£ãã§ããæ¢åã®éåãªããã³ãããã³ãã¬ãŒããæã£ãŠããªãéããSpecã¢ãŒãã§AIãšãã©ã³ãç«ãŠãäœéšã¯ãä»åŸã®AIãšãŒãžã§ã³ããšã®å¹æçãªé¢ããæ¹ãåŠã¶è¯ãæ©äŒã«ãªããšæããŸãã Gemini Canvas ã³ãŒãã£ã³ã°ããšãŒãžã§ã³ã以å€ã«ãæ
å ±åéãã¹ã©ã€ãäœæã«é¢ããããŒã«ã調æ»ããŠããã®ã§ãããŸããšããŠç޹ä»ããŸãã è¯ãç¹ Geminiã®äžæ©èœãšããŠæè»œã«å©çšã§ãã Deep Researchã§èª¿ã¹ãçµæãå³åº§ã«ã¬ããŒããäžæçµµïŒhtmlïŒã«ãŸãšãããã å°ãç¹ Googleã¹ã©ã€ãã«çŽæ¥æµçšã§ããªãïŒãã£ããã£ãªãå¯èœïŒ ã¹ã©ã€ãã«é©ãããã©ãŒããããããã³ããã§æå®ããã®ãé¢å ç§ã¯çºè¡šçšã®ã¹ã©ã€ããGeminiã«äžããCanvasã§htmlããŒãžãäœæããããããã£ããã£ããŠã¹ã©ã€ãã«æ¿å
¥ããæ¹æ³ã§æŽ»çšããŠããŸããã䟿å©ã§ã¯ãããŸããããã¶ã€ã³ã®åŸ®èª¿æŽãéåžžã«é£ããã®ãæ¬ ç¹ã§ãã ãã®åé¡ã解決ããŠãããããŒã«ãšã㊠Manus ããããŸããã¹ã©ã€ãæ©èœãããŒã¿å¯èŠåæ©èœã¯éåžžã«åªç§ã§ãããæ°ã«ãªãç¹ãããããçŸæç¹ã§ã¯ãã©ã€ããŒãã§ã®æ€èšŒã«çããŠããŸãã ã»ãã«ã ChatGPT Agentã§ãã¹ã©ã€ããäœæã§ããããã«ãªããŸãã ãïŒçŸç¶ã§ã¯ãã¶ã€ã³é¢ãäžååïŒãæ°ã¶æåŸã«ã¯ä»ã®ããŒã«ã察å¿ããŠãããšæãããïŒé¡æïŒã®ã§ããã®ãããã¯ãŸã æ§åèŠã§ãè¯ããããããŸããã ãŸãšã GitHub CopilotãNotion AIãéå»ã«å°å
¥ããçµç·¯ããããæµãã§æè¿ã®AIãšãŒãžã§ã³ãã調æ»ãé²ããŠããŸããããçš®é¡ã®å€ããšé²åã®éãã«è¿œãã€ãã ãã§ãç²åŒããŸããã å幎ãã1幎ã»ã©åŸ
ã£ãŠèœã¡çããŠããå°å
¥ãæ€èšããã®ãæãå¹ççã§ã¯ãããŸãããAIæè¡ã¯å®éã«äœéšããŠåããŠçè§£ã§ããèŠçŽ ãå€ããšèããŠããŸããæ¥ã
ã®æ
å ±åéãšæãåããããšã§åŸãããçµéšå€ãéåžžã«éèŠã ãšãæããŸãã æ§ã
ãªããŒã«ãæ€èšŒããçµæãäž»ãªäœ¿ãæ¹ãšå¿
èŠãšãªãæ
å ±ïŒInstructionãKnowledgeãªã©ã®ã«ã¹ã¿ã èŠçŽ ïŒããéçŽã§ããŠããã°ãèªåã«åã£ããã®ãéžãã§äœ¿ãã®ãçŸæç¹ã§ã®æé©è§£ã§ããããããã«èšãã°ãäžã€ã®ããŒã«ã«åºå·ãããæ§ã
ãªãã®ã詊ãæè»ãªå§¿å¢ã倧åã ãšæããŸãã æªæ¥ã¯åžžã«å€åããŠãããããã©ã®ããŒã«ãã©ã®çšåºŠç€Ÿå
ã«å±éãããã®èšç»ã¯ç«ãŠã«ããã§ãããå®éã«åªããäœéšäŸ¡å€ãæäŸããããŒã«ã«ã€ããŠã¯ç©æ¥µçã«ç€Ÿå
å±éãé²ããŠãããããšèããŠããŸãã
ã¯ããã« çããããã«ã¡ã¯ãå®®æã§ãã ä»åã¯ã2025幎 6æ25æ¥ãš6æ26æ¥ã«AWS Summit Japan 2025ã«åå ããŠãããããã¢ããŸã³ ãŠã§ã ãµãŒãã¹ïŒAWSïŒãã»ãŒè§Šã£ãŠããªãå
¥ç€Ÿäžå¹Žç®ã®ãšã³ãžãã¢ã®ç®ç·ã§ææ³ãèªã£ãŠãããããšæããŸãã AWS Summitãšã¯ å
¬åŒãµã€ã ã§ã®èšèŒã¯ä»¥äžã®éãã§ãã AWS Summit ã¯ãå
±ã«æªæ¥ãæããã«ããŒãäžå ã«äŒããŠãã¢ããŸã³ ãŠã§ã ãµãŒãã¹ (AWS) ã«é¢ããŠåŠç¿ãããã¹ããã©ã¯ãã£ã¹ã®å
±æãæ
å ±äº€æãã§ãããã¯ã©ãŠãã§ã€ãããŒã·ã§ã³ãèµ·ããããšã«èå³ãããå
šãŠã®çæ§ã®ããã®ã€ãã³ãã§ãã https://aws.amazon.com/jp/summits/japan/ ç°¡æœã«èšããšãAmazon Web Services, Inc.æ§ãã¯ãããšããå€ãã®äŒæ¥ãäžå ã«äŒããæ
å ±äº€æãè¡ã£ãããäŒæ¥ãæ±ãã課é¡ã解決ããããã®è£œåããµãŒãã¹ã玹ä»ãããããå Žããšèšããã§ãããã ãªãåå ããã®ã åŒç€Ÿã§ã¯å
šç€Ÿçã«AWSã䜿çšãããŠãããããæè¡çç¥èŠãå¢ããããã£ãç¹ãšãäžäººã®ããžãã¹ããŒãœã³ãšããŠæè¡ç³»ã€ãã³ãåå ãããã£ãããã§ãã äŒå Žã®æ§å äŒå Žã¯å€ãã®æ¥å Žè
ãšåºå±äŒæ¥ã§ã倧å€ãªç±æ°ã«å
ãŸããŠããŸããã Amazon Web Services, Inc.æ§ããã®ä»ã®æ§ã
ãªäŒæ¥ã«ããã»ãã·ã§ã³äŒå Žã®ã»ããããŒã¹ããããããããŸããã ãã®æ¥çã§ã¯ãªãã¿ã®æ·±ãAMDæ§ãGitLabæ§ãããŸæ³šç®ãéããŠããAnthropicæ§ãªã©ãå€çš®å€æ§ãªäŒæ¥ãéã£ãŠããŸããã ããŒã¹ã§ã¯ãæ§ã
ãªäŒæ¥æ§ãããèªç€Ÿã®è£œåãããã§ããïŒããšã¢ããŒã«ããŠããŸãã äºåã«èªç€Ÿãæ
åœãããã¯ãã®èª²é¡ãæŽçããŠãããšãããã®è£œåã¯ãã®èª²é¡ã解決ã§ãããããããªãããšãã£ãçºèŠããããããææçŸ©ã«ããŒã¹ãèŠãŠåãããšæããŸããã ãŸãã話ãèããŠãããšããããããªããã«ãã£ããªãªãžãã«ã¹ããã«ãŒãªã©ãé
åžãããŠããŸããã ç¹ã«å°è±¡çã ã£ãã®ã¯ãRed Hatæ§ã®ããŒã¹ã§é
åžãããŠããred hatïŒãã¬ãŒãããŒã¯ã®èµ€ãäžæãåžœïŒã§ãã ã»ãã·ã§ã³ã®æ§å äž¡æ¥ãšãã10æãã11æåãŸã§åºèª¿è¬æŒãããããã®åŸåããŒã¹ã§åå¥ã»ãã·ã§ã³ãè¡ããã圢ã§ãã æ¥å¹Žåå ãããæ¹ãžã®ã¢ããã€ã¹ã§ãããåºèª¿è¬æŒãè¯ãåžã§èãããå Žåãæ©ãã«äŒå Žãžå°çããããšãããããããŸããä»å¹Žã®äŸã§ã¯ãéå ŽåŸããã«åžãåãŸãå§ããæ©ãæ¥ã人ã«ã¯ã¯ãã·ã§ã³ãæŒé£åžãé
åžããããªã©ã®ç¹å
žããããŸããã æ§ã
ãªã»ãã·ã§ã³ãèŠãŸãããããã®äžã§ãç¹ã«å°è±¡ã«æ®ã£ããã®ãããã€ãããã¯ã¢ããããŠç޹ä»ããããšæããŸãã Amazon Web Services, Inc.æ§ã«ãããçæ AI ãæŽ»çšããããŒã¿ããŒã¹ã®ã¹ããŒã倿ã§ç§»è¡ãå éããã : AWS Database Migration Service Schema Conversionã çæAIãæŽ»çšããããšã«ãããèªç€Ÿã§ä¿æããŠãããµãŒãããAWSãžã®ããŒã¿ããŒã¹ç§»è¡ã倧ããªåŽåããããã«å®çŸã§ãããšã®ããšã§ãã ãããŸã§ã¯ãOracle Databaseãªã©ããAWSã®ããŒã¿ããŒã¹ãžç§»è¡ããéã颿°ãã¹ãã¢ãããã·ãŒãžã£ãšãã£ãè€éãªã³ãŒãã¯èªå倿ãé£ãããæäœæ¥ã§ã®ä¿®æ£ãå€ãçºçããŠããŸããã ã»ãã·ã§ã³ã«ãããšãåŸæ¥ã¯å
šäœã®8%çšåºŠããèªå倿ã§ããªãã£ãåŠçããçæAIãæŽ»çšããããšã§çŽ85%ãŸã§èªååã§ããããã«ãªã£ããšã®ããšã§ãã ãããããã ãçæAIãæŽ»çšããã°ããã ãã§ãªããã³ã³ããã¹ããé£èªåããã³ãŒãã®ä¿®æ£ãLarge Language ModelïŒLLMïŒã®éžå®çãèæ
®äºé
ãå€ããããAIãã©ã掻çšããŠããããéèŠãšãªãããã ãšæããŸããã åŒç€Ÿã§ããã®ãããªAWSãžã®ç§»è¡ã¯èª²é¡ãšãªã£ãŠãããããåèã«ããããšæããŸããã Amazon Web Services, Inc.æ§ã«ãããã»ãã¥ã¢ãªãœãããŠã§ã¢éçºã©ã€ããµã€ã¯ã«ã®ããã®çæ AIã æ¬çªç°å¢ãžã®ãããã€åŸçã«ãè匱æ§ãèŠã€ããããšã¯ãã³ãã³çºçãããããç¶ç¶çãªã¹ãã£ã³ããäŸåé¢ä¿ã«ãªã£ãŠããã·ã¹ãã å
šäœã®ææ¡ãå¿
èŠãšãªããŸãã è¿å¹Žã®ãµã€ããŒæ»æã®å·§åŠåãåãããœãããŠã§ã¢ãæ§æããã³ã³ããŒãã³ãïŒéšåïŒãäžèЧåããããœãããŠã§ã¢éšå衚ïŒSBOMïŒãã®éèŠæ§ãé«ãŸã£ãŠããŸããããããéçºã®éçšã§åžžã«ææ°ã®ç¶æ
ã«ä¿ã€ã®ã¯å®¹æã§ã¯ãããŸããã ãã®èª²é¡ã«å¯ŸããAWSã®è匱æ§ç®¡çãµãŒãã¹ã§ãããAmazon Inspectorãã¯ãã¹ãã£ã³ãããªãœãŒã¹ããSBOMãèªåã§ç¶ç¶çã«çæã»ç®¡çããŠããããšã®ããšã§ãã åŒç€Ÿã§ããSBOMã«é¢ãã話ãåºå§ããŠããããã®åéã«é¢ããç¥èŠãããåºããŠããããšæããŸããã æ ªåŒäŒç€Ÿãã¯ã³ãŽæ§ã«ããåºèª¿è¬æŒããã³ãåå¥ã»ãã·ã§ã³ããã³ãã³ã®å€§èŠæš¡ã»ãã¥ãªãã£æ¹é©ã ãããæåã代衚ãããµãŒãã¹ã®äžã€ãšããããããã³ãã³ããéå¶ããæ ªåŒäŒç€Ÿãã¯ã³ãŽæ§ã¯2024幎6æã«å€§èŠæš¡ãªãµã€ããŒæ»æãåããŸããã 察å¿ã®éã«ã¯ãAmazon Web Services, Inc.æ§ã®ç€Ÿå¡ã®æ¹ã
ãå«ããŠã»ãã¥ãªãã£ããŒã ãæ§æããããã§ãã çºè¡šã«ãããšãæ»æãåããéãèªç€Ÿã§éçšããŠãããªã³ãã¬ãã¹ç°å¢ã¯å€§ããªè¢«å®³ãåããŸãããã以åããç§»è¡ãé²ããŠããAWSäžã®ç°å¢ã¯è¢«å®³ãæå°éã«é£ãæ¢ãããããšã®ããšã§ãã ãã®çµéšãããæ®ã£ãŠããã·ã¹ãã ã®AWSãžã®ç§»è¡èšç»ã倧å¹
ã«ååãããŠããµãŒãã¹åŸ©æ§ãé²ããããã§ãã AWSãæäŸããå
ç¢ãªã»ãã¥ãªãã£åºç€ã®æå¹æ§ããæ¹ããŠèªèãããããäºäŸã§ããã ãŸãããã®ãããªè¢«å®³ã¯ä»äººããšã§ã¯ãªããšããèšèããç¹ã«å°è±¡ã«æ®ããŸããã å
šäœãéããŠã®ææ³ããã³ãŸãšã ãã®äºæ¥éãéããŠãAWSã«å¯Ÿããèå³ãããäžå±€äžãããŸããã AWSã«ãããæ§ã
ãªãœãªã¥ãŒã·ã§ã³ãå®çŸã§ããããšãç¥ããåŒç€Ÿã§ã掻ãããŠã¿ãããšãæããŸããã ç§ã®ãããªAWSåå¿è
ã§ããSimple Storage ServiceïŒAmazon S3ïŒãAmazon EC2ãšãã£ãåºæ¬çãªãµãŒãã¹ã®åœ¹å²ãææ¡ããŠããã°ãåã»ãã·ã§ã³ã®ç®çãçè§£ã§ãããšæããŸããã æ¥å¹Žã®éå¬ãŸã§ã«ã¯ãããã«AWSã®ç¥èãèªç€Ÿã®èª²é¡ãžã®çè§£ãæ·±ããããå€ãã®åŠã³ãåŸãããããåææŠãããã§ãã