
- TOP
- ã¿ã°äžèЧ
- Kubernetes
Kubernetes
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
æè¡ããã°
ã¿ãªãããããã«ã¡ã¯ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã®å€å±ã§ããä»é±ã é±åAWS ããå±ãããŸãïŒ ã·ã«ããŒãŠã£ãŒã¯ã® 5 é£äŒãããããéããã§ããããã©ãã©ããšæ¥ãçããªãã1 å¹Žã®æ®ããæèãã¯ãããå£ç¯ã«ãªããŸãããã 幎æ«ãšããã°ããã®ãã€ã©ã€ããšãªã AWS re:Invent 2026 ããããããèŠçã«å
¥ã£ãŠããŸããïŒä»å¹Žã¯ 11 æ 30 æ¥ (æ) ãã 12 æ 4 æ¥ (é) ãŸã§ã©ã¹ãã¬ã¹ã§éå¬ããã2,200 以äžã®ã»ãã·ã§ã³ãäºå®ãããŠããŸããæ®ã㯠2 ãæããŸããçŸå°åå ãæ€èšãããŠããæ¹ã¯ããããã瀟å
ã®èª¿æŽãæž¡èªæºåãåããå§ããã¿ã€ãã³ã°ã§ããããã®å€æææãšããŠãAWS Startup ããã°ã®é£èŒ ã©ã¹ãã¬ã¹5æ¥éã§åŸããã® ââ re:Invent ã«è³ããã¹ã¿ãŒãã¢ããã®ãªã¢ã« ããã²ã芧ãã ãããæè¡ã®ãã£ããã¢ããã¯ãã¡ãããäºæ¥ãåããåºäŒãããšã³ãžãã¢æ¡çšã«ãŸã§è©±ãåãã§ããŠããçŸå°ã§ããåŸãããªããã®ãããšãŠãå
·äœçã«èªãããŠããŸããèšäºã¯éæå
¬éäºå®ã§ãã ããã§ã¯ãå
é±ã®äž»ãªã¢ããããŒãã«ã€ããŠæ¯ãè¿ã£ãŠãããŸãããã 2026幎9æ14æ¥é±ã®äž»èŠãªã¢ããããŒã 9/14(æ) Gemma-4-31B-it-assistant ããã³ Gemma-4-31B-IT-NVFP4 ã¢ãã«ã Amazon SageMaker JumpStart ã§å©çšå¯èœã« Google DeepMind ã® Gemma-4-31B-it-assistant ãš NVIDIA ã® Gemma-4-31B-IT-NVFP4 ã Amazon SageMaker JumpStart ã«è¿œå ãããŸãããåè
㯠Gemma 4 ãã¡ããªãŒã®ãã©ãã°ã·ããã§ãã 31B ã® dense ã¢ãã«ã®ã¢ã·ã¹ã¿ã³ã調æŽçã§ãããã¹ããšç»åã®å
¥åã256K ããŒã¯ã³ã®ã³ã³ããã¹ããŠã£ã³ããŠã140 以äžã®èšèªããã€ãã£ããªé¢æ°åŒã³åºã (function calling) ã«å¯Ÿå¿ããŸããåŸè
㯠NVIDIA ModelOpt ã§ 4 ããã FP4 (NVFP4) ã«éååããæŽŸççã§ãã¡ã¢ãªäœ¿çšéãçŽ 18.5 GB (ããŒã¹ã¢ãã«æ¯ 68% åæž) ã«æããçŽ 2.5 åé«éãªæšè«ãå®çŸããªããå
ã¢ãã«ã® 97ã99% ã®å質ãç¶æããŸããSageMaker ã³ã³ãœãŒã«ãŸã㯠SageMaker Python SDK ããæ°ã¯ãªãã¯ã§ãããã€ã§ããŸãã Qwen3.6-35B-A3B-NVFP4 ããã³ Wan2.1-T2V-1.3B-Diffusers ã¢ãã«ã Amazon SageMaker JumpStart ã§å©çšå¯èœã« NVIDIA ãéååãã Qwen3.6-35B-A3B-NVFP4 ãš Alibaba ã® Wan2.1-T2V-1.3B-Diffusers ã® 2 ã€ã®åºç€ã¢ãã«ã Amazon SageMaker JumpStart ã«è¿œå ãããŸãããåè
ã¯ãšãŒãžã§ã³ãåã³ãŒãã£ã³ã°ããã«ãã¢ãŒãã«æšè«ãé·æã³ã³ããã¹ãçè§£ã«åãã Mixture-of-Experts (MoE) ã¢ãã«ã§ãNVFP4 éååã«ããã¡ã¢ãªäœ¿çšéã倧å¹
ã«åæžããŠããŸããåŸè
㯠1.3B ãã©ã¡ãŒã¿ã®ããã¹ãããåç»ãçæããã¢ãã«ã§ã8.19 GB ã® VRAM ã§åäœããŸãããããã SageMaker ã³ã³ãœãŒã«ãŸã㯠SageMaker Python SDK ããæ°ã¯ãªãã¯ã§ãããã€ã§ããŸãã 9/15(ç«) Amazon Q Console ãã CloudTrail ã€ãã³ããèªç¶èšèªã§åæ AWS CloudTrail ã Amazon Q Console ãšçµ±åãããèªç¶èšèªã§ AWS ã¢ã«ãŠã³ãã®ã¢ã¯ãã£ããã£ã調æ»ã§ããããã«ãªããŸãããSQL ã¯ãšãªã®èšè¿°ããã°ãã¡ã€ã«ã®æåè§£æãªãã«ãCloudTrail ã®èšå®ç¢ºèªãã»ãã¥ãªãã£èª¿æ»ãéçšãã©ãã«ã·ã¥ãŒãã£ã³ã°ãå®è¡ã§ããŸããAmazon Q Console ã¯ãŠãŒã¶ãŒã«ä»£ãã£ãŠ CloudTrail ã®èšŒè·¡ (Trail)ãé¢é£ãã CloudWatch Logs ãã°ã°ã«ãŒããCloudTrail Lake ã®ã€ãã³ãããŒã¿ã¹ãã¢ãã¯ãšãªããäžè¬çãªããã¥ã¡ã³ãã§ã¯ãªãå®éã®ã¢ã«ãŠã³ãã¢ã¯ãã£ããã£ã«åºã¥ããåçãè¿ããŸããAmazon Q Console ããµããŒãããããã¹ãŠã® AWS åçšãªãŒãžã§ã³ã§å©çšã§ããŸãã AWS Direct Connect ãå°çšæ¥ç¶ã®å®é¡æé (flat-rate pricing) ãçºè¡š AWS Direct Connect ã¯ã10 Gbps ããã³ 100 Gbps ã®å°çšæ¥ç¶ (Dedicated Connection) ã察象ãšããå®é¡æéã¢ãã«ãçºè¡šããŸãããæ¥ç¶ã®åž¯åå¹
ãšãéžæããå°ççã¹ã³ãŒãã«å¿ããæé¡åºå®æéãæ¯æãããšã§ãéžæããæéãã£ã¢ã®ç¯å²å
ã§ããã°ããŒã¿è»¢éã¢ãŠã (DTO) ã®èª²éãçºçããŸãããå°ççãã£ã¢ã¯åäžã¡ããããã°ããŒãã«ãŸã§ã® 5 段éãçšæãããŠããããã©ãã£ãã¯ã®ãã¿ãŒã³ã«åã£ãç¯å²ãéžã¹ãŸããããããŠãåé·çšã® 2 æ¬ç®ã®ããŒããè¿œå æéãªãã§å«ããããŒãã㢠(port-pair)ããšããæ°ããããããžã§ãã³ã°æ¹åŒãå°å
¥ãããŸãããããŒããã¢ã®å©çšã¯æšå¥šãããŠããŸããä»»æã§ãã課éã¢ãŒãã¯æ¥ç¶ããšã«èšå®ã§ããåŸé課éãšã®åãæ¿ããå¯èœã§ããäžåœãªãŒãžã§ã³ãé€ããã¹ãŠã® AWS åçšãªãŒãžã§ã³ã® Direct Connect ãã±ãŒã·ã§ã³ã§å©çšã§ããŸãã 9/16(æ°Ž) Amazon Connect Talent ãäžè¬æäŸéå§ Amazon Connect Talent ã¯ãAI ãšãŒãžã§ã³ããåè£è
ã®é³å£°é¢æ¥ãšã¹ãã«è©äŸ¡ã代è¡ããæ¡çšãœãªã¥ãŒã·ã§ã³ã§ãä»åäžè¬æäŸãéå§ããŸãããAmazon ãæ°å幎ã«ããã£ãŠèç©ããŠããæ¡çšãµã€ãšã³ã¹ã«åºã¥ããŠèšèšãããŠãããæ§é åããã AI é³å£°é¢æ¥ãã³ã³ããã³ã·ãŒããŒã¹ã®è©äŸ¡ãäžè²«ããåºæºã§ã®åè£è
ã¹ã³ã¢ãªã³ã°ãæäŸããŸããæéã¯åè£è
è©äŸ¡ 1 ä»¶ã®å®äºã«ã€ã 20 USD ã®åŸé課éã§ãã·ãŒãã©ã€ã»ã³ã¹ãæäœå©çšéã®ã³ãããã¡ã³ãã¯ãããŸãããååå©çšã®ã客æ§ã¯ AWS ç¡æå©çšæ ã§æå€§ 200 USD çžåœã®ã¯ã¬ãžãããå©çšã§ããŸããçŸæç¹ã§ã¯ããŒãžãã¢åéšãªãŒãžã§ã³ãšãªã¬ãŽã³ãªãŒãžã§ã³ã®ã¿ã§å©çšå¯èœã§ãã Amazon Connect Customer ãã«ã¹ã¿ã ã¡ããªã¯ã¹ã® API ã«ããäœæã»ç®¡çã»æ€çŽ¢ã«å¯Ÿå¿ Amazon Connect Customer ã«ãã«ã¹ã¿ã ã¡ããªã¯ã¹ãããã°ã©ã ãã管çããããã® 7 ã€ã® API (CreateMetricãDeleteMetricãDescribeMetricãListMetricsãSearchMetricsãUpdateMetricContentãUpdateMetricMetadata) ã远å ãããŸããããããŸã§ã³ã³ãœãŒã«ã§ã®æåäœæ¥ãå¿
èŠã ã£ãã«ã¹ã¿ã ã¡ããªã¯ã¹ã®å®çŸ©ããã³ãŒããšããŠäžå
管çã§ããããã«ãªããŸããè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãç°å¢ã«ã¡ããªã¯ã¹å®çŸ©ãå±éããéã®å®çŸ©ã®ãã (drift) ãé²ãããã¹ãŠã®å€æŽã¯ AWS CloudTrail ã«èšé²ãããŸããAmazon Connect Customer ãæäŸããããã¹ãŠã® AWS ãªãŒãžã§ã³ã§å©çšã§ããŸãã Amazon ECS ã Amazon S3 Files ã®ãµããŒãã Amazon EC2 èµ·åã¿ã€ãã«æ¡åŒµ Amazon ECS ã® EC2 èµ·åã¿ã€ãã§å®è¡ããã¿ã¹ã¯ãããAmazon S3 Files ããªã¥ãŒã ãããŠã³ãã§ããããã«ãªããŸãããS3 Files 㯠Amazon EFS äžã«æ§ç¯ãããå
±æãã¡ã€ã«ã·ã¹ãã ã§ãS3 ãã±ããå
ã®ããŒã¿ãã³ãŒã倿Žãªããã³ããŒãã¹ããŒãžã³ã°ãªãã«æšæºçãªãã¡ã€ã«æäœã§èªã¿æžãã§ããŸãããããŸã§ AWS Fargate ãš Amazon ECS Managed Instances ã§å©çšå¯èœã§ããããä»åã®æ¡åŒµã«ããAmazon ECS ãå«ã 3 ã€ã®èµ·åã¿ã€ããã¹ãŠã§åãä»çµã¿ã䜿ããããã«ãªããŸããããã¹ãŠã® AWS åçšãªãŒãžã§ã³ãš AWS GovCloud (US) ãªãŒãžã§ã³ã§å©çšã§ããŸãã 9/17(æš) Amazon Quick ãåå¥ã·ãŒãã®çæãšç»åããã®åææ§ç¯ã«å¯Ÿå¿ Amazon Quick ã® Generate Analysis æ©èœãæ¡åŒµãããããã·ã¥ããŒãäœæãå¹çåãã 2 ã€ã®æ©èœã远å ãããŸããã1 ã€ç®ã® Generate Sheet ã¯ãéããŠããåæã®äžã«èªç¶èšèªã®æç€ºã ãã§åäžã®ã·ãŒãã远å ããæ©èœã§ãã2 ã€ç®ã¯ãæ¢åããã·ã¥ããŒãã®ç»å (ä»ç€Ÿ BI ããŒã«ã®ãã®ãå«ã) ãããã³ããã«æ·»ä»ããç·šéå¯èœãªåæãšããŠåæ§ç¯ããæ©èœã§ããã©ã¡ããçæçµæã¯éåžžã® Amazon Quick ã®åæã§ãããå
¬éã¯ãŒã¯ãããŒãåã蟌ã¿ãCI/CD ãã€ãã©ã€ã³ãæåç·šéãšãã®ãŸãŸçµã¿åãããŠäœ¿ããŸããæäŸéå§æç¹ã§ã¯ Enterprise ãµãã¹ã¯ãªãã·ã§ã³ã® Author Pro ãŠãŒã¶ãŒã察象ã§ãAuthor ãŠãŒã¶ãŒããçµç¹ãã¢ã¯ã»ã¹ãå¶éããŠããªãå Žå㯠2026 幎 12 æãŸã§ Amazon Quick Enterprise ã®ããã¢ãŒã·ã§ã³ã¢ã¯ã»ã¹ã§å©çšã§ããŸããã©ã¡ãã®æ©èœããAmazon Quick ãå©çšå¯èœãªãã¹ãŠã® AWS ãªãŒãžã§ã³ã§äžè¬æäŸãããŠããŸãã AWS Elastic Beanstalk ãå
±æã€ã³ãã©ã¹ãã©ã¯ãã£äžã§è€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãã Cluster Mode ãå°å
¥ AWS Elastic Beanstalk ã«æ°ãããããã€ã¢ãŒããCluster Modeãã远å ãããŸãããåŸæ¥ã® Standard Mode ãã¢ããªã±ãŒã·ã§ã³ããšã«å°çšç°å¢ãäœãã®ã«å¯ŸããCluster Mode 㯠Amazon EKS ãåºç€ãšãããã¢ã«ãŠã³ãå
ã®ããŒã«ãããã€ã³ãã©ã¹ãã©ã¯ãã£äžã§è€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãããœãŒã¹ã³ãŒããDockerfileãAmazon ECR ã®ã³ã³ããã€ã¡ãŒãžã®ãããããæž¡ãã ãã§ãã³ã³ããåããããããžã§ãã³ã°ãéçšãŸã§ Elastic Beanstalk ã管çãããããKubernetes ã®éçšã¯ Elastic Beanstalk åŽã«ä»»ããããŸããè¿œå æéã¯ãªããEKS ã¯ã©ã¹ã¿ãŒãš EKS Auto Mode ãå«ãæ¶è²»ãªãœãŒã¹åã®ã¿èª²éãããŸããElastic Beanstalk ãæäŸããããã¹ãŠã® AWS åçšãªãŒãžã§ã³ã§å©çšã§ããŸãã AWS Transfer Family ã Network Load Balancer (NLB) é
äžã® SFTP ãµãŒããŒã§éä¿¡å
IP ä¿æããµããŒã AWS Transfer Family ã® SFTP ãµãŒããŒããPROXY protocol v2 (PPv2) ã«ããã¯ã©ã€ã¢ã³ãéä¿¡å
IP ã®ä¿æã«å¯Ÿå¿ããŸãããåŸæ¥ãVPC ãã¹ãåãšã³ããã€ã³ãã®å段㫠NLB ãé
眮ãããšãTransfer Family ã«ã¯ NLB ã®ãã©ã€ããŒã IP ããèŠããããã°ãã€ãã³ããã«ã¹ã¿ã ID ãããã€ããŒã®èªèšŒãªã¯ãšã¹ãã«å®éã®ã¯ã©ã€ã¢ã³ã IP ãèšé²ãããŸããã§ãããæ¬ã¢ããããŒãã«ãããNLB ã¿ãŒã²ããã°ã«ãŒãã® PPv2 ãšããµãŒããŒåŽã§ SftpMode ã PROXY_PROTOCOL_V2_ENFORCED ã«èšå®ããããšãçµã¿åãããŠãã¯ã©ã€ã¢ã³ãã®å® IP ã IP ããŒã¹ã®èªå¯ãç£æ»ãã³ã³ãã©ã€ã¢ã³ã¹çšéã«å©çšã§ããŸãããªã匷å¶ã¢ãŒãã«åãæ¿ããéã¯ãå
ã« NLB ã¿ãŒã²ããã°ã«ãŒãåŽã§ PPv2 ãæå¹åãããã¹ãŠã®æ¥ç¶ã§ PPv2 ããããŒãå±ããŠããããšããã°ã§ç¢ºèªããŠããåãæ¿ããŠãã ãããããããŒã®ãªãçµè·¯ãæ®ã£ãŠãããšããã®æ¥ç¶ã¯æåŠãããŸããããããŠãVPC ãšã³ããã€ã³ãã®ã»ãã¥ãªãã£ã°ã«ãŒãã¯ä¿¡é Œãã NLB çµç±ã®éä¿¡ã®ã¿ãèš±å¯ããããå¶éããå¿
èŠããããŸããTransfer Family ãå©çšå¯èœãªãã¹ãŠã® AWS ãªãŒãžã§ã³ã§å©çšã§ããŸãã 9/18(é) AWS PrivateLink ããããã¯ãŒã¯ã»ã°ã¡ã³ããžã®ã¢ã¯ã»ã¹ãå¯èœã«ãã Tunnel Endpoint ãçºè¡š AWS PrivateLink ã«æ°ããã¿ã€ãã® VPC ãšã³ããã€ã³ãã§ãã Tunnel Endpoint ã远å ãããŸãããCIDR ç¯å² (ãããã¯ãŒã¯ã»ã°ã¡ã³ã) ã衚ã Resource Configuration ãäœæã㊠AWS RAM ã§å
±æãããšãå
±æãåããåŽã¯ Tunnel Endpoint ãäœæããGENEVE ã«ãã»ã«åã䜿ã£ãŠãã® CIDR ç¯å²å
ã®ãªãœãŒã¹ã«ãã©ã€ããŒãã«ã¢ã¯ã»ã¹ã§ããŸããåŸæ¥ã¯ãªãœãŒã¹ã 1 ã€ã〠Resource Configuration ãšããŠç»é²ããå¿
èŠããããŸããããCIDR åäœã§ã®å
±æã«ãããå€éšã®ãã³ããŒãªã©ã«å€æ°ã®ãªãœãŒã¹ããŸãšããŠå
±æã§ããŸããæé㯠Tunnel Endpoint ã®æé課éãšããšã³ããã€ã³ããééããããŒã¿åŠçéã«å¿ãã GB å䟡ã®èª²éã§ããæ±äº¬ãªãŒãžã§ã³ã倧éªãªãŒãžã§ã³ãå«ã 28 ãªãŒãžã§ã³ã§å©çšã§ããŸãã æ°ãã AgentCore Runtime ã Amazon Bedrock AgentCore ã§å©çšå¯èœã« Amazon Bedrock AgentCore ã®ãµãŒããŒã¬ã¹ microVM ã³ã³ãã¥ãŒãã§ãã AgentCore Runtime ã®æ¬¡äžä»£ããŒãžã§ã³ (platformVersion V2) ãå©çšå¯èœã«ãªããŸãããV2 ã®äž»çŒã¯ãã³ã³ããã€ã¡ãŒãžã®ãµã€ãºãåæå®è¡æ°ã«é¢ä¿ãªãã³ãŒã«ãã¹ã¿ãŒãæéãäžå®ã«ãªãããšã§ãããšãŒãžã§ã³ãç°å¢ãäžåºŠæºåããŠã¹ãããã·ã§ãããååŸããæ°ããã€ã³ã¹ã¿ã³ã¹ã¯ãããã埩å
ããæ¹åŒã«ããã200 MB ãã 2 GB ã®ã³ã³ããã€ã¡ãŒãžã§ P75 ã³ãŒã«ãã¹ã¿ãŒã 1.9ã2.0 ç§ãéæããŠããŸã (V1 㯠5.4ã30 ç§)ããŸããšã©ã¹ãã£ãã¯ã¡ã¢ãªç®¡ç (elastic memory management) ã«ãããã»ãã·ã§ã³äžã«æªäœ¿çšãšãªã£ãã¡ã¢ãªãååããããŒã¯ã§ã¯ãªãå®äœ¿çšéã«åºã¥ããŠèª²éãããŸããäºåããããžã§ãã³ã°äžèŠããŒãã¹ã±ãŒã«ãããŒããŠã§ã¢ã¬ãã«ã®ã»ãã·ã§ã³åé¢ãšãã£ããµãŒããŒã¬ã¹ã®ç¹æ§ã¯ãã®ãŸãŸç¶æãããŸããããŒãžãã¢åéšããªãã€ãªããªã¬ãŽã³ãã¢ã€ã«ã©ã³ããæ±äº¬ã® 5 ãªãŒãžã§ã³ã§å©çšã§ããã©ã³ã¿ã€ã ã®äœææãšæŽæ°æã« platformVersion ã V2 ã«èšå®ããã ãã§æå¹åã§ããŸãã Moonshot AI ã® Kimi K3 ã Amazon Bedrock ã§äžè¬æäŸéå§ Moonshot AI ã® Kimi K3 ã Amazon Bedrock ã§äžè¬æäŸãéå§ããŸãããMoonshot AI ã«ãããšãKimi K3 ã¯åç€Ÿã®æã髿§èœãªã¢ãã«ã§ããããªãŒãã³ã¢ãã«ãšããŠåã㊠2.8 å
ãã©ã¡ãŒã¿ã«å°éããã¢ãã«ã§ãããã€ãã£ããªããžã§ã³æ©èœãš 100 äžããŒã¯ã³ã®ã³ã³ããã¹ããŠã£ã³ããŠãåããå€§èŠæš¡ãªããžããªããŸããé·æéã®ã³ãŒãã£ã³ã°ã»ãã·ã§ã³ãã¹ãã£ã³ããŒãžãã¹ã¯ãªãŒã³ã·ã§ãããå«ãè€æ°ããã¥ã¡ã³ãã®åæãé·æéã®ãšãŒãžã§ã³ãã¯ãŒã¯ãããŒã«é©ããŠããŸããMoonshot AI ã«ãããšãåäžä»£ã® Kimi K2 ãšæ¯èŒããŠã¹ã±ãŒãªã³ã°å¹çãçŽ 2.5 ååäžããŠããŸããBedrock äžã®ãªãŒãã³ãŠã§ã€ãã¢ãã«ãšããŠåããŠæç€ºçããã³ãããã£ãã·ã¥ã«å¯Ÿå¿ãããã£ãã·ã¥èªã¿åãã¯éåžžå
¥åã® 10 åã® 1 ã®å䟡ã§èª²éãããŸããæäŸã¯ã¯ãã¹ãªãŒãžã§ã³æšè«çµç±ã§ãAmazon Bedrock ãå©çšå¯èœãªãã¹ãŠã® AWS ãªãŒãžã§ã³ããåŒã³åºããŸããUS Geo æšè«ãããã¡ã€ã«ãšã°ããŒãã«æšè«ãããã¡ã€ã«ãçšæãããŠãããæ±äº¬ãªãŒãžã§ã³ã倧éªãªãŒãžã§ã³ãããå©çšã§ããŸãã ããã§ã¯ããŸãæ¥é±ãäŒãããŸãããïŒ èè
ã«ã€ã㊠å€å± æ¥ (Kaede Koya) / @KaedeKoya35328 AWS Japan ã®ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ããšããŠãå€çš®å€æ§ãªæ¥çã®ã客æ§ããæ¯æŽããŠããŸããç¹å®ã®æè¡ããµãŒãã¹ã«åãããå¹
åºãåéã®ãçžè«ã«å¯Ÿå¿ããæè¡çžè«äŒãåçš®ã€ãã³ãã«ãŠç»å£ããŠããŸãã奜ã㪠AWS ãµãŒãã¹ã¯ Amazon Lightsail ãš Kiro ã§ãã·ã³ãã«ãã€æè»ã«ã¯ã©ãŠãã®åãæŽ»çšã§ããç¹ããæ°ã«å
¥ãã§ããäŒæ¥ã¯æç¬ 2 å¹ãšéãã«éãããŠããŸãã
ã¯ããã« ããã«ã¡ã¯ãECåºç€éçºæ¬éšSREéšã«ãŒã決æžSREãããã¯ã®éç°ã§ããããã¯ãªãŒããšããŠãZOZOTOWNã®ã«ãŒãæ±ºæžæ©èœã®ãªãã¬ã€ã¹ãéçšãæ
åœããŠããŸãã ã«ãŒã決æžSREãããã¯ã§ã¯ãSlackãèµ·ç¹ãšããChatOpsã§éçšäœæ¥ã®èªååã«åãçµãã§ããŸãã以åã®èšäºã§ç޹ä»ããAWS ChatbotããŒã¹ã®åºç€ãçŽ2幎éçšããäžã§ãã¢ã¯ã»ã¹å¶åŸ¡ãšããŒã«è¿œå ã³ã¹ãã®èª²é¡ãèŠããŠããŸãããæ¬èšäºã§ã¯ãã®èª²é¡ãšãArgo Eventsã軞ã«ChatOpsåºç€ãåæ§ç¯ããåãçµã¿ã玹ä»ããŸãã ç®æ¬¡ ã¯ããã« ç®æ¬¡ èæ¯ã»èª²é¡ 課é¡1: ã¢ã¯ã»ã¹å¶åŸ¡ãç²ã 課é¡2: ããŒã«è¿œå ã®ããŒãã«ãé«ã æ°åºç€ã®èŠä»¶ æ°ããChatOpsåºç€ã®å
šäœå Slackã®å¶çŽãšä¿¡é Œãã§ãŒã³ã«ããèªå¯ å¶çŽ1: Workflowã®æçš¿ããã¯å®è¡è
ãåãããªã å¶çŽ2: 3ç§ã«ãŒã«ãšãªãã©ã€ å¶çŽ3: çœ²åæ€èšŒã«ã¯çã®ãªã¯ãšã¹ãããã£ãå¿
èŠ å¶çŽ4: Request URLã¯Slack Appããšã«1ã€ ä¿¡é Œãã§ãŒã³ã§å®è¡è
ãç¹å®ãã Gatekeeperã«ããèªå¯ãæ¿èªãç£æ»ã®äžå
å SSMããªã·ãŒã«ãã宣èšçãªèªå¯ å±éºãªæäœãžã®æ¿èªãã㌠蚱å¯ãèšé²ããæ§é åç£æ»ãã° ãªãArgo Eventsãªã®ã Argo Eventsãæ¬çªéçšã«èŒããèšèšå€æ EventBusã¯é«å¯çšæ§ããããŠæ±ããªã ç£èŠã®çµã¿èŸŒã¿ Sensorã¯ã«ãŒãã£ã³ã°ã ããå®è¡æš©éã¯executeã ã K8s Jobã«ããããŒã«å®è¡æ©æ§ PodTemplateã§ããŒã«ã®Jobå®çŸ©ãé
åžãã ãã«ãããã³ãèšèšãšããŒã«è¿œå ã®äœéš å
±éã®å
¥å£ãšãããã³ãããšã®å®è¡ã¹ã¿ã㯠ããŒã«ã«æž¡ãæšæºãã€ããŒã ããŒã«è¿œå ã¯SSMããªã·ãŒãšãããã§ã¹ãã ã å°å
¥ã®å¹æ ãŸãšã èæ¯ã»èª²é¡ ã«ãŒã決æžSREãããã¯ã§ã¯ãéç±ååïŒçºå£²éå§æãªã©ã«ã¢ã¯ã»ã¹ãæ¥æ¿ã«éäžãã人æ°ååïŒã®ç»é²ãªã©ã®éçšäœæ¥ãSlackããå®è¡ã§ããããã«ããŠããŸããåŸæ¥ã®åºç€ã¯ãSlack Workflow â AWS Chatbot â AWS Lambdaããšããæ§æã§ãããéãšã³ãžãã¢ã§ãSlack Workflowã®ãã©ãŒã ã«å
¥åããã ãã§éçšããŒã«ãå®è¡ã§ããŸããæ§æã®è©³çްããã³ãã³ãã©ã€ã³ããŒã«ãLambda颿°åãã工倫ã¯ä»¥äžã®èšäºã§ç޹ä»ããŠããŸãã techblog.zozo.com æ¬èšäºã¯ããã®æ§æãçŽ2幎éçšããå
ã®è©±ã§ããããŒã«ãšå©çšè
ãå¢ãããã®å
ããã«éçšæ¥åã®ããŒã«åãé²ããã«ããã£ãŠã次ã®2ã€ã®èª²é¡ãç¡èŠã§ããªããªããŸããã 課é¡1: ã¢ã¯ã»ã¹å¶åŸ¡ãç²ã AWS Chatbotã®ã¢ã¯ã»ã¹å¶åŸ¡ã¯ããã£ãã«ã«çŽä»ãIAMããŒã«ãšã¬ãŒãã¬ãŒã«ããªã·ãŒãåºæ¬ã§ããååã®èšäºã§ãåœæã§ããç¯å²ã®å¶åŸ¡ã玹ä»ããŸããããæ¬¡ã®èŠçŽ ã¯ä»çµã¿ãšããŠå®çŸã§ããŸããã§ããã ãã©ã®ãã£ãã«ã§ã誰ããã©ã®ã³ãã³ãããå®è¡ã§ããããšãããã³ãã³ãåäœãã€ãŠãŒã¶ãŒåäœã®èªå¯ åé€ãªã©ã®å±éºãªæäœã«å¯Ÿãããå®è¡åã®æ¿èªãã㌠ã誰ãäœãå®è¡ãããªãèš±å¯ãããã®ãããæ©æ¢°çã«è¿œè·¡ã§ããç£æ»ãã° å®è¡ããã³ãã³ãã¯Slackã®ã¡ãã»ãŒãžãšããŠæ®ããŸããããããããã¯äººãç®èŠã§è¿œããå±¥æŽã§ãã£ãŠãæåŠãããå®è¡ãèš±å¯ã®å€ææ ¹æ ãŸã§å«ããŠæ€çŽ¢ãéèšãã§ããç£æ»ãã°ã§ã¯ãããŸãããéçšããŒã«ã®äžã«ã¯ããŒã¿ãæžãæããæäœãå«ãŸãããããå©çšè
ãå¢ããã»ã©ãã®ç²ãããªã¹ã¯ã«ãªã£ãŠãããŸããã 課é¡2: ããŒã«è¿œå ã®ããŒãã«ãé«ã AWS Chatbotããå®è¡ã§ããã®ã¯Lambdaãã¯ãããšããAWSãªãœãŒã¹ã®æäœã ãã§ããéçšããŒã«ãChatOpsã«èŒããã«ã¯ã1ã³ãã³ãã§å®çµãããããªç°¡åãªåŠçã§ããããŒã«ããšã«Lambda颿°ãå®è£
ããå¿
èŠããããŸããããããæ°ããããŒã«ãå°å
¥ããéã®éå£ã«ãªã£ãŠããŸããã ããã«ãã«ãŒã決æžSREãããã¯ã®éçšããŒã«ã«ã¯EKSäžã®JobãšããŠåãããããã®ããããŸããã³ã³ããã€ã¡ãŒãžãšããŠå®æããŠããããŒã«ã§ããChatOpsã«èŒããããã ãã«Lambdaãžç§»æ€ããã®ã¯æ¬æ«è»¢åã§ããå®è¡åœ¢æ
ãLambdaã«çžãããŠããããšãããã®éå£ãããã«é«ãããŠããŸããã æ°åºç€ã®èŠä»¶ 課é¡ãæŽçããŠãæ°ããChatOpsåºç€ã«æ±ããèŠä»¶ã次ã®ããã«å®ããŸããã åé¡ èŠä»¶ èªå¯ ã³ãã³ãããŠãŒã¶ãŒããã£ãã«ã®åäœã§å®è¡å¯åŠãå¶åŸ¡ã§ãã æ¿èª å±éºãªæäœã¯ãæš©éãæã€æ¿èªè
ã®æ¿èªãçµãŠããå®è¡ããã ç£æ» èš±å¯ãæåŠãããã¹ãŠã®å®è¡å€æãæ§é åãã°ãšããŠæ®ã å®è¡åœ¢æ
K8s JobãšLambdaã®ã©ã¡ãã§ãããŒã«ãå®è£
ã§ãã UX éãšã³ãžãã¢ã¯åŸæ¥ãšåãSlack Workflowã®ãã©ãŒã ããå®è¡ã§ãã æ¡åŒµæ§ ããŒã«ã®è¿œå ãå©çšããŒã ã®æ¡å€§æã«ãåºç€åŽã®å€æŽãäžèŠã§ãã æ°ããChatOpsåºç€ã®å
šäœå ãã®èŠä»¶ãæºããããã«æ§ç¯ãããæ°åºç€ã®å
šäœåã瀺ããŸãã å³ã®äžå¿ã¯ãEKSã®æåã«çœ®ãã Gatekeeper Lambda ã§ããèªèšŒãèªå¯ãæ¿èªãç£æ»ãäžæã«æ
ãé¢éã§ãããã®å
ã®EKSã§ã¯ã Argo Events ãèªå¯æžã¿ã®ã€ãã³ããåããŠããŒã«ãèµ·åããŸãã 1ãªã¯ãšã¹ãã®æµãã远ããšæ¬¡ã®ããã«ãªããŸãã å©çšè
ãSlack Workflowã®ãã©ãŒã ã«å
¥åããŠéä¿¡ãããšãWorkflowãBotãšããŠæå®ã®ãã£ãã«ã«ã³ãã³ããæçš¿ãã Slack AppãEvents APIã§ãã®æçš¿ãåãåããAPI Gatewayçµç±ã§Gatekeeper Lambdaã«é
éãã Gatekeeperãçœ²åæ€èšŒãå®è¡è
ã®ç¹å®ãããªã·ãŒè©äŸ¡ãæžãŸããèš±å¯ããå Žåã®ã¿ãã€ããŒããæ£èŠåããŠEKSã®internal ALBãžè»¢éãã ALBã®å
ã«ããArgo Eventsã®Webhook EventSourceãã€ãã³ããåããEventBusãžæµã Sensorãã€ãã³ãã®çš®å¥ãšæ¿èªèŠåŠãèŠãŠK8s Jobãäœæãããæ¿èªãå¿
èŠãªã³ãã³ãã¯æ¿èªãªã¯ãšã¹ããæçš¿ããJobïŒdispatchïŒãžããã以å€ã¯å®è¡ãæ
ãJobïŒexecuteïŒãžæ¯ãåãã ããŒã«æ¬äœãK8s JobãŸãã¯LambdaãšããŠå®è¡ãããçµæãSlackã®ã¹ã¬ããã«éç¥ãã ãã®æµãã¯Workflowçµç±ã®ãã®ã§ãããšã³ãžãã¢åãã«ã¯ãBotãžã®çŽæ¥ã¡ã³ã·ã§ã³ãšSlash Commandã®çµè·¯ããããããããåãAPI GatewayãšGatekeeperãéããŸããæ¬èšäºã§ã¯ãéãšã³ãžãã¢ã䜿ãWorkflowçµç±ã軞ã«èª¬æããŸãã èšèšã®æ¹éã¯æ¬¡ã®éãã§ããèªèšŒãèªå¯ãæ¿èªãç£æ»ã¯ãå®è¡åºç€ã§ããEKSã®æåã®Gatekeeperã§äžå
åããŸããEKSåŽã¯Argo Eventsã§ã€ãã³ããåããŠå®è¡ã«å°å¿µããŸããSlackãšã®æ¥ç¹ã¯åäžã®Slack Appã«éçŽããããŒã«ã远å ããŠãSlack AppãAPI GatewayãGatekeeperã«ã¯æãå
¥ããªãæ§é ã«ããŸãã ãã®åæ
ã«ãããArgo Events以éã«ã¯ã誰ãäœãå®è¡ããããã確å®ããæ£èŠåæžã¿ã€ãã³ãã ããæµããŸããSlackãããã³ã«ãšã®ãããšãã¯Gatekeeperã§å®çµããŠãããããEventSourceã¯Slackã®çœ²åãæ€èšŒããå¿
èŠããããŸãããGatekeeperãšå
±æããBearerããŒã¯ã³ã§ãGatekeeperèªèº«ãèªèšŒããã ãã§æžã¿ãŸãã Slackã®å¶çŽãšä¿¡é Œãã§ãŒã³ã«ããèªå¯ èšèšã§æåã«åãåã£ãã®ã¯ãSlackãã©ãããã©ãŒã ç¹æã®å¶çŽã§ãã å¶çŽ1: Workflowã®æçš¿ããã¯å®è¡è
ãåãããªã Slack Workflowãæçš¿ããã¡ãã»ãŒãžã®éä¿¡è
ã¯ãå®è¡ãã人ã§ã¯ãªãWorkflowã®Botã§ããEvents APIã§åãåãã€ãã³ãã® user ãã£ãŒã«ããèŠãŠããããã«ããã®ã¯Botã§ãã£ãŠããã©ãŒã ã«å
¥åãã人ãã§ã¯ãããŸãããã³ãã³ãåäœãã€ãŠãŒã¶ãŒåäœã®èªå¯ã«ã¯å®è¡è
ã®ç¹å®ãå¿
é ãªã®ã§ãããã¯åºç€ã®æç«ã«é¢ããå¶çŽã§ãã å¶çŽ2: 3ç§ã«ãŒã«ãšãªãã©ã€ Slackã®Events APIã¯ã3ç§ä»¥å
ã«å¿çããªããã°é
é倱æãšã¿ãªããŠãªãã©ã€ããŸããGatekeeperã®äžã§éãåŠçã¯ã§ããŸãããããã§ãEKSãžã®è»¢éã¿ã€ã ã¢ãŠãã2ç§ã«èšå®ããèªå¯å€æãšè»¢éã ããè¡ã£ãŠå³åº§ã«å¿çãè¿ãæ§é ã«ããŸããããŸãããªãã©ã€ã«ããåäžã€ãã³ãã®åé
éã«åããŠãGatekeeperã§éè€ãæé€ããŠããŸãã å¶çŽ3: çœ²åæ€èšŒã«ã¯çã®ãªã¯ãšã¹ãããã£ãå¿
èŠ Slackã®ãªã¯ãšã¹ã眲åã¯ãã¿ã€ã ã¹ã¿ã³ããšãªã¯ãšã¹ãããã£ãé£çµããæååããèšç®ãããŸãããªã¯ãšã¹ãã®èªèšŒã¯ API Gatewayã®Lambda Authorizer ãžåé¢ããã®ãå®ç³ã§ãããAuthorizerã«ã¯ãªã¯ãšã¹ãããã£ãæž¡ãããŸãããã€ãŸãSlackã®çœ²åæ€èšŒã¯Authorizerã§ã¯å®çŸã§ããŸããããã®ããèªèšŒãåé¢ãããçœ²åæ€èšŒããèªå¯ãŸã§ãGatekeeperãšãã1ã€ã®Lambdaã«éããŠããŸãã å¶çŽ4: Request URLã¯Slack Appããšã«1〠SlackãAppãžãªã¯ãšã¹ããå±ããå
ã®URLïŒRequest URLïŒã¯ãæ©èœããšã«Appå
šäœã§1ã€ã§ããEvents APIãSlash CommandsãInteractivityïŒæ¿èªãã¿ã³ïŒã®ãããããããã³ãå¥ã«å¥ã®URLãèšå®ã§ããŸãããããã§å
šããã³ãå
±éã®åäžãšã³ããã€ã³ã POST /chatops ã§ãã¹ãŠãåããã©ã®ããŒã ã®ã³ãã³ããã®è§£æ±ºã¯Gatekeeperãchannel-mapã§è¡ãæ§é ã«ããŸãããçµè·¯ããšã«ãã€ããŒãã®åœ¢åŒã¯ç°ãªããŸãããGatekeeperãããŒã¹ããŠåãæ£èŠåãã€ããŒãã«å€æããŸãã äžæ¹ãç°å¢ã®è»žã§ã¯åãå¶çŽã«æ©ãŸãããŸããdevãstgãprdã§URLãåããããªããããSlack Appã¯ç°å¢å¥ã«äœããŸããAppã®è€è£œã«ã¯App Manifestã䜿ããèšå®ãã¡ã€ã«ããªããžããªç®¡çããã°ã¬ãã¥ãŒãå¯èœã§ããããã«ãSlash Commandã®ååã¯ã¯ãŒã¯ã¹ããŒã¹å
ã§ã°ããŒãã«ã§ãããã®ããdevãšstgã®ã³ãã³ãåã«ã¯ç°å¢ãµãã£ãã¯ã¹ãä»ãïŒäŸïŒ /example-tool-dev ïŒãGatekeeperãã³ãã³ãã®è§£éæã«ãµãã£ãã¯ã¹ãé€å»ããŸãã ã€ãŸããåäžSlack Appããšã¯ãåäžç°å¢å
ã®ããã³ãéã§1ã€ãšããæå³ã§ããããã³ã軞ã¯1ã€ã®Appã«éçŽããç°å¢è»žã¯Appããšã«åé¢ããŸãããã®ç·åŒãèªäœããSlackãã©ãããã©ãŒã ã®å¶çŽããå°ãããèšèšã§ãã ä¿¡é Œãã§ãŒã³ã§å®è¡è
ãç¹å®ãã å¶çŽ1ã§æãããå®è¡è
ãåãããªããåé¡ãžã®çãããä¿¡é Œãã§ãŒã³ã§ãã Workflowã®ãã©ãŒã ã«ã¯å®è¡è
ã瀺ãå
¥åæ¬ããããæçš¿ãããã¡ãã»ãŒãžæ¬æã«å®è¡è
ã®ãŠãŒã¶ãŒIDãåã蟌ãŸããŸãããã ããæ¬æã«æžãããå®è¡è
ãç¡æ¡ä»¶ã«ä¿¡ãããšãä»»æã®ãŠãŒã¶ãŒãä»äººã«ãªãããŸããŠããŸããŸããããã§ãæ¬æäžã®å®è¡è
æ
å ±ãä¿¡é ŒããŠããæ¡ä»¶ãããæ¬¡ã®é£éãšããŠæ§æããŸããã Slackã®çœ²åæ€èšŒã«ãããã€ãã³ããSlackããæ¥ãããšãä¿èšŒãã ã€ãã³ãã® bot_id ããäºåã«ç»é²ãããä¿¡é Œã§ããWorkflowãã®ãã®ãšå®å
šäžèŽããããšã確èªãã èŠæ±ãããã³ãã³ããããã®Workflowã«èš±å¯ãããã³ãã³ãã®ç¯å²å
ã§ããããšã確èªãã ãããŸã§éã£ãŠåããŠãæ¬æäžã®å®è¡è
æ
å ±ããWorkflowã®ãã©ãŒã ãåã蟌ãã å€ããšããŠä¿¡é Œãã bot_id ã¯Workflowããšã«æãåºãããèå¥åã§ããã®Workflow以å€ã¯åã bot_id ã§æçš¿ã§ããŸããã人éãææã¡ã§åœè£
ããã¡ãã»ãŒãžã¯æçš¿è
ã人éã®user_idã«ãªããããBotæçš¿ãšã¯å¿
ãåºå¥ã§ããŸããå®è¡è
ã®æ
å ±ã¯ãWorkflowã®ãã³ãã¬ãŒãã«åã蟌ãã ããã®ã¯ãŒã¯ãããŒãéå§ãã人ããšãã倿°ã§Slackãèªåçã«æ¿å
¥ããŸãããã©ãŒã ã®å
¥åè
ã¯ãã®å€ãåœè£
ã§ããŸããããããŠWorkflowã®ç·šéã³ã©ãã¬ãŒã¿ãŒã管çè
ã«éå®ããããšã§ããã³ãã¬ãŒãèªäœã®æ¹å€ãé²ãã§ããŸãããã®éçšæ¡ä»¶ãŸã§ãå«ããŠãå®è¡è
æ
å ±ã®ä¿¡é Œãæç«ããŸãã äžæ¹ãBotãçµç±ããªã人éã®çŽæ¥ã¡ã³ã·ã§ã³ã§ã¯ãã€ãã³ãã® user ããã®ãŸãŸå®è¡è
ãšããŠäœ¿ããŸãããã®çµè·¯ã§ã¯æ¬æäžã®å®è¡è
æ
å ±ãä¿¡é ŒããŸãããçµè·¯ã«ãã£ãŠãäœãä¿¡é Œããããåãæ¿ããŠããŸãã ãã®èªå¯ã¯fail-closedã«èšèšããŠããŸãã bot_id ãæªç»é²ãªãæåŠãWorkflowã«èš±å¯ãããŠããªãã³ãã³ããªãæåŠãå®è¡è
æ
å ±ãåããªããã°æåŠã§ããæåŠã¯ãã¹ãŠçç±ã³ãŒãïŒ untrusted_bot ã requester_missing ãªã©ïŒä»ãã§ãã°ã«æ®ããŸãã ãªããç§»è¡ã«ããã£ãŠæ¢åã®Slack Workflowã¯äœãçŽãããæçš¿å
ã®å·®ãæ¿ãã§å¯Ÿå¿ããŸãããWorkflowãäœãçŽããš bot_id ãå€ãã£ãŠããŸãããã§ãã bot_id ãç»é²å¶ã«ããèšèšã¯ãããããéçšäžã®æ³šæç¹ãšã»ããã«ãªããŸãã Gatekeeperã«ããèªå¯ãæ¿èªãç£æ»ã®äžå
å ä¿¡é Œãã§ãŒã³ã§å®è¡è
ãç¹å®ã§ããããæ¬¡ã¯ããªã·ãŒè©äŸ¡ã§ããGatekeeperã1ã€ã®ãªã¯ãšã¹ãã«å¯ŸããŠè¡ãåŠçã¯ãé ã«æ¬¡ã®éãã§ãã Slack眲åã®æ€èšŒãšããªãã©ã€ã«ããéè€ãªã¯ãšã¹ãã®æé€ ãã£ãã«IDããã®ããã³ã解決 ä¿¡é Œãã§ãŒã³ã«ããå®è¡è
ã®ç¹å® ããªã·ãŒè©äŸ¡ïŒãã£ãã«ãã³ãã³ãããŠãŒã¶ãŒãã°ã«ãŒããWorkflowïŒ æ¿èªèŠåŠã®å€å®ãšãæ£èŠåãã€ããŒãã®EKSãžã®è»¢é 1ã3ã¯ãããŸã§ã«èª¬æããéãã§ããæ®ãã¯4ãš5ãããªãã¡ããªã·ãŒã«ããèªå¯ãšæ¿èªãããŒããããŠãã®èšé²ã§ãã SSMããªã·ãŒã«ãã宣èšçãªèªå¯ èªå¯ã®ã«ãŒã«ã¯AWS Systems Manager Parameter StoreïŒä»¥äžãSSMïŒã«çœ®ããŠããŸããæ§é ã¯2段éã§ãã 1ã€ç®ã¯ /chatops/channel-map ã§ãSlackã®ãã£ãã«IDããããã³ãïŒããŒã ïŒãšãã£ãã«ã©ãã«ã解決ããŸãããã£ãã«IDãšããç°å¢äŸåã®å€ãæã€ã®ã¯ãã®ãããã ãã§ãåããŒã«ã®ããªã·ãŒã¯ã©ãã«ã ããåç
§ããŸãã { " C0123456789 ": { " tenant ": " zozo-cart ", " label ": " ops " } } 2ã€ç®ã¯ /chatops/policy/{ããã³ã}/{ããŒã«} ã§ãããŒã«ããšã«æ¬¡ã宣èšããŸãã ã³ãã³ãããšã®èš±å¯ãã£ãã«ïŒã©ãã«ïŒãšãèš±å¯ãŠãŒã¶ãŒããã³èš±å¯ã°ã«ãŒãïŒSlackã®User Groupãå©çšïŒ ã³ãã³ãããšã®æ¿èªèŠåŠãšæ¿èªè
ããŒã«ã®å®è¡åœ¢æ
ïŒK8s JobãŸãã¯LambdaïŒãšå€±ææã®é£çµ¡å
{ " invoke ": { " type ": " k8s-job " } , " failure_contact ": " <!subteam^S0AAAAAAA> ", " commands ": { " info ": { " allowed_channels ": [ " ops " ] , " allowed_users ": " * " } , " update ": { " allowed_channels ": [ " ops " ] , " allowed_groups ": [ " S0BBBBBBB " ]} , " delete ": { " allowed_channels ": [ " ops " ] , " allowed_groups ": [ " S0BBBBBBB " ] , " requires_approval ": true , " approver_groups ": [ " S0CCCCCCC " ] , " allow_self_approval ": false } } , " trusted_workflows ": [ { " bot_id ": " B0XXXXXXXXX ", " allowed_commands ": [ " update " ]} ] } ã³ãã³ãã®ããŒã¯ãããŒã«ãå®éã«åãä»ãããµãã³ãã³ãåãšäžèŽãããŸããããŒã«åŽã宣èšã«ãªãã³ãã³ããæåŠããããããããŠãããšGatekeeperã®èªå¯ãéã£ãã³ãã³ãããããŒã«ã匟ããŠããŸããŸããä¿¡é Œãã§ãŒã³ã§äœ¿ãWorkflowã® bot_id ãããã®ããªã·ãŒã® trusted_workflows ã§ç»é²ããŸãã ãŠãŒã¶ãŒåäœã®èªå¯ã¯ãå人IDïŒ allowed_users ïŒãšSlack User GroupïŒ allowed_groups ïŒã®ORã§å€å®ããŸããã¡ã³ããŒã®ç°åã®ãã³ã«ããªã·ãŒãæžãæããã«æžããããåºæ¬ã¯User Groupã§å®£èšããGatekeeperãSlack APIã§ã¡ã³ããŒãå±éããŠå€å®ããŸãããã®å±éã«å€±æããå Žåã¯ãèš±å¯åŽã«åããæåŠããŸãïŒfail-closeïŒã倿ææãæ¬ ããç¶æ
ã§éããšãèªå¯ãã®ãã®ã圢骞åããããã§ãã ããªã·ãŒã®è¿œå ã倿Žã¯SSMãã©ã¡ãŒã¿ã®æŽæ°ã ãã§æžã¿ãGatekeeperã®ãããã€ã¯äžèŠã§ãããã ãã誰ã§ãæŽæ°ã§ããããã§ã¯ãããŸãããããªã·ãŒã¯CloudFormationã§ç®¡çãã倿Žã«ã¯PRã¬ãã¥ãŒãå¿
é ã«ããŠããŸããä¿¡é Œãã§ãŒã³ã®èµ·ç¹ã«ãªã trusted_workflows ãžã® bot_id ã®ç»é²ãããã®ã¬ãã¥ãŒãéããŸããèªå¯ã«ãŒã«ãæžãæããææ®µãéæŸãã§ã¯ãèªå¯ã®ä»çµã¿å
šäœãæå³ã倱ãããã§ãã Gatekeeperã¯SSMãšSlack APIã®ã¹ããããªã³ã°ãé¿ãããããããªã·ãŒãšUser Groupã5åéãã£ãã·ã¥ããŸãã倿Žã®åæ ãæå€§5åé
ããããšã¯ãéçšäžèš±å®¹ã§ãããã¬ãŒããªããšå€æããŸããããã®é
å»¶ã¯ãç·æ¥ã®ã¢ã¯ã»ã¹æš©éã®å¥å¥ªã§ãåãã ãçºçããŸããå³æã«æ¢ããå¿
èŠãããã°ãLambdaã®å®è¡ç°å¢ãå
¥ãæ¿ããŠãã£ãã·ã¥ããšç Žæ£ã§ããŸãã å±éºãªæäœãžã®æ¿èªãã㌠ããªã·ãŒã§æ¿èªãå¿
èŠãšå®£èšãããã³ãã³ãã¯ãå³åº§ã«ã¯å®è¡ãããŸããããŸãdispatch Jobããå®è¡å
å®¹ãšæ¿èªãã¿ã³ãå«ãã¡ãã»ãŒãžãSlackã«æçš¿ããŸããæ¿èªè
ããã¿ã³ãæŒããšããã®ã³ãŒã«ããã¯ãåã³Gatekeeperã«å±ããŸããGatekeeperã¯æŒãã人ãããªã·ãŒäžã®æ¿èªè
ã§ããããšãæ€èšŒããDynamoDBã䜿ã£ãã¯ã³ã·ã§ããå¶åŸ¡ã§åãæ¿èªãäºåºŠå®è¡ãããªãããšãä¿èšŒããŠãããå®è¡ã€ãã³ããEKSãžè»¢éããŸãã æ¿èªã®çްéšãããªã·ãŒã§å®£èšã§ããŸããæ¿èªã«ã¯æå¹æéïŒ approval_ttl_minutes ïŒããããæéãéããæ¿èªãªã¯ãšã¹ãã¯å€±å¹ããŸããå®è¡ãäŸé Œããæ¬äººã«ããèªå·±æ¿èªãèš±ããã©ããïŒ allow_self_approval ïŒãå¶åŸ¡ã§ããå±éºãªæäœã§ã¯èªå·±æ¿èªãçŠæ¢ããŠããŸãã æ¿èªã®ã³ãŒã«ããã¯ãå
¥å£ã¯ã³ãã³ãæçš¿ãšåãGatekeeperã§ããèªå¯ã®å€æããžãã¯ã1ãæã«éãŸã£ãŠããããããæ¿èªãã¿ã³ãæŒããäººã®æ€èšŒãæŒããããšãã£ãæãéãçãŸãã«ããæ§é ã«ãªã£ãŠããŸãã èš±å¯ãèšé²ããæ§é åç£æ»ãã° Gatekeeperã¯ãæåŠã ãã§ãªãèš±å¯ããå®è¡ãæ§é åãã°ãšããŠèšé²ããŸããããã³ãããã£ãã«ãã³ãã³ããå®è¡è
ãçµè·¯ïŒWorkflowçµç±ãŸãã¯çŽæ¥ã¡ã³ã·ã§ã³ïŒãå€æçµæãšçç±ã³ãŒããã¯ã³ã¬ã³ãŒãã«åãŸã£ãŠããŸãããã®ãããå
æãã®ã³ãã³ããå®è¡ããã®ã¯èª°ãããç¹å®ãŠãŒã¶ãŒã®å®è¡ãæåŠãããçç±ã¯äœããããã°æ€çŽ¢ã ãã§çããããŸãã { " event ": " chatops_allowed ", " team ": " zozo-cart ", " channel_id ": " C0123456789 ", " command ": " example-tool update ", " user_id ": " U001 ", " via ": " workflow/B0XXXXXXXXX " } { " event ": " chatops_denied ", " team ": " zozo-cart ", " channel_id ": " C0123456789 ", " command ": " example-tool delete ", " user_id ": " U003 ", " reason ": " user_not_allowed " } æåŠãã°ã ãã§ã¯ç£æ»ã«ãªããŸãããã€ã³ã·ãã³ã調æ»ã§æ¬åœã«ç¥ãããã®ã¯ã誰ãå®è¡ã§ããã®ããã ããã§ããèš±å¯ã®èšé²ãå«ããŠåããŠãå®è¡ã®å
šäœåãåŸããåæ§æã§ããŸãã ãã1ã€ã®èšèšç¹ã¯ç¶²çŸ
æ§ã§ããGatekeeperã®ãã¹ãŠã®ã¬ã¹ãã³ã¹çµè·¯ã¯ãèš±å¯ãæåŠããªãã©ã€ç Žæ£ã転é倱æãšãã£ãããããã®ã€ãã³ãçš®å¥ã§å¿
ããã°ã«æ®ããŸããããã°ã«çŸããªãå®è¡ãã¯æ§é äžååšããªããšããæ§è³ªããç£æ»ãã°ãšããŠä¿¡é Œããããã®åæã§ãã ãªãArgo Eventsãªã®ã å
¥å£ã®é¢éã¯ããã§æããŸãããæ¬¡ã¯EKSåŽãåãåã£ãã€ãã³ããå®è¡ããåºç€ã§ããArgo Eventsã¯ãKubernetesäžã§ã€ãã³ãé§åã®åŠçãå®çŸããããã®ããŒã«ã§ããæ¬¡ã®3ã€ã®ã³ã³ããŒãã³ãã§æ§æãããŸãã EventSource : Webhookãªã©ã§ã€ãã³ããåä¿¡ããŠEventBusãžæµã EventBus : ã€ãã³ããé
éããã¡ãã»ãŒãžãã¹ïŒNATS JetStreamã䜿çšïŒ Sensor : ã€ãã³ãããã£ã«ã¿ããæ¡ä»¶ã«åèŽãããããªã¬ãŒïŒK8s Jobã®äœæãªã©ïŒãçºç«ãã æ¡çšã®æ±ºãæã¯æ¬¡ã®3ç¹ã§ãã ã€ãã³ããåããŠK8s Jobãèµ·åããä»çµã¿ããèªäœããã«å®£èšçãªãããã§ã¹ãã§å®çŸã§ãã EventSourceãEventBusãSensorããã¹ãŠKubernetesãªãœãŒã¹ãªã®ã§ãæ¢åã®GitOpsïŒFluxïŒã®ç®¡çã«ä¹ã ZOZOã§ã¯Argo Workflowsã®CronWorkflowãéçšæžã¿ã§ãArgoãšã³ã·ã¹ãã ã®éçšç¥èŠããã ããã«å ããŠãä»ããŒã ã®æ¡ä»¶ã§Argo Eventsèªäœã®å°å
¥ããã§ã«æ±ºãŸã£ãŠãããã¯ã©ã¹ã¿ã«ã¯ã³ã³ãããŒã©ãå°å
¥æžã¿ã§ãããæè¡çãªé©åãšã¯å¥ã®èŠçŽ ã§ããããã®ç¶æ³ãæ¡çšãåŸæŒãããŸããã Argo Eventsãæ¬çªéçšã«èŒããèšèšå€æ ãã®Argo Eventsãæ¬çªã®å®è¡åºç€ãšããŠéçšããããã§ãèšèšå€æãããã€ããããŸããã EventBusã¯é«å¯çšæ§ããããŠæ±ããªã EventBusã¯NATS JetStreamã§æ§æããŠããŸããã¹ããªãŒã ã«ã¯300ç§ã®éè€æé€çªãèšå®ããŠãããåéããã£ãŠãJobãäºéã«èµ°ããªãæ§é ã§ããSlackã®ãªãã©ã€ã¯æåã®Gatekeeperã§ç Žæ£æžã¿ã®ããããã®çªãåãæã€ã®ã¯Argo Eventså
éšã®åé
éã ãã§ãã ã¬ããªã«æ°ã¯ãæ¬çªãå«ããŠ1ã«ããŠããŸããéçšã³ãã³ãã®å®è¡åºç€ã¯ã決æžã®ãããªããã·ã§ã³ã¯ãªãã£ã«ã«ãªããŒã¿ãã¹ã§ã¯ãããŸãããEventBusãçæéæ¢ãŸã£ãŠããå©çšè
ãã³ãã³ããæã¡çŽãã°å埩ã§ããŸãã ããã倿ãèŠã£ãã®ã¯æ°žç¶åã§ããJetStreamã¯PersistentVolumeãžã®æ°žç¶åãæ§æã§ããŸããããã®åºç€ã§ã¯èšå®ããemptyDirã®ãŸãŸäœ¿ã£ãŠããŸããEventBusãéãã®ã¯ãEventSourceãåããŠããSensorãJobãäœããŸã§ã®ããçåœãªã€ãã³ãã ãã§ããæ¿èªåŸ
ã¡ã®ãããªé·å¯¿åœã®ç¶æ
ã¯DynamoDBåŽãæã€ãããJetStreamã«ã¯æ®ããŸããããããŠPVãä»ããŠããEventBusã®åèµ·åäžã«å±ããã³ãã³ããã¯åããããªãã®ã§ãåãããŒãã¯ãŒãã«ãªãããEBSã®ã¢ã¿ãããæãã¶ã埩垰ã¯ããã£ãŠé
ããªããŸããã©ã¡ãã®å€±æã§ãåä»éç¥ãè¿ããªããããå©çšè
ã¯æ°ä»ããŠåå®è¡ã§ããŸãããããªã埩垰ãéãæ§æãéžã¶ããšãã倿ã§ãã PodDisruptionBudgetã¯ã¯ã©ã¹ã¿ããªã·ãŒãååšãèŠæ±ãããã眮ããŠããŸããã minAvailable: 0 ã§evictionã劚ããªãå€ã«ããŠããŸããåäžã¬ããªã«ã§æ¢ãŸãããšãåãå
¥ããæ¹éããPDBã®å€ã§ãäžè²«ãããŠããŸãã ãªããããã¯ããã³ãåäœã®å€æã§ããEventBusãå«ãArgo Eventsã®ãªãœãŒã¹äžåŒã¯ããã³ãããšã«ç¬ç«ããŠãããããé«ãå¯çšæ§ãå¿
èŠãªããŒã ã¯ãèªåã®ããã³ãã ãã¬ããªã«æ°ãæ°žç¶åãåŒãäžããããŸãã ç£èŠã®çµã¿èŸŒã¿ EventBusãEventSourceãSensorã¯ããããPrometheus圢åŒã®ã¡ããªã¯ã¹ãå
¬éããŠããŸãããã®ã¡ããªã¯ã¹ãDatadogã®Autodiscoveryã¢ãããŒã·ã§ã³ã§ã¹ã¯ã¬ã€ãããŠãNATSãšArgo Eventsã®ç¶æ
ãæ¢åã®ç£èŠåºç€ã«èŒããŠããŸããã€ãã³ãã®æ»çãé
é倱æããä»ã®ãµãŒãã¹ãšåãããã·ã¥ããŒããšã¢ã©ãŒãã®äœç³»ã§æ±ããŸãã Sensorã¯ã«ãŒãã£ã³ã°ã ããå®è¡æš©éã¯executeã ã Sensorã®ãã£ã«ã¿ã¯ãã€ãã³ãçš®å¥ãšæ¿èªèŠåŠã«ããã«ãŒãã£ã³ã°ã ãã§ããæ¿èªãå¿
èŠãªã³ãã³ãã¯æ¿èªãªã¯ãšã¹ããæçš¿ããdispatch Jobãžãæ¿èªäžèŠãªã³ãã³ããšæ¿èªæžã¿ã®ã³ãŒã«ããã¯ã¯å®è¡ãæ
ãexecute Jobãžæ¯ãåããŸããèªå¯ã¯Gatekeeperã§å®çµæžã¿ãªã®ã§ãSensorã«èªå¯ã®ããžãã¯ã¯ãããŸããã å®è¡ïŒLambda invokeãšK8s Jobã®äœæïŒãexecute Jobã«äžæ¬åããŠããã®ã¯ãå®è¡æš©éã1ãæã«éçŽããããã§ããLambdaãåŒã¹ãIAMããŒã«ãšJobãäœããRBACã¯ãexecute Jobã®ServiceAccountã ãã«äžããŸããæ¿èªãªã¯ãšã¹ããæçš¿ããã ãã®dispatch Jobã¯ãå®è¡æš©éãäžåæã¡ãŸããããªããdispatchãšexecuteã¯2ã€ã®ãµãã³ãã³ããæã€1ã€ã®ãã€ããªã§ããã€ããŒãã®åãšSlackéç¥ã®å®è£
ãå
±æããŠããŸãã K8s Jobã«ããããŒã«å®è¡æ©æ§ PodTemplateã§ããŒã«ã®Jobå®çŸ©ãé
åžãã ããŒã«ãK8s JobãšããŠå®è¡ããã«ã¯ããã©ããªPodãèµ·åããããã®å®çŸ©ãå¿
èŠã§ãããã®å®çŸ©ã v1 PodTemplate ãªãœãŒã¹ãšããŠããã³ãã®namespaceã«é
åžããå®è¡æã«execute Jobã PodTemplate ãèªãã§Jobãçµã¿ç«ãŠãæ¹åŒã«ããŸããã æ€èšã®ãã€ã³ãã¯ããã®ãã³ãã¬ãŒããã©ãã«çœ®ããŠãããã§ããããã³ãã¬ãŒããGitOpsïŒFluxïŒã®ç®¡çã«ä¹ãããã®ã§ãKubernetesã®ãªããžã§ã¯ããšããŠã¯ã©ã¹ã¿äžã«çœ®ãããªãœãŒã¹ãåªå
åè£ã«ãªããŸããçŽ çŽã« kind: Job ã®ãããã§ã¹ããçœ®ãæ¡ãæåã«æµ®ãã³ãŸãããJobã¯äœæãããæç¹ã§1åå®è¡ããããªãœãŒã¹ãªã®ã§ãé
åžãšåæã«åããŠããŸãæç«ããŸããã suspend: true ã®CronJobãªãèµ·åããã«çœ®ããŠãããŸãããã ããsuspendã®è§£é€ãã¹ã§æå³ããåããŠããŸãå±ãããæ®ããŸããPodTemplateã¯åäœã§ã¯äœãå®è¡ããªãKubernetesãã€ãã£ãã®ãªãœãŒã¹ã§ãã¹ããŒãæ€èšŒãå¹ããŸãããå®è¡ãããªããã³ãã¬ãŒãããšããæå³ããéçšã«ãŒã«ã§ã¯ãªãæ§é ã§è¡šçŸã§ããŸãã Jobã¬ãã«ã®èšå®ã¯ãã³ãã¬ãŒãåŽã«æããããå®è¡æ©æ§åŽã§æ±ºããŠããŸãããªãã©ã€ã¯ãããïŒ backoffLimit: 0 ïŒãå®äºããJobã¯1æéã§èªååé€ããŸãïŒ ttlSecondsAfterFinished: 3600 ïŒãäŸå€ã¯å®è¡æéã®äžéïŒ activeDeadlineSeconds ïŒã§ãããã¯ããŒã«ããšã«å€ãããå€ã§ãããã ãPodTemplateãæãŠãã®ã¯Podã®specã ãã§ãJobã¬ãã«ã®ãã£ãŒã«ãã¯æžããŸãããããã§ããã®å€ã¯PodTemplateã®annotationã§å®£èšããŠããããå®è¡æ©æ§ãJobãçµã¿ç«ãŠãéã«èªã¿åã£ãŠåæ ãã圢ã«ããŸãããããã³ãã管çããã®ã¯Podã®äžèº«ã ããJobãšããŠã®æ¯ãèãã¯åºç€ãçµ±äžããããšãã責åã®ç·åŒãã§ãã ããã³ããé
åžããPodTemplateã®ãããã§ã¹ãã¯ã次ã®ãããªåœ¢ã§ãïŒæç²ïŒã apiVersion : v1 kind : PodTemplate metadata : name : zozo-cart-chatops-template-example-tool annotations : # Jobã¬ãã«ã®activeDeadlineSecondsïŒå®è¡æ©æ§ãJob specã«èšå®ããïŒ chatops.zozo.com/job-active-deadline-seconds : "900" template : metadata : labels : app : zozo-cart-chatops-tool spec : restartPolicy : Never containers : - name : example-tool image : example-tool:<tag> # ã€ã¡ãŒãžã®ãã«URIã¯overlayã®patchãäžãã command : - example-tool - chatops env : - name : TOOL_ENV value : "" # ç°å¢åãoverlayã®patchãäžãã # DBèªèšŒãªã©ã®ã·ãŒã¯ã¬ããã¯secretKeyRefã§æ³šå
¥ãã ãªãããããã§ã¹ãã«ã·ãŒã¯ã¬ããã®çã®å€ã¯çœ®ããŸãããå®äœã¯AWS Secrets Managerã«ããããããExternal SecretsãKubernetes SecretãžåæããPod㯠secretKeyRef ã§åç
§ããŸãã å®è¡æ©æ§ãPodTemplateããJobãçµã¿ç«ãŠãéšåã®å®è£
ã¯ã次ã®ãããªåœ¢ã§ãã // Jobã¬ãã«ã®æ©æ§ããªã·ãŒãããŒã«ã«ãããå
±éã®å€ã®ããåºå®ãã const ( jobBackoffLimit int32 = 0 // ãªãã©ã€ã¯å©çšè
ã®åå®è¡ã«ä»»ãã jobTTLSecondsAfterFinished int32 = 3600 // å®äºããJobã®æé€ ) // ããŒã«å¥ã«èª¿æŽããJobã¬ãã«ã®å®è¡æéäžéïŒãã³ãã¬ãŒãã®annotationã§å®£èšããïŒ const activeDeadlineAnnotation = "chatops.zozo.com/job-active-deadline-seconds" template, err := client.CoreV1().PodTemplates(namespace).Get(ctx, templateName, metav1.GetOptions{}) // ...ïŒannotationããå®è¡æéäžéãèªã¿åããPod specãæ€èšŒããïŒ job := &batchv1.Job{ ObjectMeta: metav1.ObjectMeta{ GenerateName: "chatops-" + tool + "-" , }, Spec: batchv1.JobSpec{ BackoffLimit: ptr.To(jobBackoffLimit), TTLSecondsAfterFinished: ptr.To(jobTTLSecondsAfterFinished), ActiveDeadlineSeconds: ptr.To(activeDeadline), // annotationç±æ¥ Template: corev1.PodTemplateSpec{ ObjectMeta: podMeta, Spec: *template.Template.Spec.DeepCopy(), }, }, } ãã«ãããã³ãèšèšãšããŒã«è¿œå ã®äœéš å
±éã®å
¥å£ãšãããã³ãããšã®å®è¡ã¹ã¿ã㯠ãã®ä»çµã¿ã¯ãã«ãŒã決æžSREãããã¯å°çšã§ã¯ãªãã瀟å
ã®è€æ°ããŒã ã§äœ¿ããå
±éåºç€ãšããŠèšèšããŠããŸããSlack AppãAPI GatewayãGatekeeperã¯å
šããã³ãå
±éã§ããäžæ¹ãEKSåŽã®EventSourceãEventBusãSensorãJobã®äžåŒã¯ãããã³ãã®namespaceããšã«ç¬ç«ããŠããŸããGatekeeperãchannel-mapã§è§£æ±ºããããã³ãã«å¿ããŠè»¢éå
ãåãæ¿ãããããããããã³ãã®ã€ãã³ããä»ã®ããã³ãã®å®è¡ã¹ã¿ãã¯ã«æµããããšã¯ãããŸããã ããŒã«ã«æž¡ãæšæºãã€ããŒã å®è¡æ©æ§ããããŒã«ãžã¯ã次ã®åœ¢ã®æšæºãã€ããŒããæž¡ããŸãã { " kind ": " chatops-tool ", " tool ": " example-tool ", " command ": " update ", " args ": [ " ... " ] , " requester ": " U12345678 ", " channel ": " C12345678 ", " team ": " zozo-cart ", " ts ": " 1756... " } åŒæ°ïŒ args ïŒã®è§£éã¯ããŒã«èªèº«ãè¡ããŸããåºç€åŽãããŒã«ããšã®åŒæ°ä»æ§ãç¥ãæ§é ã«ãããšãããŒã«ã远å ãããã³ã«åºç€ãžå€æŽãæ³¢åããããã§ããããŒã«ã¯ãã®ãã€ããŒããåãåãã圢ã«ãããªã£ãŠããã°ãK8s Jobã§ãLambdaã§ãæ§ããŸããã LambdaããŒã«ã®å Žåã¯ãå®è¡æ©æ§ã®Jobããã®ãã€ããŒããæž¡ããŠLambda颿°ãinvokeããŸããæ§åºç€ããç§»è¡ããLambdaããŒã«ã¯ã颿°ãIAMããŒã«ãVPCèšå®ããã®ãŸãŸç¶æããŠãæšæºãã€ããŒããåçããæ¹ä¿®ã ãã§ããªã¬ãŒçµè·¯ãå·®ãæ¿ããããŸãããå®è¡åœ¢æ
ã®èªç±ãšã¯ãæ°ããããŒã«ã®éžæè¢ãå¢ããããšã ãã§ãªããæ¢åã®Lambdaè³ç£ãäœãçŽããã«æžãããšã§ããããŸãã ããŒã«è¿œå ã¯SSMããªã·ãŒãšãããã§ã¹ãã ã æ°ããããŒã«ãChatOpsã«è¿œå ããæé ã¯æ¬¡ã®2ã€ã ãã§ãã SSMã« /chatops/policy/{ããã³ã}/{ããŒã«} ã®ããªã·ãŒã远å ããïŒã³ãã³ããèš±å¯ãæ¿èªãå®è¡åœ¢æ
ã®å®£èšïŒ K8s JobããŒã«ã®å Žå㯠PodTemplate ã®ãããã§ã¹ãã远å ãããLambdaããŒã«ã®å Žåã¯æšæºãã€ããŒããåçããããã«ãã Slack AppãAPI GatewayãGatekeeperã®ã³ãŒãããªãœãŒã¹ã«ã¯äžåæãå
¥ããŸãããåŸæ¥ã¯ããŒã«ããšã«Lambdaã®æ°èšãå¿
é ã§ããããä»ã¯ã³ã³ããã€ã¡ãŒãžãšããŠåãããŒã«ãªãPodTemplateãæžãã ãã§ChatOpsã«èŒããŸãã å°å
¥ã®å¹æ ç§»è¡ã«ãã£ãŠãåé ã®èª²é¡ã¯æ¬¡ã®ããã«è§£æ¶ãããŸããã ã³ãã³ãããŠãŒã¶ãŒããã£ãã«ã®åäœã®èªå¯ãšãå±éºæäœãžã®æ¿èªãããŒãåºç€ã®æ©èœãšããŠåããŠãã èš±å¯ãå«ããã¹ãŠã®å®è¡å€æãæ§é åãã°ãšããŠæ®ããç£æ»ãšã€ã³ã·ãã³ã調æ»ã§äœ¿ããç¶æ
ã«ãªã£ã éãšã³ãžãã¢ã®å©çšè
ã¯ãåŸæ¥ãšåãWorkflowãã©ãŒã ã®UXã®ãŸãŸç§»è¡ã§ãã ããŒã«ã®å®è¡åœ¢æ
ãK8s JobãšLambdaã®2æã«ãªãã远å ã³ã¹ããäžãã£ã ãŸãšã æ¬èšäºã§ã¯ãAWS Chatbotã§éçšããŠããChatOpsåºç€ããArgo EventsãšGatekeeper Lambdaã軞ã«ããæ§æãžåæ§ç¯ããäºäŸã玹ä»ããŸãããå®è¡è
ãçŽæ¥ç¹å®ã§ããªãWorkflowçµç±ã®æçš¿ã«å¯ŸããŠã¯ãä¿¡é Œãã§ãŒã³ã§èªå¯ãæç«ãããŸããããã®ä¿¡é Œãã§ãŒã³ãšãå®è¡åºç€ã®æåã§ã®èªå¯ãæ¿èªãç£æ»ã®äžå
åãèšèšã®èŠç¹ã§ããSlackãå
¥å£ãšããéçšåºç€ã®æ§ç¯ããArgo Eventsã®æ¬çªéçšãæ€èšããŠããæ¹ã®åèã«ãªãã°å¹žãã§ããä»åŸã¯å®è¡ææš©éã®ãããªãæå°åãªã©ãåºç€ã®å
ç¢åãé²ããŠãããããšèããŠããŸãã ZOZOã§ã¯ãäžç·ã«ãµãŒãã¹ãäœãäžããŠãããæ¹ãåéäžã§ãããèå³ã®ããæ¹ã¯ã以äžã®ãªã³ã¯ãããã²ãå¿åãã ããã corp.zozo.com
ã¯ããã« ããã«ã¡ã¯ãECåºç€éçºæ¬éšSREéšã§ããã¯ãªãŒããåããŠããæå±±ã§ãã ZOZOã§ã¯ãé·å¹ŽéçšããŠããåºå¹¹ã·ã¹ãã ãæ°ããã¢ãŒããã¯ãã£ãžãªãã¬ã€ã¹ããåãçµã¿ãé²ããŠããŸããæ°ã·ã¹ãã ã§ã¯APIã«Javaãããã³ããšã³ãïŒBFFã«ReactïŒTypeScript / Node.jsïŒãæ¡çšããã€ã³ãã©ã¯Kubernetesäžã«æ§ç¯ããŠããŸãã 2025幎11æã«éå¬ããããã¡ã€ã³ãã£æ ªåŒäŒç€Ÿäž»å¬ã®ãã¢ãŒããã¯ãã£Conference 2025ãã§ã¯ãã巚倧ã¢ããªã¹ã®ãªãã¬ã€ã¹ââæ©èœæŽçãšãã€ããªããã¢ãŒããã¯ãã£ã§æãã åæ§ç¯æŠç¥ããšé¡ããŠçºè¡šããŸãããåºå¹¹ã·ã¹ãã ã®èª²é¡ãšãã¢ãŒããã¯ãã£ã®æ¹åæ§ã玹ä»ããå
容ã§ãã findy-tools.io ãã®äžã§ãåºå¹¹ããã³ããšã³ããªãã¬ã€ã¹ã«ã€ããŠãè§ŠããŠããŸããæ¢åã·ã¹ãã ãšæ°ã·ã¹ãã ãå
±åãããªãããKubernetesäžã§æ©èœããšã«ãã¹ã«ãŒãã£ã³ã°ããæ®µéçã«çœ®ãæããŠããæ§æ³ã§ãã ããããåœæãã®ã¢ãŒããã¯ãã£ã¯ãŸã ãäºå®ãã§ãããå®çŸããããã«ã¯ãæ¢åã·ã¹ãã ãé·å¹Žæ±ããŠããããå¶çŽãåãé€ãå¿
èŠããã£ãããã§ãã ããããWebãµãŒããŒããŠãŒã¶ãŒã»ãã·ã§ã³ãä¿æãããã¹ããŒããã«ããªæ§æã§ãã æ¬èšäºã§ã¯ãæ¢åã·ã¹ãã ã®IISãä¿æããŠããã»ãã·ã§ã³ãRedisãžãªãããŒãããWebãµãŒããŒãã¹ããŒãã¬ã¹åãããŸã§ã®åãçµã¿ã玹ä»ããŸããããã«ãã£ãŠåºå¹¹ã·ã¹ãã ã®æ®µéçãªããã³ããšã³ããªãã¬ã€ã¹ãé²ããããããã«ãªã£ãèæ¯ã«ãè§ŠããŸãã ç®æ¬¡ ã¯ããã« ç®æ¬¡ åºå¹¹ããã³ããšã³ããªãã¬ã€ã¹ã®æ§æ³ æ°ã¢ãŒããã¯ãã£ãçšæããã ãã§ã¯ç§»è¡ã§ããªã 段éçãªãã¬ã€ã¹ãé»ãã IISã»ãã·ã§ã³ èªèšŒã ãã§ã¯ãªãIISã»ãã·ã§ã³ãžã®äŸå èªèšŒãOIDCåããã ãã§ã¯è§£æ±ºã§ããªã ãªãã¬ã€ã¹ã®åã«ãç¶æ
ããåãé¢ã IISã»ãã·ã§ã³ãRedisãžãªãããŒããã Before / After ç¬èªãã¬ãŒã ã¯ãŒã¯ã倿Žããçç± ã»ãã·ã§ã³IDã®åŒãåã ã·ãªã¢ã©ã€ãºæ¹åŒãšäºææ§ æŽæ°ã¿ã€ãã³ã°ãšãšã©ãŒæã®ããŒã«ãã㯠ã»ãã·ã§ã³æé管çã®èšèš Redisé害æã®èãæ¹ Redis Clusterã®é害察çãšããŒèšèš æ®µéçãªåãæ¿ããšãã©ãŒã«ãã㯠ã¹ããŒãã¬ã¹åã«ãã£ãŠäœãå€ãã£ãã®ã ããããåºå¹¹ããã³ããšã³ãã®ãªãã¬ã€ã¹ãž ãŸãšã åºå¹¹ããã³ããšã³ããªãã¬ã€ã¹ã®æ§æ³ ãŸããZOZOã®åºå¹¹ã·ã¹ãã ãšãªãã¬ã€ã¹ã®èæ¯ã«ã€ããŠç°¡åã«ç޹ä»ããŸãã æ¢åã®åºå¹¹ã·ã¹ãã ã¯Classic ASPïŒVBScriptïŒ/ IISãäžå¿ã«æ§ç¯ãããé·å¹Žã«ããã£ãŠæ©èœè¿œå ãç¶ããŠããŸãããZOZOã¯èªç€Ÿã§å庫ãæã£ãŠãããåºå¹¹ã·ã¹ãã ã«ã¯äºæ¥éšãå©çšããæ¥åæ©èœã ãã§ãªããECãµã€ãã§åãæ±ãååã®ç©æµæ©èœãå«ãŸããŠããŸããéåžžã«å·šå€§ãªã·ã¹ãã ã§ãé·æéã®éçšã«ãã£ãŠã¢ããªã¹åãé²ã¿ãä¿å®æ§ã»æ¡åŒµæ§ã®äœäžãæè¡çè² åµã®èç©ã課é¡ãšãªã£ãŠããŸãã ããã§çŸåšãæ¢åã·ã¹ãã ãæ°ããã¢ãŒããã¯ãã£ãžãªãã¬ã€ã¹ããåãçµã¿ãé²ããŠããŸãã ãã ãã巚倧ãªåºå¹¹ã·ã¹ãã ãäžåºŠã«ãã¹ãŠçœ®ãæããããšã¯çŸå®çã§ã¯ãããŸããã ãã¡ã€ã³åé¢ã容æãªéšåã®ãã€ã¯ããµãŒãã¹åãããŒã¿ããŒã¹ã¢ã¯ã»ã¹éšåã®ãã€ã¯ããµãŒãã¹APIåã¯é²ãã§ããŸãããåºå¹¹ã·ã¹ãã ã®ã¡ã€ã³ã®ããã³ããšã³ãã®ãªãã¬ã€ã¹ã¯ãŸã ããããã§ãã æ¢åã·ã¹ãã ãšæ°ã·ã¹ãã ãäžå®ã®æéå
±åãããæ©èœåäœã§åŸã
ã«åãæ¿ããŠããæ¹éãèããŸããã å
·äœçã«ã¯ã次ã®ãããªæ§æãç®æããŠããŸãã Kubernetesåºç€äžã«Ingress + Istioã«ããã«ãŒãã£ã³ã°ã®ä»çµã¿ãæ§ç¯ããURLã®ãã¹ãªã©ã«å¿ããŠãªã¯ãšã¹ããæ¯ãåããŸããããã«ãããæ¢åã·ã¹ãã ã皌åããããŸãŸäžéšã®æ©èœãã眮ãæããŠãããããããã¹ãã©ã³ã°ã©ãŒãã¿ãŒã³ã«ããæ®µéçãªãªãã¬ã€ã¹ãç®æããŸããã ãã¢ãŒããã¯ãã£Conference 2025ãã§ãã®æ§æ³ã玹ä»ãã2025幎11ææç¹ã§ã¯ããŸã ãã¹ããŒãã¬ã¹ååŸã®ããã³ãã¢ãŒããã¯ãã£ïŒäºå®ïŒããšããäœçœ®ã¥ãã§ããã ã§ã¯ããªãããã«ãã®æ§æãžç§»è¡ã§ããªãã£ãã®ã§ããããã æ°ã¢ãŒããã¯ãã£ãçšæããã ãã§ã¯ç§»è¡ã§ããªã æ§æå³ã ããèŠããšãæ°ã·ã¹ãã ãKubernetesäžã«æ§ç¯ããIngressãªã©ã§ãã¹ã«ãŒãã£ã³ã°ããã°ãæ¢åã·ã¹ãã ããå°ããã€ç§»è¡ã§ããããã«æãããããããŸããã ããããå®éã®æ¢åã·ã¹ãã ã«ã¯å€§ããªå¶çŽããããŸããã WebãµãŒããŒèªèº«ãç¶æ
ãæã£ãŠãã ããšã§ãã æ¢åã·ã¹ãã ã§ã¯ãIISã®ã»ãã·ã§ã³ç®¡çããµãŒããŒäžã®äœæ¥çšããŒã¿ãã¡ã€ã«ãªã©ãåäœã«å¿
èŠãªç¶æ
ãWebãµãŒããŒå
éšã«ä¿æããŠããŸããããã®ãããªæ§æã§ã¯ããªã¯ãšã¹ããåŠçãããµãŒããŒãèªç±ã«åãæ¿ããããŸããã äŸãã°ããããŠãŒã¶ãŒããã®æåã®ãªã¯ãšã¹ããWebãµãŒããŒAãåŠçãããã®ãµãŒããŒã®ã¡ã¢ãªäžã«ã»ãã·ã§ã³ãäœæãããšããŸããæ¬¡ã®ãªã¯ãšã¹ããWebãµãŒããŒBãžéããããšãWebãµãŒããŒBã«ã¯ãã®ã»ãã·ã§ã³ãååšããŸããã ããã¯åçŽãªã¹ã±ãŒã«ã¢ãŠãã ãã§ãªããKubernetesãžã®ç§»è¡ã§ãåé¡ã«ãªããŸããKubernetesã§ã¯Podãäœæã»åé€ãããããšãåæãšããŠãããç¹å®ã®WebãµãŒããŒãPodã®ããŒã«ã«ãªç¶æ
ã«äŸåããªããã¹ããŒãã¬ã¹ãªã¢ããªã±ãŒã·ã§ã³ãæ±ããããæ§æãšãªããŸãã ãããŠä»åããã1ã€å€§ããªåé¡ãšãªã£ãã®ã 段éçãªãã¬ã€ã¹ ã§ããã æ®µéçãªãã¬ã€ã¹ãé»ãã IISã»ãã·ã§ã³ ä»åç®æããŠããã®ã¯ãæ¢åã·ã¹ãã ãããã¿ã€ãã³ã°ã§ãã¹ãŠåæ¢ããæ°ã·ã¹ãã ãžäžæã«åãæ¿ãããªãã¬ã€ã¹ã§ã¯ãããŸãããæ¢åã·ã¹ãã ãšæ°ã·ã¹ãã ãå
±åãããªãããããŒãžãæ©èœåäœã§å°ããã€ç§»è¡ããŠãããã¹ãã©ã³ã°ã©ãŒãã¿ãŒã³ã«ããæ®µéçãªãªãã¬ã€ã¹ã§ãã ãã®æ§æãå®çŸããããã§ã倧ããªå£ãšãªã£ãã®ããæ¢åã·ã¹ãã ã®IISã»ãã·ã§ã³ãžã®äŸåã§ããã èªèšŒã ãã§ã¯ãªãIISã»ãã·ã§ã³ãžã®äŸå æ¢åã®åºå¹¹ã·ã¹ãã ã§ã¯ãIISã®ã€ã³ã¡ã¢ãªã»ãã·ã§ã³ãããŸããŸãªçšéã§å©çšããŠããŸãã代衚çãªãã®ããŠãŒã¶ãŒã®èªèšŒæ
å ±ã§ãããã»ãã·ã§ã³ã®çšéã¯èªèšŒã ãã§ã¯ãããŸããã åºå¹¹ã·ã¹ãã ã«ã¯ãè€æ°ã®ç»é¢ãé·ç§»ããªãã1ã€ã®æ¥åãå®äºããæ©èœãæ°å€ãååšããŸãããã®éçšã§å
¥åã»éžæããæ
å ±ãªã©ãç»é¢ããŸããã§åŒãç¶ãå¿
èŠãããäžæçãªããŒã¿ã®ä¿æã«ãã»ãã·ã§ã³ãå©çšããŠããŸãã ãã®ãããæ¢åã·ã¹ãã ã®ç»é¢é·ç§»ã¯ãåãIISã»ãã·ã§ã³ãç¶ç¶ããŠåç
§ã§ããããšãåæãšããŠããŸããã ããã§ãããŒãžåäœã®æ®µéçãªãªãã¬ã€ã¹ãèããŠã¿ãŸãã æ¢åç»é¢ïŒClassic ASP / IISïŒ â æ°ç»é¢ïŒæ°ã·ã¹ãã ïŒ â æ¢åç»é¢ïŒClassic ASP / IISïŒ IngressãIstioãå©çšããã°ãURLã®ãã¹ã«å¿ããŠãªã¯ãšã¹ããæ¯ãåããããšèªäœã¯å¯èœã§ããããããã«ãŒãã£ã³ã°ã ããåãæ¿ããŠããç»é¢éã§å©çšããŠããã»ãã·ã§ã³æ
å ±ãŸã§åŒãç¶ããããã§ã¯ãããŸããã äŸãã°ãæ¢åç»é¢ã§ä¿æããèªèšŒæ
å ±ãäžæããŒã¿ãåŸç¶ã®ç»é¢ã§å¿
èŠãšããå ŽåãèããŸããé·ç§»å
ãKubernetesäžã®æ°ã·ã¹ãã ã«ãªããšãIISã®ã¡ã¢ãªäžã«ä¿æããŠããã»ãã·ã§ã³ããã®ãŸãŸåç
§ã§ããŸããã ã€ãŸãããã°ã€ã³ç¶æ
ã®ç¶æã ããåé¡ã§ã¯ãããŸãããæ¢åã·ã¹ãã ã«ããã ç»é¢éã®ç¶æ
ã®åŒãç¶ããã®ãã®ããIISã®ã€ã³ã¡ã¢ãªã»ãã·ã§ã³ã«äŸåããŠãã ããšããæ®µéçãªãã¬ã€ã¹ã®éå£ã§ããã èªèšŒãOIDCåããã ãã§ã¯è§£æ±ºã§ããªã ãã®åé¡ã«å¯ŸããŠãèªèšŒæ¹åŒãã®ãã®ã倿Žããã¢ãããŒããèããããŸããäŸãã°èªèšŒãOIDCïŒOpenID ConnectïŒåããID Tokenãå©çšããæ§æã«å€æŽãããšããŸããèªèšŒæ
å ±ãç¹å®ã®IISãµãŒããŒã®ã€ã³ã¡ã¢ãªã»ãã·ã§ã³ã«äŸåããããæ°æ§ã·ã¹ãã ã®åæ¹ã§ãŠãŒã¶ãŒãèå¥ã§ããããã«ãªããŸãã èªèšŒã ãã課é¡ã§ããã°ããã®æ¹æ³ã§è§£æ±ºã§ããå¯èœæ§ããããŸãããããä»åã®åºå¹¹ã·ã¹ãã ã§ã¯ãOIDCåã ãã§ã¯èŠä»¶ãæºãããŸãããæ¢åã·ã¹ãã ãIISã»ãã·ã§ã³ã«ä¿æããŠããã®ã¯èªèšŒæ
å ±ã ãã§ã¯ãªãããšããããŠæ ç¹å°çšã®ãµãŒããŒæ§æãè±åŽãALBã«ããããŒããã©ã³ã·ã³ã°ãå®çŸããããšãç®çãšããŠããããã§ãã ä»®ã«OIDCåã«ãã£ãŠã誰ããã°ã€ã³ããŠããã®ãããæ°æ§åæ¹ã§èå¥ã§ããããã«ãªã£ããšããŸããããã§ããç»é¢ã§å
¥åã»éžæããæ
å ±ãªã©ãç»é¢éã§åŒãç¶ãã§ããæ¥åäžã®äžæããŒã¿ãŸã§ID Tokenã§åŒãç¶ããããã§ã¯ãããŸããã äŸãã°ãæ¢åç»é¢ã§ã»ãã·ã§ã³ã«ä¿åããæ
å ±ããæ¬¡ã®æ°ã·ã¹ãã ã®ç»é¢ã§å¿
èŠãšããã±ãŒã¹ãèããŸãã æ¢åç»é¢ â â èªèšŒæ
å ± â ïŒ â ç»é¢éã§åŒãç¶ãæ¥åããŒã¿ â IIS Session â Ã â æ°ç»é¢ïŒæ°ã·ã¹ãã ïŒ èªèšŒæ¹åŒã ããåãæ¿ããŠãããã®ãÃãã¯æ®ããŸãã ã€ãŸããä»å解決ããå¿
èŠããã£ãã®ã¯ãèªèšŒãã¹ããŒãã¬ã¹ã«ããããšã ãã§ã¯ãããŸããã§ãããå¿
èŠã ã£ãã®ã¯ãèªèšŒæ
å ±ãç»é¢éã§åŒãç¶ãäžæããŒã¿ãå«ãã æ¢åWebã¢ããªã±ãŒã·ã§ã³ãIISã«ä¿æããŠããç¶æ
ãã®ãã®ããç¹å®ã®WebãµãŒããŒããåãé¢ãããš ã§ããã ãªãã¬ã€ã¹ã®åã«ãç¶æ
ããåãé¢ã ãã®ãŸãŸã§ã¯ãKubernetesäžã«æ°ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠããããŒãžåäœã®æ®µéçãªçœ®ãæãã¯å®çŸã§ããŸããã èšãæãããšãã»ãã·ã§ã³ã®ä¿åå Žæãšããæ¢åã·ã¹ãã ã®å®è£
äžã®å¶çŽãããªãã¬ã€ã¹ã§ããåäœãŸã§å¶çŽããŠããŸããã ããã§ãæ°ã·ã¹ãã ãžã®ç§»è¡ãæ¬æ Œåããåã«ããŸãç¹å®ã®IISãµãŒããŒã«éããŠããã»ãã·ã§ã³ãå€éšãžåãé¢ãããšã«ããŸãããèªèšŒæ
å ±ã ãã§ãªããç»é¢ããŸããã§å©çšãããç¶æ
ãWebãµãŒããŒã®å€éšã§ç®¡çããŸããããã«ãããæ¢åã·ã¹ãã ãšæ°ã·ã¹ãã ãå
±åããªãããããŒãžã»æ©èœåäœã§æ®µéçã«ç§»è¡ã§ããç¶æ
ãäœããŸãã ãã®ããã«æ¡çšããã®ããIISã®ã€ã³ã¡ã¢ãªã»ãã·ã§ã³ãRedisãžãªãããŒããã ãã»ãã·ã§ã³ãªãããŒãã ãšããææ³ã§ãã æ¬¡ç« ã§ã¯ããã®ã»ãã·ã§ã³ãªãããŒããã©ã®ãããªæ§æã§å®çŸããã®ãã玹ä»ããŸãã IISã»ãã·ã§ã³ãRedisãžãªãããŒããã ç®æããã®ã¯ãWebãµãŒããŒèªèº«ããŠãŒã¶ãŒã»ãã·ã§ã³ãä¿æããªãæ§æã§ããããã§ããããŸã§IISã®ã€ã³ã¡ã¢ãªã«ä¿æããŠããã»ãã·ã§ã³ããå€éšã®RedisãžãªãããŒãããããšã«ããŸããã Before / After ãã€ã³ãã¯ãåçŽã«Redisã远å ããããšã§ã¯ãããŸãããæ¢åã¢ããªã±ãŒã·ã§ã³ããèŠãã»ãã·ã§ã³ã®æ±ãã倧ããå€ããã«ãã»ãã·ã§ã³ã®ä¿åå
ã ããWebãµãŒããŒã®ã¡ã¢ãªããå€éšãžç§»ãå¿
èŠããããŸãã ZOZOã®æ¢ååºå¹¹ã·ã¹ãã ã§ã¯ç¬èªãã¬ãŒã ã¯ãŒã¯ãå©çšããŠããŸããä»åããã®ç¬èªãã¬ãŒã ã¯ãŒã¯ãããŒãžã§ã³ã¢ããããŠãã»ãã·ã§ã³ã®èªã¿æžããRedisãžãªãããŒãã§ããä»çµã¿ãå°å
¥ããŸãããããã«ãã£ãŠãWebãµãŒããŒèªèº«ã¯ãŠãŒã¶ãŒåºæã®ã»ãã·ã§ã³ãä¿æãããå¿
èŠãªã»ãã·ã§ã³æ
å ±ãå€éšããååŸããæ§æãžå€æŽããŸãã ãµãŒããŒå
éšã«ä¿æããŠããããŒã¿ãã¡ã€ã«ããèªã¿æžãå
ããã¡ã€ã«ãµãŒããŒãžç§»è¡ããŸããã WebãµãŒããŒãšã»ãã·ã§ã³ã®ã©ã€ããµã€ã¯ã«ãåé¢ããããšãããã®åãçµã¿ã®éèŠãªãã€ã³ãã§ãã ç¬èªãã¬ãŒã ã¯ãŒã¯ã倿Žããçç± æ¢åã®åºå¹¹ã·ã¹ãã ã§ã¯ãClassic ASPã®åããŒãžããçŽæ¥IISã®Sessionãªããžã§ã¯ããæäœããã®ã§ã¯ãªããç¬èªãã¬ãŒã ã¯ãŒã¯ãéããŠã»ãã·ã§ã³ãèªã¿æžãããŠããŸãããã®ãã¬ãŒã ã¯ãŒã¯ããã»ãã·ã§ã³ãžã®ã¢ã¯ã»ã¹ãäžå
çã«ç®¡çãã圹å²ãæ
ã£ãŠããŸãã ãã®æ§æã§ãã£ãããšããä»åã®ã»ãã·ã§ã³ãªãããŒããå®çŸããããã§å€§ããªå©ããšãªããŸããã ã¢ããªã±ãŒã·ã§ã³ã1ã€ãã€æ¹ä¿®ããŠä¿åå
ã倿Žããã¢ãããŒãã§ã¯ãèšå€§ãªç»é¢æ°ãæã€åºå¹¹ã·ã¹ãã ã«ãããŠçŸå®çãªå·¥æ°ã§å¯Ÿå¿ããããŸãããããããã»ãã·ã§ã³ãžã®ã¢ã¯ã»ã¹ããã¬ãŒã ã¯ãŒã¯å±€ã«éçŽãããŠããããããã®ã¬ã€ã€ãŒã§Redisãžã®èªã¿æžããåžåããã°ãåã
ã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã倿Žããã«ã»ãã·ã§ã³ã®ä¿åå
ãåãæ¿ããããŸãã ã€ãŸãããã¬ãŒã ã¯ãŒã¯åŽã倿Žããããšã§ã æ¢åã¢ããªã±ãŒã·ã§ã³ãžã®å€æŽãæå°éã«æããªãããã»ãã·ã§ã³ç®¡çã ããå·®ãæ¿ãã ããšãå¯èœã«ãªããŸããã ã»ãã·ã§ã³IDã®åŒãåã æ°æ§ã·ã¹ãã éã§ã»ãã·ã§ã³ãå
±æããããã«ã¯ãåäžãŠãŒã¶ãŒã®ãªã¯ãšã¹ãã«å¯ŸããŠåãã»ãã·ã§ã³IDã§Redisã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã ã»ãã·ã§ã³IDã¯CookieãéããŠã¯ã©ã€ã¢ã³ãã«ä¿æãããŸãããªã¯ãšã¹ãããšã«CookieããååŸããã»ãã·ã§ã³IDãããŒãšããŠRedisããã»ãã·ã§ã³æ
å ±ãååŸããŸãããã®ä»çµã¿ã«ãããæ¯ãåãå
ãIISäžã®æ¢åã·ã¹ãã ã§ãKubernetesäžã®æ°ã·ã¹ãã ã§ããåãã»ãã·ã§ã³ãåç
§ã§ããŸãã ã·ãªã¢ã©ã€ãºæ¹åŒãšäºææ§ IISã®ã€ã³ã¡ã¢ãªã»ãã·ã§ã³ã§ã¯ãVBScriptåºæã®ãªããžã§ã¯ã圢åŒã§ããŒã¿ãä¿æãããŠããŸããRedisãžãªãããŒãããã«ããã£ãŠã¯ããã®ããŒã¿ãã·ãªã¢ã©ã€ãºå¯èœãªåœ¢åŒã«å€æããå¿
èŠããããŸãã ãã¬ãŒã ã¯ãŒã¯å±€ã§ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãºåŠçãå®è£
ããæ¢åã®ã»ãã·ã§ã³ããŒã¿ãšã®äºææ§ãç¶æããªããRedisãžã®æ°žç¶åãå®çŸããŸãããã·ãªã¢ã©ã€ãºãã©ãŒãããã«ã¯JSONãæ¡çšããVBScriptåºæã®åæ
å ±ãä¿æããã¹ããŒãèšèšãšããŠããŸããããã«ãããæ°ã·ã¹ãã åŽã§ãåããã©ãŒãããã§æ£ããããŒã¿ãèªã¿æžãã§ããŸãã æŽæ°ã¿ã€ãã³ã°ãšãšã©ãŒæã®ããŒã«ãã㯠ã»ãã·ã§ã³ããŒã¿ã®Redisãžã®æŽæ°ã¿ã€ãã³ã°ããéèŠãªèšèšãã€ã³ãã§ãã ä»åã¯ãã¹ã¯ãªããã®å®è¡éå§æã«ã»ãã·ã§ã³ããŒã¿ããŸãšããŠååŸããåŠçäžã¯ã€ã³ã¡ã¢ãªã§æ±ããå®è¡å®äºæã«ãŸãšããŠRedisãžæžãæ»ãæ¹åŒãæ¡çšããŸããããã®æ¹åŒã«ã¯ãã¹ã¯ãªããåŠçäžã®ã»ãã·ã§ã³ã¢ã¯ã»ã¹ãé«éåã§ããããšããããŠãšã©ãŒçºçæã®ããŒã«ããã¯ãå
Œããããããšãšãã2ã€ã®å©ç¹ããããŸãã åŠçã®éäžã§ãšã©ãŒãçºçããå ŽåãRedisãžã®æŽæ°ã¯å®è¡ãããŸãããã€ãŸããã»ãã·ã§ã³ãäžéåç«¯ã«æŽæ°ãããç¶æ
ãé²ãããšã§ãã»ãã·ã§ã³ããŒã¿ã®èªåããŒã«ããã¯ãå®çŸããŠããŸãã ä»®ã«ãã¹ã¯ãªããå®è¡äžã«éœåºŠRedisãæŽæ°ããæ¹åŒã«ãããšããšã©ãŒçºçæç¹ã§äžéšã ãæŽæ°ãåæ ãããç¶æ
ãšãªããããŒã«ããã¯ãé£ãããªããŸããæŽæ°ã¿ã€ãã³ã°ããŸãšããããšã§ããã®åé¡ãåé¿ããŠããŸãã ã»ãã·ã§ã³æé管çã®èšèš IISã®ã€ã³ã¡ã¢ãªã»ãã·ã§ã³ã«ã¯ãäžå®æéã¢ã¯ã»ã¹ããªããã°èªåçã«ç Žæ£ãããã¿ã€ã ã¢ãŠãã®ä»çµã¿ããããŸããæ¢åã·ã¹ãã ã§ã¯ãã»ãã·ã§ã³ç Žæ£æã«Session_OnEndã€ãã³ãã§æ¥ååŠçãå®è¡ããŠããŸãããRedisãžãªãããŒãããã«ãããããã®ã»ãã·ã§ã³çµäºæã®åŠçãã©ãåçŸãããã課é¡ãšãªããŸããã Redisã«ã¯Keyspace Notificationsãšããä»çµã¿ããããããŒã®æéåããæ€ç¥ããéã«expiredã€ãã³ããéç¥ã§ããŸãããã ãããã®ã€ãã³ãã¯TTLæºäºæå»ã¡ããã©ã§ã¯ãªããRedisãããŒã®æéåããæ€ç¥ã»åé€ããæç¹ã§çºè¡ããããããéç¥ã¿ã€ãã³ã°ãæå»ã®å³å¯ãã¯ä¿èšŒãããŸããããŸããKeyspace Notificationsã¯æ°žç¶ãã¥ãŒã§ã¯ãªãã賌èªè
ã忢ããŠããéã®ã€ãã³ããåŸããååŸããä»çµã¿ããããŸããããããã£ãŠãåãããŒãã蚱容ãããªãæ¥ååŠçã®ããªã¬ãŒã«ã¯é©ããªããšå€æããŸããã ããã§ãå¥éãæé管çã®ãµãã·ã¹ãã ã皌åãããæ¹åŒãæ¡çšããŠããŸãããã®ãµãã·ã¹ãã ãã»ãã·ã§ã³ã®æéåããèœåçã«æ€ç¥ããåŸæ¥Session_OnEndã§å®è¡ããŠããæ¥ååŠçã代æ¿ããããã§ã»ãã·ã§ã³ãåé€ããŸãã宿ã¹ãã£ã³ã«ãã£ãŠç¢ºå®ã«åŠçãå®è¡ã§ããã€ãã³ãã®åãããŒãããªãããå®å®æ§ã«åªããŸãã ãã®ä»çµã¿ã¯ãZOZOTOWNã§ã®ã»ãã·ã§ã³ãªãããŒãæã®ä»æ§ãèžè¥²ãããã®ã§ãã Redisé害æã®èãæ¹ ã»ãã·ã§ã³ã®ä¿åå
ãRedisã«äžæ¬åããããšã§ãRedisé害ãã·ã¹ãã å
šäœã«åœ±é¿ãããªã¹ã¯ãçãŸããŸãã ãã®ç¹ã«ã€ããŠã¯ãAmazon ElastiCache for Redisã®ã¯ã©ã¹ã¿ã¢ãŒããæ¡çšãã3AZã«ãŸãããã¬ããªã±ãŒã·ã§ã³ã°ã«ãŒãã«ããèªåãã§ãŒã«ãªãŒããŒæ§æãšããŠããŸããããã«ã1ã·ã£ãŒãã®é害圱é¿ã屿åããããã«è€æ°ã·ã£ãŒãæ§æãæ¡çšããŸãããç¹å®ã®ã·ã£ãŒãã«é害ãçºçããŠãã圱é¿ãåããã®ã¯ãã®ã·ã£ãŒãã«å²ãåœãŠãããã»ãã·ã§ã³ã®ã¿ã§ããããšãã°ã1ã·ã£ãŒãæ§æã§ã¯1ããŒãé害ã®åœ±é¿ã100%ã«åã³ãŸããã5ã·ã£ãŒãæ§æã§ããã°ããã·ã¥ã¹ããããåçã«åæ£ããŠãããšä»®å®ããŠ1ããŒãé害ã®åœ±é¿ã¯20%ã«ãšã©ãŸããŸããå®éã«ã¯ããã·ã¥ã¹ããã忣ã®åãã«ãã£ãŠäžäžããããã¯ã©ã³ãã³ã°ã³ã¹ããšå¯çšæ§ã®ãã©ã³ã¹ã«ãªããŸãããã®ããã§ãSLOã§å®çŸ©ããå¯çšæ§ã詊éšã§èšæž¬ããMTTRãªã©ãèæ
®ããŠãæçµçãªã·ã£ãŒãæ°ã決å®ããŸããã Redis Clusterã®é害察çãšããŒèšèš Redis Clusterã§ã¯ãããŒã®ããã·ã¥å€ã«åºã¥ããŠããŒã¿ãåã·ã£ãŒãã«åæ£ãããŸãããããã1ã€ã®ã»ãã·ã§ã³ã«é¢é£ããè€æ°ã®ããŒãç°ãªãã·ã£ãŒãã«æ£ããšã以äžã®åé¡ãçããŸãã è€æ°ã·ã£ãŒãããŸããã èªã¿æžãã«ããã¬ã€ãã³ã·ãŒæªåã multi-key commandã¯åäžhash slotå
ã®ããŒã«å¶éããããããå¥slotã®ããŒã«ã¯CROSSSLOTãšã©ãŒãçºçããã single-slot operationã®æ¹ãããã©ãŒãã³ã¹ã«åªããã ã·ã£ãŒãé害æã«ãåäžã»ãã·ã§ã³ã®ããŒã®äžéšã ããååŸã§ãããããŒã¿äžæŽåãåŒãèµ·ããã Redis Clusterã«ã¯ãããã·ã¥ã¿ã°ããšããä»çµã¿ããããŸããããŒã« {...} ãã¿ãŒã³ãå«ãããšãæ³¢æ¬åŒ§å
ã®æååã®ã¿ãããšã«ããã·ã¥ã¹ããããèšç®ãããŸããããã«ãããåãããã·ã¥ã¿ã°ãæã€ããŒã¯å¿
ãåäžã·ã£ãŒãã«é
眮ãããŸãã ä»åã®ã»ãã·ã§ã³ç®¡çã§ã¯ã1ãŠãŒã¶ãŒã®è€æ°ã®ããŒã«ã»ãã·ã§ã³IDãããã·ã¥ã¿ã°ãšããŠåã蟌ãèšèšãæ¡çšããŸããã æ©èœã«ãã£ãŠHashã»Stringã»Listã»Setãªã©é©ããRedisã®ããŒã¿åãç°ãªããããã»ãã·ã§ã³ã1ã€ã®ããŒã«ãŸãšããããŠãŒã¶ãŒã®èªèšŒæ
å ±ãšã¯å¥ã«æ©èœãç»é¢ã®åäœã§ããŒãåããŠããŸãããããã®ããŒãå¥ã·ã£ãŒãã«æ£ããªããããã»ãã·ã§ã³IDãããã·ã¥ã¿ã°ãšããŠå
±éã§åã蟌ãã§ããŸãã äŸïŒ data:{session-id}:<FEATURE_KEY_1> # Hash data:{session-id}:<FEATURE_KEY_2> # String data:{session-id}:<FEATURE_KEY_3> # List data:{session-id}:<FEATURE_KEY_4> # Set ãã®ããŒèšèšã«ãããåäžãŠãŒã¶ãŒã®ã»ãã·ã§ã³ã«å±ãããã¹ãŠã®ããŒã¿ãåãã·ã£ãŒãã«æ ŒçŽãããŸããããã«ãããåè¿°ã®åé¡ãåé¿ãã€ã€ãRedis Clusterã«ããã·ã£ãŒãã£ã³ã°ã®æ©æµãåããããæ§æãšããŸããã åèïŒ Redis Cluster Specification - Hash tags 段éçãªåãæ¿ããšãã©ãŒã«ãã㯠ã»ãã·ã§ã³ãªãããŒãã®é©çšã¯ãå
šæ ç¹ãäžæã«åãæ¿ããã®ã§ã¯ãªããæ®µéçã«é²ããŠããŸãã ãŸããã»ãã·ã§ã³ãªãããŒãã«å¯Ÿå¿ããç°å¢ãæ§ç¯ããå
šå庫æ ç¹ã§ã®åäœç¢ºèªãäºåã«å®æœããŸããããã®åŸã圱é¿åºŠãå°ããæ ç¹ããé ã«ã¢ã¯ã»ã¹å
ãã»ãã·ã§ã³ãªãããŒãç°å¢ãžåãæ¿ãããã³ã°ã©ã³ã§å®å®çšŒåã確èªããªãã察象æ ç¹ãåºããŠããæ¹åŒãæ¡çšããŠããŸãã åé¡ãçºçããå Žåã¯ã圱é¿ã®ãããŠãŒã¶ãŒåäœã§æ§ãã¡ã€ã³ãžåãæ»ããã©ãŒã«ããã¯ãçšæããŠããŸããæ ç¹å
šäœãå·»ãæ»ãå¿
èŠããªãã圱é¿ç¯å²ãéå®ãã埩æ§ãå¯èœã§ãã 2026幎9æçŸåšããã®æ®µéçãªåãæ¿ããé²è¡äžã§ãã ã¹ããŒãã¬ã¹åã«ãã£ãŠäœãå€ãã£ãã®ã ã»ãã·ã§ã³ãªãããŒãã§åŸãããäžçªå€§ããªå€åã¯ããRedisã䜿ããããã«ãªã£ãããšãã§ã¯ãããŸããã WebãµãŒããŒãšãŠãŒã¶ãŒã»ãã·ã§ã³ã®çŽä»ããåãé¢ããããš ã§ãã ãããŸã§WebãµãŒããŒã®äžã«ãã£ãç¶æ
ãå€éšãžç§»ããŸããããã®çµæããªã¯ãšã¹ããã©ã®WebãµãŒããŒãåŠçããããšããŠãŒã¶ãŒãã©ã®ã»ãã·ã§ã³ãå©çšããããåé¢ããŠèããããããã«ãªããŸããã ããã«ãã£ãŠãã¢ãŒããã¯ãã£äžã®éžæè¢ã倧ããåºãããŸãã ç¹å®ã®WebãµãŒããŒã«ãŠãŒã¶ãŒãåºå®ããåæããªããªãã ALBã«ãããªã¯ãšã¹ãã®åçãªè² è·åæ£ãå¯èœã«ãªãã WebãµãŒããŒã®å¢æžãå
¥ãæ¿ããšããŠãŒã¶ãŒã»ãã·ã§ã³ã®ã©ã€ããµã€ã¯ã«ãåé¢ã§ããã Podãå
¥ãæ¿ããããšãåæãšããKubernetesãžã®ç§»è¡ã«ã察å¿ãããããªãã åŸæ¥ã®ã¹ããŒããã«ãªæ§æã§ã¯ãæ ç¹ããšã«æ¥ç¶å
ã®WebãµãŒããŒãåºå®ãããŠããŸããããã¢ãŒããã¯ãã£Conference 2025ãã§ããã®ç¹ã課é¡ãšããŠç޹ä»ããŠããŸããã»ãã·ã§ã³ããµãŒããŒã«çŽä»ããŠããããããªã¯ãšã¹ããå¥ã®ãµãŒããŒãžæ¯ãåããããè² è·ãåããããæ§é ã§ãããã¹ããŒãã¬ã¹åã«ãã£ãŠãã®å¶çŽããªããªããALBã§åçã«ãªã¯ãšã¹ãã忣ã§ããããã«ãªããŸããã ããããä»åã®åºå¹¹ãªãã¬ã€ã¹ã«ãããŠæãéèŠãªã®ã¯ããã®å
ã§ããæ¢åã·ã¹ãã ãšæ°ã·ã¹ãã ããŸããã ãæ®µéçãªããã³ããšã³ããªãã¬ã€ã¹ãé²ããããã®åææ¡ä»¶ãæŽããŸããã ãããŸã§ã WebãµãŒããŒ ïŒ ã¢ããªã±ãŒã·ã§ã³ ïŒ ãŠãŒã¶ãŒã®ç¶æ
ã ã£ããã®ãã WebãµãŒããŒ ïŒ ã¢ããªã±ãŒã·ã§ã³ Redis ïŒ ãŠãŒã¶ãŒã®ç¶æ
ãžåé¢ããããšã§ãããã³ããšã³ãã®ã«ãŒãã£ã³ã°ãšã»ãã·ã§ã³ç®¡çãç¬ç«ããŠèããããããã«ãªããŸãã ããã¯åãªãã€ã³ãã©å€æŽã§ã¯ãªããåºå¹¹ã·ã¹ãã ãã©ã®åäœã§ãã©ã®é çªã§ãªãã¬ã€ã¹ã§ããããå€ããããã® ã¢ãŒããã¯ãã£å€æŽ ã§ãã ããããåºå¹¹ããã³ããšã³ãã®ãªãã¬ã€ã¹ãž ããã§ã2025幎11æã®ãã¢ãŒããã¯ãã£Conference 2025ãã§ç޹ä»ããæ§æã«æ»ããŸãã åœæçŽ¹ä»ããã®ã¯ãKubernetesåºç€äžã«Ingress + Istioãé
眮ããã¹ãã©ã³ã°ã©ãŒãã¿ãŒã³ã«ãã£ãŠæ¢åã·ã¹ãã ãšæ°ã·ã¹ãã ãå
±åãããæ§æã§ããããããŠãæ©èœããšã®ãã¹ã«ãŒãã£ã³ã°ã«ãã£ãŠãæ¢åã®Classic ASPããæ°ããã¢ããªã±ãŒã·ã§ã³ãžæ®µéçã«åãæ¿ããŠããããšãäºå®ããŠããŸããã åœæã¯ãŸã ãäºå®ãã ã£ããã®ã¢ãŒããã¯ãã£ã«å¯ŸããŠãä»åã®ã»ãã·ã§ã³ãªãããŒãã«ãã£ãŠããã®åæãšãªãã¹ããŒãã¬ã¹åãé²ããããšãã§ããŸããã 巚倧ãªåºå¹¹ã·ã¹ãã ã®ãªãã¬ã€ã¹ã§ã¯ãæ°ããã·ã¹ãã ãäœãããšã ãã課é¡ã«ãªãããã§ã¯ãããŸãããæ¢åã·ã¹ãã ãé·å¹Žã®éçšã®äžã§æã€ããã«ãªã£ãåæãå¶çŽã1ã€ãã€è§£ãã»ãããæ°æ§ã·ã¹ãã ãå
±åã§ããç¶æ
ãäœãããšããæ®µéçãªãªãã¬ã€ã¹ã«ã¯å¿
èŠã§ãã ä»ååãçµãã ã»ãã·ã§ã³ãªãããŒãã¯ããã®ããã®1ã€ã®ã¹ãããã§ãããWebãµãŒããŒããç¶æ
ãåãé¢ããããšã§ãæ¢åã·ã¹ãã ã皌åããããŸãŸãæ°ã¢ãŒããã¯ãã£ãžããŒãžã»æ©èœåäœã§ç§»è¡ããŠããããã®åå°ãæŽããŸããã ãŸãšã æ¬èšäºã§ã¯ãZOZOã®åºå¹¹ã·ã¹ãã ã«ãããWebãµãŒããŒã®ã¹ããŒãã¬ã¹åã«ã€ããŠç޹ä»ããŸããã 2025幎11æã®ãã¢ãŒããã¯ãã£Conference 2025ãã§ã¯ãåºå¹¹ã·ã¹ãã ã®ãªãã¬ã€ã¹ãé²ããããã§ãã¹ããŒããã«ãã§ããããšã課é¡ãšããŠæããŸãããããããŠãIISã»ãã·ã§ã³ãRedisãžãªãããŒãããæ¹éãšãKubernetesäžã§ã®æ®µéçãªããã³ããšã³ããªãã¬ã€ã¹æ§æ³ã玹ä»ããŸããã ãã®æ§æ³ãå®çŸãããããæ¢åã·ã¹ãã ã§å©çšããŠããç¬èªãã¬ãŒã ã¯ãŒã¯ãããŒãžã§ã³ã¢ããããIISã®ã€ã³ã¡ã¢ãªã«ä¿æããŠãããŠãŒã¶ãŒã»ãã·ã§ã³ãRedisãžãªãããŒãããŸããã ä»åã®åãçµã¿ã§éèŠã ã£ãã®ã¯ãRediså°å
¥ãã®ãã®ã§ã¯ãããŸãããæ¢åã·ã¹ãã ãããç¶æ
ããšããå¶çŽãåãé¢ãããªãã¬ã€ã¹ã®èªç±åºŠãäžããããšã§ããã é·å¹ŽçšŒåããŠããåºå¹¹ã·ã¹ãã ããäžåºŠã«ãã¹ãŠå·æ°ã§ããŸãããã ãããããæ°ããã¢ãŒããã¯ãã£ãäœãã ãã§ã¯ãªããæ¢åã·ã¹ãã ãå°ããã€ã眮ãæããããç¶æ
ãã«å€ããŠããããšãéèŠã ãšèããŠããŸãã 2025幎ã«ãäºå®ããšããŠç޹ä»ããŠããåºå¹¹ããã³ããšã³ãã®æ°ããã¢ãŒããã¯ãã£ã¯ãä»åã®ã¹ããŒãã¬ã¹åã«ãã£ãŠå®çŸã«åããæºåãæŽããŸããããããããåºå¹¹ããã³ããšã³ãã®æ®µéçãªãªãã¬ã€ã¹ãé²ããŠãããŸãã ZOZOã§ã¯ãäžç·ã«ãµãŒãã¹ãäœãäžããŠããã仲éãåéäžã§ãããèå³ã®ããæ¹ã¯ã以äžã®ãªã³ã¯ãããã²ãå¿åãã ããã corp.zozo.com













