ãã¹ããŒã倿Žã¯å©çšã®å°ãªãæ·±å€ã«ããã§ã€ã«ãªãŒããŒè©Šéšã¯äŒæ¥ã«ããããŒã¿ããŒã¹ãæ¢ããªãããã®èª¿æŽã«ããšã³ãžãã¢ã®æéãå°ããã€åãããŠããããããªå Žé¢ã«çŽé¢ããããšã¯ãããŸãããã9/14(æ) 14:00 ãã麻åžå°ãã«ãºã§éå¬ãã ãAmazon Aurora DSQL Day Tokyoã ã§ã¯ãããããéçšèª¿æŽãããšã³ãžãã¢ãè§£æŸãã忣 SQL ããŒã¿ããŒã¹ Amazon Aurora DSQL ã«ã€ããŠãæ¥æ¥ãããããã¯ããããŒãžã£ãŒã𿥿¬ã®ã¹ãã·ã£ãªã¹ã SA ããæè¡è©³çްããé©çšå€æã®ãã€ã³ããŸã§ã解説ããŸããIVRy æ§ãMIXI æ§ãæ±äº¬æµ·äžæ¥åã·ã¹ãã ãºæ§ãªã©ãå®éã«æ¬çªã·ã¹ãã ã§æ¡çšãããã客æ§ã®çã®ç¥èŠãèããçŸå°éå¬ã€ãã³ãã§ããæ·±å€ãäŒæ¥ã®èª¿æŽã«ããŠãŠããæéããµãŒãã¹éçºã«äœ¿ããããã«ãªãããã®ç¬¬äžæ©ãšããŠã掻çšããã ããŸããåå ã«ã¯äºåç»é²ãå¿
èŠã§ãã®ã§ããã²äžèšã®ãªã³ã¯ãããç³ã蟌ã¿ãã ããã æ¬èšäºã¯ 2026 幎 7 æ 28 æ¥ ã«å
¬éãããã Building scalable applications on Amazon Aurora DSQL ãã翻蚳ãããã®ã§ãã æ¬èšäºã§ã¯ãAmazon Aurora DSQL ã®åæ£ã¢ãŒããã¯ãã£ã§å¹æçã«ã¹ã±ãŒã«ããã¢ããªã±ãŒã·ã§ã³ãèšèšããããã®å®è·µçãªã¬ã€ãã³ã¹ã玹ä»ããŸããã¹ã±ãŒã©ããªãã£ãå¶éããã¡ãªãã¿ãŒã³ã®èŠåãæ¹ãã¯ãŒã¯ããŒããå¹çãã忣ããå®èšŒæžã¿ã®èšèšãã¿ãŒã³ã®é©ç𿹿³ããã㊠Aurora DSQL ã«æé©åãããã©ã³ã¶ã¯ã·ã§ã³æŠç¥ã®å®è£
æ¹æ³ãåŠã¹ãŸããäž»ããŒã®éžå®ãã¹ããŒãèšèšã®ååãã€ã³ããã¯ã¹æŠç¥ããã«ããªãŒãžã§ã³æé©åãåãäžãã€ã€ãAWS ãªãŒãžã§ã³å
šäœã§ ACID(ååæ§ãäžè²«æ§ãç¬ç«æ§ãèä¹
æ§)ãå®å
šã«ç¶æããæ¹æ³ã解説ããŸãã 忣ããŒã¿ããŒã¹ã¯æ°Žå¹³ã¹ã±ãŒã«ãå®çŸããŸããããã®ç䟡ã¯ããŒã¿ã¢ãã«ãèªã¿æžãã®ããŒã忣ãèæ
®ãããšãã«çºæ®ãããŸããAmazon Aurora DSQL ã¯è¿œå èšå®ãªãã§å¹
åºãã¯ãŒã¯ããŒããåŠçã§ããããã«ãªã£ãŠããŸããããããããŒã®ç«¶åãæå°åããèšèšã¯ãããŸã ã«æã广ã®å€§ããæé©åã® 1 ã€ã§ãã ããããæŠå¿µãå
·äœäŸã§çè§£ãããããæ¬èšäºå
šäœãéããŠãã«ããªãŒãžã§ã³ã® Web ã¢ããªã±ãŒã·ã§ã³ããªãã¡ã¬ã³ã¹ã¢ãŒããã¯ãã£ãšããŠäœ¿ããŸãã倿°ã®ãŠãŒã¶ãŒãåæã«èªã¿æžããè¡ããäœã¬ã€ãã³ã·ãŒãæåŸ
ãã匷ãäžè²«æ§ãå¿
èŠãšããã·ã¹ãã ã§ãããŸãã«åæ£ããŒã¿ããŒã¹ããã«ã«äœ¿ã蟌ãã¿ã€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ãããAurora DSQL äžã§éçºããéã«çŽé¢ããèšèšå€æãé ã远ã£ãŠèŠãŠããã®ã«é©ããŠããŸãã ã¢ãŒããã¯ãã£ãçè§£ãã æ¬¡ã®ã»ã¯ã·ã§ã³ã§ã¯ããã®ã¢ãŒããã¯ãã£ã®ä»çµã¿ã説æããŸãã ã¢ã¯ãã£ã-ã¢ã¯ãã£ããªãã«ããªãŒãžã§ã³æžã蟌㿠Aurora DSQL ã¯ãªãŒãžã§ã³ããŸããã è€æ°ã®ã¢ã¯ãã£ãã©ã€ã¿ãŒ ããµããŒãããŸããä»åã®ãœãŒã·ã£ã«ã¢ããªã±ãŒã·ã§ã³ã§ããã°ãç±³åœã®ãŠãŒã¶ãŒã¯ us-east-1 ãš us-west-2 ã«æ¥ç¶ãããšãŒãããã®ãŠãŒã¶ãŒã¯ us-east-1 ã«æ¥ç¶ãããšãã£ãæ§æãå¯èœã§ãã©ã¡ãã®ãšã³ããã€ã³ãããªãŒãžã§ã³éã¬ã€ãã³ã·ãŒãªãã§èªã¿åããåãä»ããæžã蟌ã¿ã¯ 2 ã€ã®ãªãŒãžã§ã³éã§åæçã«ã¬ããªã±ãŒããããŸãã ãã¹ãŠã®æžã蟌ã¿ãæå¯ãã®ãªãŒãžã§ã³ã§åŠçã§ããŸããåäžã®ãã©ã€ããªãããã«ããã¯ã«ãªãããšã¯ãããŸããã ãã ããè€æ°ã®ã¢ã¯ãã£ãã©ã€ã¿ãŒã«ãªããšãæ°ããªçåãçãŸããŸãã2 ã€ã®ã©ã€ã¿ãŒãåãè¡ãåæã«å€æŽããããšããããäœãèµ·ããã®ã§ããããã æ¥œèгçåæå®è¡å¶åŸ¡(OCC) Aurora DSQL ã¯æ¥œèгçåæå®è¡å¶åŸ¡(OCC)ã䜿ããŸãããã©ã³ã¶ã¯ã·ã§ã³ã¯ããã¯ãåããã«å®è¡ãããã³ãããæã«æ€èšŒãããŸãã2 ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ãåãè¡ã倿Žããå Žåãçæ¹ã¯æåããããçæ¹ã¯æåŠãããŸããç«¶åãå€ãã»ã©æåŠãå¢ãããããã¹ã±ãŒã«ã®éµã¯ã¹ããŒãèšèšã«ãã£ãŠç«¶åãæžããããšã«ãããŸãã OCC ã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¯ä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ãããã¯ãè§£æŸããã®ãåŸ
ã£ãŠãããã¯ãããããšã¯ãããŸãããã³ãããæã«ç«¶åãæ€åºããããšãäžæããããã©ã³ã¶ã¯ã·ã§ã³ã«ã¯å³åº§ã«ãšã©ãŒãè¿ããã¢ããªã±ãŒã·ã§ã³ã¯ææ°ã®ããŒã¿ã§å詊è¡ã§ããŸããéåžžã¯æ¬¡ã®è©Šè¡ã§ããªç§ä»¥å
ã«æåããŸãã OCC ãã¢ããªã±ãŒã·ã§ã³ã«äžããæå³ OCC ã¯ãããã€ãã®éèŠãªç¹ã§è²¬ä»»ãã¢ããªã±ãŒã·ã§ã³å±€ã«ç§»ããŸããDSQL äžã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ãæåããããããæåãåæã«èšèšããå¿
èŠããããŸãã 1. ãã¹ãŠã®æžã蟌ã¿ãã¹ã§å詊è¡ãæ±ãå¿
èŠããã OCC ç«¶åã§ãã©ã³ã¶ã¯ã·ã§ã³ãäžæããããšãã¢ããªã±ãŒã·ã§ã³ã¯ SerializationError ãåãåããŸããããã¯ãã°ã§ãäŸå€çãªç¶æ³ã§ããªããåæå®è¡äžã«ãããéåžžã®åäœã®äžéšã§ããã¢ããªã±ãŒã·ã§ã³ã¯ãã®ãšã©ãŒãææããææ°ã®ããŒã¿ã§ãã©ã³ã¶ã¯ã·ã§ã³ãå詊è¡ããå¿
èŠããããŸãã 2. ãã©ã³ã¶ã¯ã·ã§ã³ã®ç¯å²ãç«¶å確çã«çŽçµããã ãã©ã³ã¶ã¯ã·ã§ã³ã®ä¿ææéãé·ããªãã»ã©ããŸãæäœããè¡ãå€ããªãã»ã©ãã³ãããåã«å¥ã®ãã©ã³ã¶ã¯ã·ã§ã³ãéè€ããããŒã¿ã倿Žããå¯èœæ§ãé«ããªããŸããDSQL äžã®ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ãçã察象ãçµã£ããã®ã«ããŸãã 3. ã¹ããŒãèšèšãç«¶åã®çºçç¯å²ã決ãã è€æ°ã®ç¬ç«ããæäœããã¹ãŠåãè¡ãæŽæ°ããå Žåãè«ççã«ã¯ç¡é¢ä¿ã§ãã£ãŠãç«¶åãçºçããŸããã¹ããŒã¿ã¹ã®æŽæ°ãã«ãŠã³ã¿ãŒã®ã€ã³ã¯ãªã¡ã³ããã¿ã€ã ã¹ã¿ã³ãã®æŽæ°ã¯ããããç¬ç«ããæäœã§ããããããããããåãè¡ãå
±æããŠãããšãäºãã«çŽååãããŠããŸããŸããOCC ã®å
éšçãªä»çµã¿ãæ·±ãç¥ãããå Žåã¯ã Concurrency Control in Amazon Aurora DSQL ãåç
§ããŠãã ããã 4. ãã¹ãŠã®ã¯ãŒã¯ããŒããåãããã«ç«¶åããããã§ã¯ãªã èªã¿åãå°çšã®æäœã¯ç«¶åããŸãããç°ãªãè¡ãžã®æ¿å
¥ãç«¶åããŸãããç«¶åãåŒãèµ·ããã®ã¯ åãè¡ ãžã®åæå€æŽã ãã§ããã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãæåã® 3 ã€ã®ã«ããŽãªã«è©²åœããæäœã®å²åãæå€§åããŸãã æäœã®çš®é¡ åææžã蟌ã¿ãšç«¶åããã? èªã¿åãå°çšãã©ã³ã¶ã¯ã·ã§ã³ ããªã ç°ãªãè¡ãžã®æ¿å
¥ ããªã ç°ãªãè¡ã®æŽæ° ããªã åãè¡ã®æŽæ° ãã(çæ¹ã®ãã©ã³ã¶ã¯ã·ã§ã³ãäžæ) 匷ãã¹ãããã·ã§ããåé¢ Aurora DSQL ã¯åŒ·ãã¹ãããã·ã§ããåé¢ã§åäœããŸããåãã©ã³ã¶ã¯ã·ã§ã³ã¯ããã©ã³ã¶ã¯ã·ã§ã³éå§æã«ååŸãããããŒã¿ããŒã¹ã®äžè²«ããã¹ãããã·ã§ããããèªã¿åããŸããã€ãŸãããã©ã³ã¶ã¯ã·ã§ã³å
ã§ã®èªã¿åãã¯å®å®ããŠãããã³ããããããŠããªãããŒã¿ããåŠçäžã«ä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ãã³ããããã倿Žãåç
§ããããšã¯ãããŸãããã³ãããæã® OCC ã«ããç«¶åæ€åºãšçµã¿åãããããšã§ãããŒãã£ãªãŒãããã³ãªããŒã¿ãã«ãªãŒããžã®å¯Ÿçã³ãŒããæžãããšãªããäžè²«ããèªã¿åããåŸãããŸãã ããã¯ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠçŽæ¥çãªåœ±é¿ãããããŸããã¬ã³ãŒããèªã¿åããšããåã¬ã³ãŒããæ¿å
¥ããåã«èŠªè¡ã®ååšã確èªãããšãããããã¯ãã©ã³ã¶ã¯ã·ã§ã³å
ã§é¢é£ããè¡ã®ã»ãããèªããšããå
šãŠäžè²«ããæç¹ã®ããŒã¿ãèªã¿åã£ãŠããŸãããããã®æäœã«å¯ŸããŠãé²åŸ¡çãªåèªã¿åããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®äžè²«æ§ãã§ãã¯ã远å ããå¿
èŠã¯ãããŸãããã¹ãããã·ã§ããã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®å®è¡äžãã£ãšå®å®ããŠããŸãã äž»ããŒæŠç¥ é©åãªèå¥åã®åãéžã¶ Aurora DSQL ã¯äž»ããŒãšã㊠UUIDãIDENTITY åãã·ãŒã±ã³ã¹ããµããŒãããŸããæšå¥šãããããã©ã«ã㯠UUID ã§ããUUID ã¯èª¿æŽãäžèŠã§ãæžã蟌ã¿ãåäžã«åæ£ãããŸããIDENTITY åãã·ãŒã±ã³ã¹ãªã©ã人éãèªã¿ãããæŽæ° ID (è«æ±æžçªå·ããã±ãã ID ãªã©)ãå¿
èŠãªå Žåã«ã®ã¿äœ¿çšããŠãã ããããã€ããªãããã¿ãŒã³ã§äž¡æ¹ãçµã¿åãããããšãã§ããŸããUUID ã®äž»ããŒã«å ããŠãã·ãŒã±ã³ã¹ã§çæãã衚瀺çšçªå·ãæãããæ¹æ³ã§ãã UUID: äž»ããŒã®ããã©ã«ã CREATE TABLE users ( user_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), ... ); ãã¬ãŒããªããšããŠãUUID ã¯äœææå»é ã«ãœãŒãã§ããŸãã(æç³»åã¯ãšãªã«ã¯å¥é created_at ã®ã€ã³ããã¯ã¹ãå¿
èŠ)ããŸããå£é ã§ã®äŒéãé£ãããªããŸã(ãuser 47291ããšãuser abc-123âŠããæ¯ã¹ãŠã¿ãŠãã ãã)ã æŽæ° ID ãå¿
èŠãªå Žå DSQL ã¯ã忣ç°å¢åãã«èšèšããããã£ãã·ã¥ã¢ãã«ãæã€ IDENTITY åããµããŒãããŠããŸãããã£ãã·ã¥ãµã€ãºã¯ãåã»ãã·ã§ã³ãããŒã«ã«ã§äºåã«ç¢ºä¿ããé£çª ID ã®æ°ãå¶åŸ¡ããå³å¯ãªã°ããŒãã«é åºãç ç²ã«ããŠãªãŒãžã§ã³éã®èª¿æŽãåæžããŸããä»»æã®ãã£ãã·ã¥å€ãæå¹ãªæšæºã® PostgreSQL ãšã¯ç°ãªããDSQL ã«ã¯ç®çã®ç°ãªã 2 ã€ã®ã¢ãŒãããããŸããå³å¯ãªé åºä»ãå²ãåœãŠã®ããã® CACHE 1 ãšãé«ã¹ã«ãŒããããªåæ£å²ãåœãŠã®ããã® CACHE >= 65536 ã§ããã©ã¡ãã®ã¢ãŒãã«ãããã¯æåã«éžæããŠãã ããã ID å ãŠãŒã¹ã±ãŒã¹ æšå¥šã¢ãããŒã é«ã¹ã±ãŒã«ãªã¯ãŒã¯ããŒãã®äž»ã㌠UUID( gen_random_uuid() ) é åºãéèŠãªã人ãèªãã ID(è«æ±æžãã¢ã«ãŠã³ã ID) CACHE 1 ã® ID å é«ãæ¿å
¥ã¬ãŒãã§ã®ã人ãèªãã ID CACHE >= 65536 ã® ID å å
éšçšã®äž»ã㌠+ ãŠãŒã¶ãŒåãã®çªå· ãã€ããªãã: UUID äž»ã㌠+ ã·ãŒã±ã³ã¹ã®è¡šç€º ID DSQL ã®ãããªåæ£ã·ã¹ãã ã§é£çª ID ãçæããã«ã¯ããªãŒãžã§ã³éã®èª¿æŽãå¿
èŠã§ããIDENTITY åã¯ããã管çããããã«ãã£ãã·ã¥ã¢ãã«ããããããŠããŸããåã»ãã·ã§ã³ãããŒã«ã«ã§ ID ã®ãããã¯ãäºåã«ç¢ºä¿ãããããè¡ãæ¿å
¥ãããã³ã«ãªãŒãžã§ã³éã®ã©ãŠã³ãããªãããè¡ãå¿
èŠããããŸãããéžæãããã£ãã·ã¥ãµã€ãºã«ãã£ãŠãå³å¯ãªã°ããŒãã«é åºãšæ¿å
¥ã¹ã«ãŒãããã®ãã¬ãŒããªããæ±ºãŸããŸããé«é »åºŠã®æ¿å
¥ã«ã¯ CACHE >= 65536 ãé©åã§ããåã»ãã·ã§ã³ã ID ã®ãããã¯ãããŒã«ã«ã§äºå確ä¿ããæ¿å
¥ããšã«ãªãŒãžã§ã³éã®èª¿æŽãªãã§æãåºããŸãã -- High-frequency inserts: distributed allocation, no per-insert coordination CREATE TABLE posts ( post_id BIGINT GENERATED ALWAYS AS IDENTITY (CACHE 65536), ... ); é£çªé åºãä¿ã€ããšãéèŠã§ãæ¿å
¥ã¬ãŒããäžçšåºŠ(æ¯ç§æ°çŸä»¶ä»¥äž)ã®å Žå㯠CACHE 1 ãé©åã§ãã -- Low-frequency inserts where sequential ordering is important CREATE TABLE invoices ( invoice_id BIGINT GENERATED ALWAYS AS IDENTITY (CACHE 1), ... ); ã©ã¡ãã®ã¢ãŒãã䜿çšããå Žåã§ããé£ç¶ããªã ID å€ãæ±ããããã«ã¢ããªã±ãŒã·ã§ã³ãèšèšããŠãã ãããããŒã«ããã¯ãã»ãã·ã§ã³ã®çµäºãããã³åæå²ãåœãŠã«ãããæ¬ çªãçããã®ã¯æ£åžžãªåäœã§ãã ãã€ããªãããã¿ãŒã³: UUID äž»ã㌠+ ã·ãŒã±ã³ã¹ã®è¡šç€º ID UUID ã忣æžã蟌ã¿ãå¹çããåŠçããã·ãŒã±ã³ã¹ããŠãŒã¶ãŒåãã®çªå·ãçæããŸããDSQL ã¯å DDL ã¹ããŒãã¡ã³ããç¬ç«ãããã©ã³ã¶ã¯ã·ã§ã³ã§å®è¡ãããããã·ãŒã±ã³ã¹ãšããŒãã«ã¯å¥ã
ã«äœæããŸãã -- Step 1: Create the sequence (its own transaction) CREATE SEQUENCE post_display_seq CACHE 65536; -- Step 2: Create the table referencing the sequence (separate transaction) CREATE TABLE posts ( post_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- Internal: distributed post_number BIGINT DEFAULT nextval('post_display_seq'), -- External: human-readable ... ); post_id ã¯ãã¹ãŠã®çµåãé¢é£ããŒãã«éã®åç
§åãšããŠäœ¿ããŸããpost_number 㯠URL ã«è¡šç€ºããããŠãŒã¶ãŒã«å
±æãããããçªå·ã§ãã ã¯ã€ãã¯ãªãã¡ã¬ã³ã¹: èå¥åã®åã®éžæ ãŠãŒã¹ã±ãŒã¹ æšå¥šã¢ãããŒã é«ã¹ã±ãŒã«ãªã¯ãŒã¯ããŒãã®äž»ã㌠UUID( gen_random_uuid() ) é åºãéèŠãªã人ãèªãã ID(è«æ±æžãã¢ã«ãŠã³ã ID) CACHE 1 ã® ID å é«ãæ¿å
¥ã¬ãŒãã§ã®ã人ãèªãã ID CACHE >= 65536 ã® ID å å
éšçšã®äž»ããŒãšãŠãŒã¶ãŒåãã®çªå· ãã€ããªãã: UUID äž»ããŒãšã·ãŒã±ã³ã¹ã®è¡šç€º ID OCC ã®ããã®ã¹ããŒãèšèš ããŒãã«ã®æ§é ã OCC ã®ç«¶åçãçŽæ¥å·Šå³ããç«¶åçãå®å¹ã¹ã«ãŒããããæ±ºããŸãããã㯠Aurora DSQL äžã§æ§ç¯ããéã«æã圱é¿ã®å€§ããèšèšå€æã® 1 ã€ã§ãã ãããè¡ã®åé¡ é »ç¹ã«æŽæ°ãããè€æ°ã®ãã£ãŒã«ããããšã³ãã£ãã£ããšã« 1 ã€ã®è¡ãå
±æããçŽ æŽãªã¹ããŒããèããŠã¿ãŸãããã -- PROBLEMATIC: Everything in one row per entity CREATE TABLE accounts ( account_id UUID PRIMARY KEY, ... request_count INT DEFAULT 0, -- Updated on every request active_connections INT DEFAULT 0, -- Updated constantly last_active TIMESTAMP, -- Updated on every action total_spend DECIMAL DEFAULT 0, -- Updated on every transaction ... ); ãã©ãã£ãã¯ãæ¥å¢ãããšããã¹ãŠã®ãªã¯ãšã¹ãã request_count ãæŽæ°ããŸããåæã«ãæ¥ç¶ã€ãã³ãã active_connections ãæŽæ°ããŸãã課éã€ãã³ãã total_spend ãæŽæ°ããŸããããã«ãããããã¢ã¯ã·ã§ã³ã last_active ãæŽæ°ããŸãããããããã¹ãŠ åãè¡ ã察象ãšãããããOCC ã«ãã£ãŠã»ãšãã©ãäžæãããŸãã äžçšåºŠã®åæå®è¡æ°ã§ãã£ãŠãããã®ã¹ããŒãã¯ããŒã¯æã« 5 ããŒã»ã³ããè¶
ããç«¶åçãçã¿ãŸãã 解決ç: ç«¶åãã¿ãŒã³ã§åé¢ãã è«ççã«ç¬ç«ããæäœãè¡ãå
±æããªããããããŒãã«ãåå²ããŸãã -- Cold data: updated rarely CREATE TABLE accounts ( account_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT, email TEXT, plan TEXT, ... ); -- Hot counters: isolated from cold data CREATE TABLE account_stats ( account_id UUID PRIMARY KEY, request_count INT DEFAULT 0, active_connections INT DEFAULT 0, ... ); -- Append-only: ZERO conflicts CREATE TABLE billing_events ( account_id UUID NOT NULL, event_id UUID NOT NULL, PRIMARY KEY (account_id, event_id) ); ããã«ãããèšå®ã®æŽæ°ã䜿çšéã«ãŠã³ã¿ãŒã®ã€ã³ã¯ãªã¡ã³ããšç«¶åããªããªããŸãã課éã€ãã³ãã¯å°çšããŒãã«ãžã®æ¿å
¥ãšãªããæ°ããè¡ã®æ¿å
¥ã¯ä»ã®æ°ããè¡ã®æ¿å
¥ãšã¯ç«¶åããŸãããç«¶åç㯠5 ããŒã»ã³ãè¶
ãã 1 ããŒã»ã³ãã倧ããäžåãæ°ŽæºãžãšäžãããŸãã 远èšã®ã¿ã®ãã¿ãŒã³ã§ç«¶åãç·©åãã è¡ãæ¿å
¥ãããã ãã§æŽæ°ãããªãããŒãã«ã¯ãOCC ç°å¢äžã§ã¯æ¬è³ªçã«ç«¶åãçºçããŸããããã®æ°ã¥ãã¯ãç¶æ
å€åã®ã¢ããªã³ã°æ¹æ³ãå€ããŸãã -- Instead of updating a "status" column in place, track state as events: CREATE TABLE resource_events ( event_id UUID DEFAULT gen_random_uuid(), resource_id UUID NOT NULL, event_type TEXT NOT NULL, -- 'created', 'updated', 'suspended', 'deleted' ... PRIMARY KEY (resource_id, created_at, event_id) ); DSQL ã®èšèšäžã®å¶çŽãçè§£ãã Aurora DSQL ã¯ã忣ã¹ã±ãŒã©ããªãã£ãå®çŸããããã«æå³çãªã¢ãŒããã¯ãã£äžã®ãã¬ãŒããªããè¡ã£ãŠããŸããPostgreSQL ã®äžéšã®æ©èœã¯ãµããŒããããŠããªãããç°ãªãæåãããŸããææ°ã®ãªã¹ãã«ã€ããŠã¯ Aurora DSQL ã® PostgreSQL äºææ§ããã¥ã¡ã³ã ãåç
§ããŠãã ããã以éã®ã»ã¯ã·ã§ã³ã§ã¯ãã¢ããªã±ãŒã·ã§ã³èšèšã«æã圱é¿ãäžããå¯èœæ§ãé«ãå¶çŽã«ã€ããŠèª¬æããŸãã ããªã¬ãŒã䜿ããªãã«ãŠã³ã¿ãŒæŽæ° ããªã¬ãŒããµããŒããããªãããã以åã¯èªåçã«åŠçãããŠããã«ãŠã³ã¿ãŒæŽæ°ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãå
ã«æç€ºçã«èšè¿°ããããšã«ãªããŸããããã¯ãããå©ç¹ã§ããããžãã¯ãå¯èŠåããããã¹ãå¯èœã«ãªãããã©ã³ã¶ã¯ã·ã§ã³å
ã§ãã€å®è¡ããããæ£ç¢ºã«å¶åŸ¡ã§ããŸãã async def publish_post(conn, user_id, content, media_urls): async with conn.transaction(): post_id = await conn.fetchval(''' INSERT INTO posts (user_id, content, media_urls, status) VALUES ($1, $2, $3, 'published') RETURNING post_id ''', user_id, content, media_urls) # What a trigger used to do --- now explicit and within the same transaction await conn.execute(''' UPDATE user_stats SET post_count = post_count + 1 WHERE user_id = $1 ''', user_id) return post_id åç
§æŽåæ§ Aurora DSQL ã¯å€éšããŒå¶çŽããµããŒãããŠãããããŒã¿ããŒã¹ã¬ãã«ã§åç
§æŽåæ§ã匷å¶ã§ããŸããäžæ¹ã忣ããŒã¿ããŒã¹ã«ãããŠå€éšããŒã远å ãã æäœããšã«è¿œå èªã¿åãããã©ã³ã¶ã¯ã·ã§ã³å¶éã®ãªãŒããŒããã ãé¿ãããããåç
§æŽåæ§ãã¢ããªã±ãŒã·ã§ã³å±€ã§æ±ãããšãã§ããŸãããã ããã®å Žåãååšããªã芪ã¬ã³ãŒããåç
§ããåã¬ã³ãŒãã®æ¿å
¥ãé²ããã®ã¯äœããããŸããã çŸå®çã«å¯ŸåŠããŸãããã async def create_order_item(conn, user_id, order_id, product_id, quantity): async with conn.transaction(): # Application-enforced FK: verify parent exists order = await conn.fetchrow( 'SELECT order_id, status FROM orders WHERE order_id = $1', order_id) if not order: raise NotFoundError("Order does not exist") ... return await conn.fetchval(''' INSERT INTO order_items (order_id, user_id, product_id, quantity) VALUES ($1, $2, $3, $4) RETURNING item_id ''', order_id, user_id, product_id, quantity) ãªãã©ã€ããžãã¯ãšãšã©ãŒåé¡ ãã¹ãŠã®ãšã©ãŒããªãã©ã€ã«å€ããããã§ã¯ãããŸãããDSQL äžã®å
ç¢ãªã¢ããªã±ãŒã·ã§ã³ã¯ããšã©ãŒãåé¡ããŠé©åã«å¯Ÿå¿ããŸãã ãªãã©ã€ãããæäœãå®å
šã«åå®è¡ã§ããããã«ãã OCC ã®ãªãã©ã€ã¯ãåãæäœãè€æ°åå®è¡ãããããšãæå³ããŸããã«ãŠã³ã¿ãŒã®ã€ã³ã¯ãªã¡ã³ãã®ããã«ç¶æ
ãç©ã¿äžããæäœã¯ãç¡æ¡ä»¶ã«ãªãã©ã€ãããšèª€ã£ãçµæãçã¿ãŸããããã¥ã©ã«ããŒãšãšãã« ON CONFLICT DO NOTHING ã䜿ã£ãŠæ¿å
¥ãå®å
šã«ããå¯äœçšã¯æ¿å
¥ãæ°èŠã§ãã£ããã©ããã«åºã¥ããŠå¶åŸ¡ããŠãã ããã ããã¥ã©ã«ãªãŠããŒã¯å¶çŽããªãæäœã«ã¯ãã¯ã©ã€ã¢ã³ãåŽã§çæããåªçæ§ããŒã䜿ããŸãã CREATE TABLE payments ( payment_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), idempotency_key TEXT NOT NULL, account_id UUID NOT NULL, UNIQUE(idempotency_key, account_id) ... ); async def process_payment(conn, idempotency_key, account_id, amount): async with conn.transaction(): result = await conn.fetchrow(''' INSERT INTO payments (idempotency_key, account_id, amount) VALUES ($1, $2, $3) ON CONFLICT (idempotency_key, account_id) DO NOTHING RETURNING payment_id ''', idempotency_key, account_id, amount) if result: # First execution --- apply side effects await conn.execute(''' UPDATE account_stats SET total_spend = total_spend + $1 WHERE account_id = $2 ''', amount, account_id) return {"status": "created"} return {"status": "already_processed"} ãšã©ãŒåé¡ ãªãã©ã€ãããã©ããã倿ããåã«ããšã©ãŒã 3 ã€ã®ã«ããŽãªã«åé¡ããŸãã ããã¯ãªãããŠãªãã©ã€: OCC ç«¶å(asyncpg ã§ã¯ SerializationError )ãåæå®è¡äžã§æ³å®ãããäºè±¡ã§ããããªãã©ã€ããŠãå®å
šã§ãã 忥ç¶ããŠãªãã©ã€: æ¥ç¶ã®å€±æ( ConnectionDoesNotExistError ã InterfaceError )ããªãã©ã€ã®åã«æ°ããæ¥ç¶ãååŸããŸãã æ±ºããŠãªãã©ã€ããªã: å¶çŽéå( UniqueViolationError ã CheckViolationError )ããããã¯äžæçãªç¶æ
ã§ã¯ãªãããžãã¯ãšã©ãŒã瀺ããŸãã æäœãåªçãªå Žåã®ã¿ãªãã©ã€: ã¿ã€ã ã¢ãŠã( QueryCanceledError )ããã©ã³ã¶ã¯ã·ã§ã³ã®ç¶æ
ãäžæãªãããåå®è¡ããŠãå®å
šãªæäœã®å Žåã«ã®ã¿ãªãã©ã€ããŸãã æ£ç¢ºãªäŸå€ã¯ã©ã¹ã¯ãã©ã€ããŒã®ããŒãžã§ã³ã«ãã£ãŠç°ãªãå Žåãããããã䜿çšãããã©ã€ããŒã®ããã¥ã¡ã³ããåç
§ããŠãã ããã ææ°ããã¯ãªããšãžãã¿ãŒãçšãããªãã©ã€ ãã詳ããè°è«ã«ã€ããŠã¯ãææ°ããã¯ãªããšãžãã¿ãŒã«é¢ãã Marc Brooker ã®ããã°èšäºãåç
§ããŠãã ããã async def execute_with_retry(pool, operation, max_retries=3, base_delay_ms=10): for attempt in range(max_retries + 1): try: async with pool.acquire() as conn: return await operation(conn) except SerializationError: if attempt == max_retries: raise delay = (base_delay_ms * (2 ** attempt)) / 1000.0 jitter = random.uniform(0, delay * 0.5) await asyncio.sleep(delay + jitter) except (ConnectionDoesNotExistError, InterfaceError, OSError): if attempt == max_retries: raise await asyncio.sleep(0.1) except (UniqueViolationError, CheckViolationError): raise # Never retry business logic errors ãªãŒãžã§ã³ãã§ã€ã«ãªãŒããŒã®åŠç ãªãŒãžã§ã³ãæ£åžžã§ãªããªã£ãå ŽåãDNS(ããšãã° Amazon Route 53 ã®ãã«ã¹ãã§ãã¯ãšãã§ã€ã«ãªãŒããŒã«ãŒãã£ã³ã°)ã䜿ã£ãŠãã¢ããªã±ãŒã·ã§ã³ãã©ãã£ãã¯ãæ£åžžãªãªãŒãžã§ã³ãžåãæ¿ããããšãæšå¥šããŸããããã«ãããã¯ãšãªããªãŒãžã§ã³éã§æé»çã«ã«ãŒãã£ã³ã°ãããéã«çºçãããäºæããªãã¬ã€ãã³ã·ãŒã®æ¥äžæãåé¿ã§ããŸããDNS ãã§ã€ã«ãªãŒããŒãå©çšã§ããªãå Žåã¯ãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§ã»ã«ã³ããªãšã³ããã€ã³ãã«ãã©ãŒã«ããã¯ããæ¹æ³ãæ«å®çãªå¯ŸåŠãšããŠäœ¿ããŸãã詳ããå®è£
ã¬ã€ãã«ã€ããŠã¯ã Implement multi-region endpoint routing for Amazon Aurora DSQL ãš GitHub äžã®ãµã³ãã«ã³ãŒã ãåç
§ããŠãã ããã DDL ã¯ãã©ã³ã¶ã¯ã·ã§ã³éå¯Ÿå¿ DSQL ã§ã¯ãDDL ãš DML ã 1 ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³å
ã§æ··åšãããããšã¯ã§ããŸããã -- THIS FAILS: BEGIN; CREATE TABLE new_feature (...); INSERT INTO new_feature VALUES (...); COMMIT; -- DO THIS INSTEAD (two separate operations): CREATE TABLE new_feature (...); -- Then: BEGIN; INSERT INTO new_feature VALUES (...); COMMIT; expand-contract ãã¿ãŒã³ ããŒã«å€ã® is_active ãã©ã°ã眮ãæããããã« status åã远å ããã±ãŒã¹ãèããŸããããã«ã¯ 3 ã€ã®ãã§ãŒãºãå¿
èŠã§ãã ãã§ãŒãº 1 â Expand(æ¡åŒµ): DEFAULT å€ãæå®ããã«æ°ããåã远å ããŸã(DSQL ã§ã¯åã®è¿œå ãšããã©ã«ãå€ã®èšå®ãå¥ã
ã®æäœãšããŠè¡ãå¿
èŠããããŸã)ã -- Step 1: Add the column ALTER TABLE accounts ADD COLUMN status TEXT; -- Step 2: Populate existing rows in batches (separate transaction) UPDATE accounts SET status = CASE WHEN is_active THEN 'active' ELSE 'inactive' END WHERE status IS NULL LIMIT 500; ãã§ãŒãº 2 â Migrate(ç§»è¡): ãã¹ãŠã®æ¿å
¥ãšæŽæ°ã§ is_active ãš status ã®äž¡æ¹ã«æžã蟌ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãããããã€ããŸããäºéæžã蟌ã¿ã®ãããã€ããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§å®å®ããããèªã¿åããã¹ã is_active ãã status ã«åãæ¿ããŸãã async def create_account(pool, account_id, active: bool): async with pool.acquire() as conn: await conn.execute(''' INSERT INTO accounts (account_id, is_active, status) VALUES ($1, $2, $3) ''', account_id, active, 'active' if active else 'inactive') async def set_account_active(pool, account_id, active: bool): async with pool.acquire() as conn: await conn.execute(''' UPDATE accounts SET is_active = $2, status = $3 WHERE account_id = $1 ''', account_id, active, 'active' if active else 'inactive') ãã§ãŒãº 3 â Contract(çž®å°): ãã¹ãŠã®èªã¿åããæ°ããåã䜿ãããã«ãªã£ãããå€ãåãåé€ããŸãã ALTER TABLE accounts DROP COLUMN is_active; ç§»è¡ã®ãã¹ããã©ã¯ãã£ã¹ ã¹ããŒãã®å€æŽã¯ã³ãŒãã®å€æŽãšã¯åããŠãããã€ããŸãã ããŒã¿ã®ããã¯ãã£ã«ã¯å°ããªãã©ã³ã¶ã¯ã·ã§ã³(100ïœ500 è¡)ã«ãããåããOCC ã®æ¥å¢ãé²ããŸãã ç§»è¡äžã¯ç«¶åçãç£èŠããŸããæ¥å¢ãããããããã®ã¬ãŒããèœãšããŸãã æ°ããã¹ããŒãããã¹ãŠã®ãªãŒãžã§ã³ã§å©çšããåã«ãDDL ããªãŒãžã§ã³å
šäœã«äŒæãããŸã§æéã眮ããŸãã 远å ãå
è¡ãããŸãããŸãåã远å ããæ¬¡ã«ã³ãŒãããããã€ããããããå€ãåãåé€ããŸãã 忣ç°å¢ã§ã®ã¯ãšãªããã©ãŒãã³ã¹ ãã©ã³ã¶ã¯ã·ã§ã³ãçãä¿ã€ é·ããã©ã³ã¶ã¯ã·ã§ã³(èªã¿æžãããè¡ãå€ã)ã»ã©æ€èšŒãã§ãŒãºãé·ããªããç«¶å確çãé«ãŸããŸãã # BAD: External API call inside the transaction async with conn.transaction(): order = await conn.fetchrow('SELECT * FROM orders WHERE id = $1', order_id) shipping_cost = await call_shipping_api(order) # 200ms external call! await conn.execute('UPDATE orders SET shipping = $1', shipping_cost) # GOOD: External work outside, database work inside order = await conn.fetchrow('SELECT * FROM orders WHERE id = $1', order_id) shipping_cost = await call_shipping_api(order) async with conn.transaction(): await conn.execute('UPDATE orders SET shipping = $1 WHERE id = $2', shipping_cost, order_id) N+1 ã¯ãšãªãé¿ãã åã¯ãšãªã¯ DSQL ãžã®ãããã¯ãŒã¯ãªãŒããŒãããã䌎ããŸããN+1 ãã¿ãŒã³ã¯ãããŒã«ã«ããŒã¿ããŒã¹ã«æ¯ã¹ãŠçžå¯Ÿçã«ã³ã¹ããé«ããªããŸãã # BAD: 101 round trips posts = await conn.fetch('SELECT * FROM posts WHERE user_id = $1 LIMIT 100', uid) for post in posts: comments = await conn.fetch( 'SELECT * FROM comments WHERE post_id = $1', post['post_id']) # GOOD: 1 round trip results = await conn.fetch(''' SELECT p.*, c.comment_id, c.content as comment_content FROM posts p LEFT JOIN comments c ON p.post_id = c.post_id WHERE p.user_id = $1 ORDER BY p.created_at DESC LIMIT 100 ''', uid) 倧ããªæäœããããåãã Aurora DSQL ã¯ãã©ã³ã¶ã¯ã·ã§ã³ããã 3,000 è¡ã®å€æŽäžéãèšããããŠããããã倧ããªæäœã¯åå²ããå¿
èŠããããŸãã倿ŽããããåããŸãããã # BAD: One transaction touching 100,000 rows async with conn.transaction(): await conn.execute('UPDATE users SET tier = $1 WHERE created_at < $2', 'legacy', cutoff_date) # GOOD: Chunked into small transactions while True: async with conn.transaction(): updated = await conn.fetchval(''' WITH batch AS ( SELECT user_id FROM users WHERE created_at < $1 AND tier != 'legacy' LIMIT 200 ) UPDATE users SET tier = 'legacy' WHERE user_id IN (SELECT user_id FROM batch) RETURNING count(*) ''', cutoff_date) if updated == 0: break ã¢ãã¿ãªã³ã°ãšå¯èŠ³æž¬æ§ DSQL äžã®ãœãŒã·ã£ã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã次ã®ã¡ããªã¯ã¹ãèšèšã®å¥å
šæ§ãæããŠãããŸãã ã¡ããªã¯ã¹ å¥å
š èŠèª¿æ» èŠåèšèš OCC ç«¶åç äœã äžçšåºŠ é«ã ã³ãããã® p99 ã¬ã€ãã³ã·ãŒ äœã äžçšåºŠ é«ã æ¥ç¶ããŒã«ã®äœ¿çšç äœã äžçšåºŠ é«ã ãªãã©ã€èšå®åæ°å
ã§ãã©ã³ã¶ã¯ã·ã§ã³ãæåããªãã£ãå²å ã»ãŒãŒã ç¡èŠã§ããªãçšåºŠ é »çº ãã¹ããã©ã¯ãã£ã¹ã®ãŸãšã ã¹ããŒãèšèš ããã(é »ç¹ã«æŽæ°ããã)ããŒã¿ãšã³ãŒã«ã(ãŸãã«ããæŽæ°ãããªã)ããŒã¿ãå¥ã
ã®ããŒãã«ã«åããŸãã ãã°ãã€ãã³ããã€ã³ã¿ã©ã¯ã·ã§ã³ã«ã¯è¿œèšã®ã¿ã®ããŒãã«ã䜿ããŸã(OCC ç«¶åã¯ãŒã)ã äž»ããŒã«ã¯ UUID v4 ãéžã³ãŸããåäžã«åæ£ãããã調æŽãäžèŠã§ãã 人ãèªããæŽæ° ID ãé«ã¹ã«ãŒãããã§å¿
èŠãšããå Žåã¯ã CACHE >= 65536 ã® IDENTITY åãŸãã¯ã·ãŒã±ã³ã¹ã䜿ããŸãã ã¹ã±ãŒã©ããªãã£ãšãŠãŒã¶ãŒåãã®èªã¿ãããçªå·ã®äž¡æ¹ãå¿
èŠãªå Žåã¯ããã€ããªãããã¿ãŒã³(UUID äž»ããŒãšã·ãŒã±ã³ã¹ã®è¡šç€º ID)ã䜿ããŸãã ã¢ã¯ã»ã¹ãã¿ãŒã³ãšããŒãã£ã·ã§ã³ãã¿ãŒã³ã«åã£ãè€åããŒãèšèšããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ ãã©ã³ã¶ã¯ã·ã§ã³ã¯çãä¿ã¡ãŸãã å€éšã®äœæ¥(API åŒã³åºããèšç®)ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®å¢çã®å€ã«ç§»ããŸãã OCC ç«¶åã¯ææ°ããã¯ãªã + ãžãã¿ãŒã§ãªãã©ã€ããŸãã ããŒã¿ã倿Žããªãã¯ãšãªã«ã¯ BEGIN READ ONLY ã䜿ããŸãã é¢é£ããæžã蟌ã¿ã¯ 1 ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ãŸãšããç«¶åã®çºçé¢ãæžãããŸãã åªçæ§ æ¿å
¥ã«ã¯ã¯ã©ã€ã¢ã³ãåŽã§çæãã UUID ãŸãã¯ããã¥ã©ã«è€åããŒã䜿ããŸãã èªç¶ãªéè€æé€ã®ä»çµã¿ããªã倿Žãšã³ããã€ã³ãã«ã¯ãåªçæ§ããŒã远å ããŸãã ON CONFLICT DO NOTHING ã®æ»ãå€ã確èªããååå®è¡ããªãã©ã€ããå€å¥ããŸãã éè€æé€ãªãã«ã«ãŠã³ã¿ãŒã®ã€ã³ã¯ãªã¡ã³ããç¡æ¡ä»¶ã«ãªãã©ã€ããªãã§ãã ããã ãšã©ãŒåŠç ãšã©ãŒãããªãã©ã€å¯èœ(OCC ç«¶åãæ¥ç¶æ)ããªãã©ã€äžå¯(å¶çŽéå)ãã§åé¡ããŸãã ãªãã©ã€ãããæäœãåå®è¡ããŠãå®å
šã§ããããšã確èªããŸãã æ¥ç¶ã®å€±æã«åããŠãªãŒãžã§ã³ã®ãã§ã€ã«ãªãŒããŒãå®è£
ããŸãã ã¹ããŒãã®ãããã°ã®ããã«ç«¶åã®è©³çްããã°ã«æ®ããŸãã ããã©ãŒãã³ã¹ é«é »åºŠã®èªã¿åãã¯ãšãªã«ã¯ã«ããªã³ã°ã€ã³ããã¯ã¹ã䜿ããŸãã æžã蟌ã¿ã®å€ãããŒãã«ã§ã¯ã€ã³ããã¯ã¹ãçµããŸã(ããããã OCC ã®æ€èšŒã³ã¹ããå¢ãããŸã)ã OFFSET ãããããŒã»ããããŒãžããŒã·ã§ã³ãåªå
ããŸãã N+1 ã¯ãšãªã®ãã¿ãŒã³ãé¿ããŸãã代ããã« JOIN ããããååŸã䜿ããŸãã 倧ããªãããæäœã¯å°ããªãã©ã³ã¶ã¯ã·ã§ã³ã«åå²ããŸãã ãŸãšã æ¬èšäºã§ã¯ãAmazon Aurora DSQL ã§ã¹ã±ãŒã«ããã¢ããªã±ãŒã·ã§ã³ã®èšè𿹿³ãåŠã³ãŸãããã¢ã¯ãã£ã-ã¢ã¯ãã£ããªãã«ããªãŒãžã§ã³æžã蟌ã¿ãš OCC ãã¢ããªã±ãŒã·ã§ã³ã«ã©ã®ãããªåœ±é¿ãäžãããã確èªããŸããããŸããäž»ããŒã®éžã³æ¹ããããããŒã¿ãšã³ãŒã«ãããŒã¿ã®åé¢ã«ããç«¶åã®æå¶æ¹æ³ããã©ã³ã¶ã¯ã·ã§ã³ãçãä¿ã¡ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãšã©ãŒãå®å
šã«å詊è¡ããæ¹æ³ããã㊠3,000 è¡ã®å€æŽäžéãå®ããªãã expand-contract ãã¿ãŒã³ã§ã¹ããŒããé²åãããæ¹æ³ãåŠã³ãŸãããAurora DSQL ãã³ã³ã»ã³ãµã¹ãã¬ããªã±ãŒã·ã§ã³ããã§ã€ã«ãªãŒããŒãæ
ããããçããã¯ããŒã¿ã¢ããªã³ã°ãšå
ç¢ãªãã©ã³ã¶ã¯ã·ã§ã³åŠçã«éäžã§ããŸãã Aurora DSQL ã䜿ãå§ããã«ã¯ãAWS ãããžã¡ã³ãã³ã³ãœãŒã«ã䜿ããã Aurora DSQL ã®ããã¥ã¡ã³ã ã«ããå
¥éã¬ã€ãã«åŸã£ãŠãã ããããŸãã¯é«ã¹ã«ãŒããããªããŒãã« 1 ã€ã«ãããã®ãã¿ãŒã³ãé©çšããOCC ã®ç«¶åçã芳å¯ããªãããããããæ¡å€§ããŠãããŸãããã èè
ã«ã€ã㊠Tejas Dubey Tejas ã¯ããšã³ã¿ãŒãã©ã€ãºã®ã客æ§ãå埩åãšã»ãã¥ãªãã£ãåããAI ã«ã察å¿ããã¯ã©ãŠãã¢ãŒããã¯ãã£ãæ§ç¯ã§ããããæ¯æŽãã AWS ã®ãã¯ãã«ã«ã¢ã«ãŠã³ããããŒãžã£ãŒã§ããæ°ãããã¯ãããžãŒãå®éã®ããžãã¹äŸ¡å€ã«å€ããããšã«æ
ç±ã泚ãã§ããŸããä»äºãé¢ãããšãæ¯åã远ããããããããã¯ã«ããŒã«ãããããææ°ã®ã¬ãžã§ãããããã£ããããŠããŸãã Edigar Chikwama Amazon Web Services ã®ãã¯ãã«ã«ã¢ã«ãŠã³ããããŒãžã£ãŒã§ãããšã³ã¿ãŒãã©ã€ãºã®ã客æ§ãšååããAWS ç°å¢ã®æé©åãéçšé¢ã®å埩åã®åäžããã¹ããã©ã¯ãã£ã¹ã®æ¡çšãæ¯æŽããŠããŸããçµç¹ã AWS äžã§ã¹ã±ãŒã©ãã«ã§ Well-Architected ãªãœãªã¥ãŒã·ã§ã³ãæ§ç¯ã§ããããæ¯æŽããããšã«æ
ç±ã泚ãã§ããŸãã Rajesh Kantamani ã·ãã¢ããŒã¿ããŒã¹ã¹ãã·ã£ãªã¹ã SA ã§ããAmazon Web Services äžã§ã®ããŒã¿ããŒã¹ãœãªã¥ãŒã·ã§ã³ã®èšèšãç§»è¡ãæé©åãæ¯æŽããã¹ã±ãŒã©ããªãã£ãã»ãã¥ãªãã£ãããã©ãŒãã³ã¹ã®å®çŸãå°éãšããŠããŸããäœæã«ã¯ãå®¶æãå人ãšå±å€ã§éããããšã楜ããã§ããŸãã ãã®èšäºã¯ Kiro ã翻蚳ãæ
åœããSolutions Architect ã® Kenta Nagasue ãã¬ãã¥ãŒããŸããã