
- TOP
- ã¿ã°äžèЧ
- ãããã¯ãŒã¯
ãããã¯ãŒã¯
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
æŠèŠ Amazon CloudWatch Logs ã Application Load Balancer (ALB) ã®ãã°ã Vended Logs ãšããŠãµããŒã ããŸãããããã«ãããALB ã®å¥å
šæ§ãšããã©ãŒãã³ã¹ã远å ã®èšå®ãéçºãªãã§å¯èŠåã§ããŸããALB ã® 3 çš®é¡ã®ãã° (ã¢ã¯ã»ã¹ãã°ãæ¥ç¶ãã°ããã«ã¹ãã§ãã¯ãã°) ã¯ããããããã£ãŒã«ãåã®ä»ããæ§é å JSON ãšããŠé
ä¿¡ãããŸãããã®ããã5xx ãšã©ãŒã®åå ãããŒããã©ã³ãµãŒåŽãã¢ããªã±ãŒã·ã§ã³åŽããåãåãããã¬ã€ãã³ã·ãŒäžæã®èŠå ã«ãªã£ãŠããã«ãŒããç¹å®ããã倱æããŠãããã«ã¹ãã§ãã¯ã蚺æããããšãã£ã察å¿ãããã«è¡ããŸãã Amazon S3 ãã±ããã®ç®¡çã Amazon Athena ã®ããŒãã«èšå®ãç¬èªã® ETL ãã€ãã©ã€ã³ã¯äžåäžèŠã§ãã 以äžã®ããã·ã¥ããŒãã¯ããªã¯ãšã¹ãéãšã¹ããŒã¿ã¹ã³ãŒãã®ååžãããŒããã©ã³ãµãŒãšã¿ãŒã²ããã®ã©ã¡ãã«èµ·å ããããåãåãããšã©ãŒåŸåãã«ãŒãããšã®ã¬ã€ãã³ã·ãŒããŒã»ã³ã¿ã€ã«ãã¿ãŒã²ããã®ãã«ã¹ç¶æ
ãã¯ã©ã€ã¢ã³ã/ã¿ãŒã²ããã®äžäœã©ã³ãã³ã°ã衚瀺ããŸãããã®ããã·ã¥ããŒãã¯ãæ¬èšäºã§æäŸãã AWS CloudFormation ãã³ãã¬ãŒã ã䜿ã£ãŠãããã€ãããã®ã§ãã å³ 1: ããŒããã©ã³ãµãŒå
šäœã®ãªã¯ãšã¹ãéããšã©ãŒåæãã¬ã€ãã³ã·ãŒå
èš³ã衚瀺ãã ALB Insights ããã·ã¥ããŒã ã¯ããã« AWS äžã§ãšã³ããŠãŒã¶ãŒã«å
¬éãããã¯ãŒã¯ããŒãã®å€§åã§ã¯ãApplication Load Balancer ããªã¯ãšã¹ããã¹äžã«é
眮ãããŠããŸããALB ã¯ã¢ããªã±ãŒã·ã§ã³ãããå
ã«ãã¹ãŠã®ãªã¯ãšã¹ããåãåããããã¿ãŒã²ããã«å°éããªãã£ããªã¯ãšã¹ããŸã§ææ¡ããŠããŸãããµãŒãã¹ã«åé¡ãçãããšãããªã³ã³ãŒã«ãšã³ãžãã¢ãæåã«æ±ããããã¯ããŒããã©ã³ãµãŒã®åé¡ãããããã¯ãŒã¯ãããããšãèªåã®ã¢ããªã±ãŒã·ã§ã³ãããšããçåã«çããŠãããã®ã ALB ã®ãã°ã§ãã ALB ã¯æ¬¡ã® 3 çš®é¡ã®ãã°ãåºåããŸãã ã¢ã¯ã»ã¹ãã° æ¥ç¶ãã° ãã«ã¹ãã§ãã¯ãã° ä»åã®ãªãªãŒã¹ä»¥åã¯ããããã®ãã°ã¯å§çž®ãããã¹ããŒã¹åºåããã¡ã€ã«ãšã㊠Amazon S3 ã«åºåãããŠããŸããããã®ãããS3 ã®ã©ã€ããµã€ã¯ã«ããªã·ãŒã管çããALB ããã£ãŒã«ãã远å ãããã³ã« Athena ããŒãã«ãä¿å®ããã¢ã©ãŒãçšã«å¥ã®ã€ã³ãã©ãæ§ç¯ããå¿
èŠããããŸãããä»åŸã¯ ALB ã®ã¬ã³ãŒãã VPC ãããŒãã°ãAWS WAF ãã°ãã¢ããªã±ãŒã·ã§ã³ãã°ãšåãå Žæã«å±ããããCloudWatch Logs ããã§ã«åããŠããæ©èœããã®ãŸãŸæŽ»çšã§ããŸããå
·äœçã«ã¯ãLog Analyticsãã¡ããªã¯ã¹ãã£ã«ã¿ãŒãContributor InsightsãLive Tailãç°åžžæ€åºããããŠã¯ãã¹ã¢ã«ãŠã³ãã»ã¯ãã¹ãªãŒãžã§ã³ã®éçŽã§ãã å°å
¥æé : æå¹åãšããã〠ãã®ã»ã¯ã·ã§ã³ã§ã¯ããã¬ã¡ããªæå¹åã«ãŒã« (Telemetry enablement rules) ã§ ALB ãã°ã®é
ä¿¡ãæå¹ã«ããæäŸããŠãã CloudFormation ãã³ãã¬ãŒã ã§ãµã³ãã«ããã·ã¥ããŒãããããã€ãããŸã§ã®æé ã説æããŸãã ã¹ããã 1: ãã¬ã¡ããªæå¹åã«ãŒã«ã§ ALB ãã°ã®åã蟌ã¿ãæå¹åãã Amazon CloudWatch ã®ãã¬ã¡ããªæå¹åã«ãŒã« ã䜿ããšãAWS ãªãœãŒã¹ã®ãã¬ã¡ããªåéãèªåçã«èšå®ã§ããŸããã«ãŒã«ã䜿ãã°ãçµç¹å
šäœã§ãã¬ã¡ããªåéã®æ¹æ³ãçµ±äžããç£èŠç¯å²ãäžå®ã«ä¿ãŠãŸãã1 ã€ã®ã«ãŒã«ã¯ãã¹ã³ãŒãå
ã«ããæ¢åã®ããŒããã©ã³ãµãŒãšæ°ããäœæãããããŒããã©ã³ãµãŒã®äž¡æ¹ã«é
ä¿¡èšå®ãé©çšããŸãããã®ãããäžåºŠãã®ã³ã°ãæå¹ã«ããŠããã°ããããã€ãã€ãã©ã€ã³ãåŸããäœæããããŒããã©ã³ãµãŒãèªåçã«ã«ããŒãããŸãã ALB ãã°ã® CloudWatch ãžã®åã蟌ã¿ãæå¹åããæé ã¯æ¬¡ã®ãšããã§ãã 管çã¢ã«ãŠã³ããŸãã¯å§ä»»ç®¡çè
ã¢ã«ãŠã³ãã§ CloudWatch ã³ã³ãœãŒã« ãéããŸãã ããã²ãŒã·ã§ã³ãã€ã³ã§ åã蟌㿠ãç¶ã㊠æå¹åã«ãŒã« ãéžæããŸãã ã«ãŒã«ã远å ãéžæããŸãã ããŒã¿ãœãŒã¹ ã§ Amazon Elastic Load Balancer â ã¢ããªã±ãŒã·ã§ã³ ãéžæãã ãã¬ã¡ããªãèšå® ãã¯ãªãã¯ããŸãã ã«ãŒã«å ã«åãããããåå (äŸ: ALB-Logs-Enablement ) ãå
¥åããŸãã ã«ãŒã«ã®ã¹ã³ãŒã ã§ çµç¹ ã çµç¹åäœ ã ã¢ã«ãŠã³ã ã®ãããããéžæããŸãã å³ 2: ã¹ããã 1ãç¯å²ãæå®ã: ã«ãŒã«åããœãŒã¹ã¢ã«ãŠã³ãããªãã·ã§ã³ã®ããŒã¿ãœãŒã¹ã¿ã°ã察象ãªãŒãžã§ã³ ãã°ã°ã«ãŒãåã®ãã¿ãŒã³ ã ä¿ææé ã åºååœ¢åŒ ãèšå®ããå
容ã確èªããŠã«ãŒã«ãäœæããŸãã Telemetry type ã§ Logs ãéžæããåéããããã°ã¿ã€ã (ã¢ã¯ã»ã¹ãã°ãæ¥ç¶ãã°ããã«ã¹ãã§ãã¯ãã°) ãéžã³ãŸãã (ãªãã·ã§ã³) ã¿ã°ã®ããŒ/å€ã®ãã¢ã远å ããŠãã«ãŒã«ã®å¯Ÿè±¡ãäžéšã®ããŒããã©ã³ãµãŒã«çµã蟌ã¿ãŸã (äŸ: Environment: Production)ã å³ 3: ã¹ããã 2ãéä¿¡å
ãæå®ã: ãã°ã°ã«ãŒãåã®ãã¿ãŒã³ãä¿ææéãæå·åã3 çš®é¡ã® ALB ãã°ã¿ã€ãã®éžæ å
容ã確èªãã Amazon Elastic Load Balancer â ã¢ããªã±ãŒã·ã§ã³ Logs ãèšå® ãã¯ãªãã¯ããŸãã å³ 4: ã¹ããã 3ã確èªãšäœæã: ã«ãŒã«åããœãŒã¹ã¢ã«ãŠã³ãã察象ãªãŒãžã§ã³ãCloudWatch Logs ã®éä¿¡å
ãéžæãããã°ã¿ã€ãã®ãµããªãŒ æå¹åã«ãŒã«ãæå¹ã«ãªããšãCloudWatch ã¯ã«ãŒã«ã®ã¹ã³ãŒãå
ã«ãããªãœãŒã¹ãã ALB ãã°ã®åã蟌ã¿ãéå§ããŸãããã°ã¯èªåçã«æ§é å JSON 圢åŒãžå€æãããCloudWatch Logs ã®ãã°ã°ã«ãŒãã«ä¿åãããŸãã3 çš®é¡ã®ãã°ã¯ãã¹ãŠåããã°ã°ã«ãŒãã«å±ããæ¬¡ã®ããã«ãã°ã¹ããªãŒã ã®ãã¬ãã£ãã¯ã¹ã§åºå¥ãããŸãã ã¢ã¯ã»ã¹ãã° â ALB_Access_Logs/app/<lb-name>/<lb-id> æ¥ç¶ãã° â ALB_Connection_Logs/app/<lb-name>/<lb-id> ãã«ã¹ãã§ãã¯ãã° â ALB_Health_Check_Logs/app/<lb-name>/<lb-id> ã¹ããã 2: CloudFormation ãã³ãã¬ãŒãã§ CloudWatch ããã·ã¥ããŒãããããã€ãã CloudWatch ããã·ã¥ããŒã ã¯ãALB ã®ãã°ããŒã¿ãäžå
çã«å¯èŠåããå ŽãæäŸã§ããŸãããµã³ãã«ããã·ã¥ããŒãã¯ãCloudWatch Log Analytics ã®ã¯ãšãªãã¡ããªã¯ã¹ãContributor Insights ã«ãŒã«ãçµã¿åãããŠãç£èŠå¯Ÿè±¡ã®ãã¹ãŠã®ããŒããã©ã³ãµãŒã«å
±éããéçšäžã®ãã¿ãŒã³ãå¯èŠåããŸããéçšããŒã ã¯ãã©ãã£ãã¯ã®ç£èŠããšã©ãŒã®èª¿æ»ãã¿ãŒã²ããã®ãã«ã¹ç¢ºèªã 1 ãæã§è¡ããããã«ãªããŸãã å³ 5: ãªã¯ãšã¹ãéã5xx ãšã©ãŒæ°ãæãé
ãã¿ãŒã²ããã® p99 ã¬ã€ãã³ã·ãŒãã¹ããŒã¿ã¹ã³ãŒãååžããã«ã¹ãã§ãã¯è©³çްã瀺ã ALB Insights ããã·ã¥ããŒã ããã«å§ãããããããããã·ã¥ããŒãããããã€ãã CloudFormation ãã³ãã¬ãŒããçšæããŠããŸãã CloudFormation ã® YAML ãã³ãã¬ãŒã ãããŠã³ããŒãããŸãã AWS CloudFormation ã³ã³ãœãŒã« ãéããŸãã ã¹ã¿ãã¯ã®äœæ > æ°ãããªãœãŒã¹ãäœ¿çš (æšæº) ãéžæããŸãã ãã³ãã¬ãŒããã¢ããããŒããã æ¬¡ãž ãéžæããŸãã ã¹ã¿ãã¯åãå
¥åãããã©ã¡ãŒã¿ãŒãèšå®ããŸãã DashboardName â ããã·ã¥ããŒãã®åå (ããã©ã«ã: ALB-Insights) DefaultTimeRange â ããã·ã¥ããŒããéãããšãã«è¡šç€ºãããæé (ããã©ã«ã: -PT3H) CreateContributorInsightsRules â Contributor Insights ã«ãŒã«ãäœæããå Žå㯠Yesãããã·ã¥ããŒãã ããäœæããå Žå㯠No ALBLogGroupName â ALB ãã°ãåãåããã°ã°ã«ãŒã (ããã©ã«ã: /aws/elb)ãContributor Insights ã«ãŒã«ã§ã®ã¿äœ¿çšãããŸãã ResourcePrefix â ã«ãŒã«åã«ä»ãããã¬ãã£ãã¯ã¹ (ããã©ã«ã: ALB) 次㞠ãéžæããå¿
èŠã«å¿ããŠã¹ã¿ãã¯ãªãã·ã§ã³ãèšå®ã㊠次㞠ãéžæããŸãã èšå®å
容ã確èªãã éä¿¡ ãéžæããŸãã ã¹ã¿ãã¯ã®äœæãå®äºãããš CloudWatch ããã·ã¥ããŒããå©çšå¯èœã«ãªããã€ãã³ããå±ãã«ã€ã㊠ALB ãã°ã®ãã¿ãŒã³ã衚瀺ãããŠãããŸãã å³ 6: ããã·ã¥ããŒããš 2 ã€ã® Contributor Insights ã«ãŒã«ã CREATE_COMPLETE ã«ãªã£ã CloudFormation ã®ãªãœãŒã¹ã¿ã Log Analytics ã«ãã ALB ãã°ã®åæ ããã·ã¥ããŒãããããã€ããåŸã¯ãã¢ãããã¯ãªã¯ãšãªãçŽæ¥å®è¡ããããšãã§ããŸãã CloudWatch ã³ã³ãœãŒã« ã§ ãã° > ãã°åæ ãéããŠãã ãããããã§ã¯ãéçšã§ããåãããçåã«çããã¯ãšãªã玹ä»ããŸãã 5xx ã¯ããŒããã©ã³ãµãŒç±æ¥ãã¢ããªã±ãŒã·ã§ã³ç±æ¥ã SOURCE logGroups() | filterIndex @data_source_name in ["aws_alb"] | filterIndex @data_source_type in ["access"] | filter elb_status_code >= 500 | parse elb /^app\/(?[^\/]+)/ | fields if(target_status_code = "-", "load balancer / network", "target application") as owner | stats count(*) as errors, count_distinct(target_port) as targets_affected, earliest(time) as first_seen, latest(time) as last_seen by owner, lb, elb_status_code | sort errors desc é
ãã«ãŒãã¯ã©ãã SOURCE logGroups() | filterIndex @data_source_name in ["aws_alb"] | filterIndex @data_source_type in ["access"] | filter target_processing_time >= 0 | parse request_line /^(?\S+)\s+(?\S+)/ | parse url /^[a-z]+:\/\/[^\/]*(?[^?]*)/ | parse path /^\/(?[^\/]*)\/?(?[^\/]*)/ | fields if(s2 = "", concat("/",s1), concat("/",s1,"/",s2)) as route | stats count(*) as requests, avg(target_processing_time)*1000 as avg_ms, pct(target_processing_time,90)*1000 as p90_ms, pct(target_processing_time,99)*1000 as p99_ms, max(target_processing_time)*1000 as max_ms by route | sort p99_ms desc | limit 15 ã¢ã¯ã»ã¹ãã°ãšãã«ã¹ãã§ãã¯ãã°ãçµã¿åãããã¿ãŒã²ããå¥ã®ä¿¡é Œæ§ SOURCE logGroups() | filterIndex @data_source_name in ["aws_alb"] | filterIndex @data_source_type in ["access","health_check"] | fields coalesce(target_port, target_addr) as target | filter ispresent(target) | parse elb /^app\/(?[^\/]+)/ | stats count(request_line) as requests, sum(elb_status_code >= 500) as errors_5xx, sum(elb_status_code >= 500)*100.0/count(request_line) as error_pct, pct(target_processing_time,99)*1000 as p99_ms, count(status) as probes, sum(status = "FAIL") as probe_failures by lb, target | sort probe_failures desc, errors_5xx desc | limit 20 ãã°ã¢ã©ãŒã ã§ ALB ã®ãã«ã¹ãã§ãã¯å€±æãéç¥ãã CloudWatch ãã°ã¢ã©ãŒã ã䜿ããšãã«ã¹ã¿ã ã¡ããªã¯ã¹ãçšæããªããŠããLog Analytics ã®ã¯ãšãªããçŽæ¥ã¢ã©ãŒã ãäœæã§ããŸããã¯ãšãªã¯ã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠå®è¡ãããéèšåŒãç®åºããæ°å€ãèšå®ãããããå€ãè¶
ãããšã¢ã©ãŒã ãçºçããŸãããã°ã¢ã©ãŒã 㯠Log Analytics ãšåãã¯ãšãªèšèªã䜿çšããã«ã¹ã¿ã ã¡ããªã¯ã¹ã®åã蟌ã¿ãä¿åã«ããã远å è²»çšãçºçããŸããã äŸ: ãã«ã¹ãã§ãã¯å€±æã«å¯Ÿããã¢ã©ãŒã CloudWatch ã³ã³ãœãŒã«ãéãã ã¢ã©ãŒã ã«ç§»åããŸãã ã¢ã©ãŒã ã®äœæ ãéžæãã ããŒã¿ãœãŒã¹ ãšã㊠ãã° ãéžæããŸãã Log Analytics ã§ã¯ãšãªãäœæãã ãã¯ãªãã¯ããŸãã 以äžã®ã¯ãšãªãå®è¡ãã ã¢ã©ãŒã ã«é²ã ãã¯ãªãã¯ããŸãã SOURCE logGroups() | filterIndex @data_source_name in ["aws_alb"] | filterIndex @data_source_type in ["health_check"] | filter status = "FAIL" | stats count(*) as probe_failures by elb éèšåŒ ã« SUM(probe_failures) ãå
¥åããŸãã ã¢ã©ãŒã ã®ç¶æ
ã§ ãã倧ãã ãéžæãã 0 ãå
¥åããŸãã ã¹ã±ãžã¥ãŒã« ã§å®è¡é »åºŠ (äŸ: rate(5 minutes) ) ãéžæããŸãã éå§æéãªãã»ãã ã 300 ç§ã«èšå®ããŸã (5 åééã®ã¹ã±ãžã¥ãŒã«ã«åãããŸã)ã ã¢ã©ãŒã ãå®è¡ããããŒã¿ãã€ã³ã ã 1 / 1 ã«èšå®ããæåã® 1 åã§æ€ç¥ããããã«ããŸãã éç¥çšã« Amazon SNS ãããã¯ãèšå®ããŸãã ãã°ã¢ã©ãŒã ãäœæ ãéžæããŸãã ããã§ã¢ã©ãŒã 㯠5 åããšã«ã¯ãšãªãè©äŸ¡ãããã«ã¹ãã§ãã¯ã®ãããŒããã²ãšã€ã§ã倱æãããšã¢ã©ãŒã ç¶æ
ã«ãªããŸãã (ãªãã·ã§ã³) æ©èœã®æ¡åŒµ ãããŸã§ã®æå¹åã«ãŒã«ãš CloudFormation ãã³ãã¬ãŒãã ãã§ããååã«äœ¿ãå§ããããŸãã以äžã§ã¯ãããã«æŽ»çšãããããŒã åãã®ãªãã·ã§ã³æ©èœã説æããŸãã ãã€ãã©ã€ã³ã§åãèŸŒã¿æã« ALB ãã°ããšã³ãªãããã CloudWatch Logs ãã€ãã©ã€ã³ ã¯ãåã蟌ã¿ã®æç¹ã§ ALB ã®ã¬ã³ãŒããåŠçããŸããããã«ããããã°ããã°ã°ã«ãŒãã«å±ãåã«ãã£ãŒã«ãããšã³ãªããããããå€æã»æŽåœ¢ãããã§ããŸãã ãã€ãã©ã€ã³ãäœæãã CloudWatch ã³ã³ãœãŒã« ãéãã åã蟌㿠> ãã€ãã©ã€ã³ ã«ç§»åããŸãã ãã€ãã©ã€ã³ãäœæ ãéžæããŸãã äžè¬èšå® ããŒãžã§æ¬¡ãèšå®ããŸãã ããŒã¿ãœãŒã¹ãéžæ ã§ AWS Application Load Balancer logs ãéžæããŸãã ãã°ãœãŒã¹ã¿ã€ã ã§ãšã³ãªããããããã°ã¿ã€ã (AccessãConnectionãHealth Check) ãéžæããŸãã Service access ã§ Auto create and use a new service role ãéžæããå¿
èŠãª IAM ããŒã«ã CloudWatch ã«äœæãããŸãã æ¬¡ãž ãéžæãããã€ãã©ã€ã³ã®éä¿¡å
ãšãã°ã°ã«ãŒãã®èšå®ãè¡ããŸãã ããã»ããµãèšå® ããŒãžã§ JSON ãè§£æ ããã»ããµãŒãéžæããŠè¿œå ããããŒã¿ã倿ããŸãã以äžã¯ ALB ãã°ã§åœ¹ç«ã€ããã»ããµãŒã®äŸã§ãã ã¿ã€ãã倿 (ãã¥ãŒããŒãã€ãã³ã) â elb_status_code ãæååããæŽæ°ã«å€æããŸããããã«ãããã¡ããªã¯ã¹ãã£ã«ã¿ãŒã§ã®æ°å€æ¯èŒ (äŸ: { $.elb_status_code >= 500 }) ãæ£ããè©äŸ¡ãããããã«ãªããŸãã GeoIP (ãšã³ãªãã) â client_ip ãã£ãŒã«ããåºã«å°çæ
å ± (åœ ISO ã³ãŒããéœåžåãASN ã®çµç¹å) ãã¬ã³ãŒãã«è¿œå ããçµæãæ°ãã client_geo ãã£ãŒã«ããžæžã蟌ã¿ãŸããæ¡ä»¶åŒ ( client_ip != "" ) ãæå®ããŠãclient_ip ãã£ãŒã«ãã空ã®ã¬ã³ãŒãã¯ã¹ãããããŸããå€éšã® IP åç
§ãµãŒãã¹ãä¿å®ããªããŠããããã©ãã£ãã¯ã¯ã©ãããæ¥ãŠããã®ãããã¯ãšãªã ãã§ç¢ºèªã§ããããã«ãªããŸãã 翻蚳 (ãã¥ãŒããŒãã€ãã³ã) â éçãããã³ã°ã䜿ã£ãŠãelb_status_code ã®å€ã人ãèªãã elb_status_meaning ãã£ãŒã«ãã«å€æããŸã (äŸ: 503 -> âno_registered_or_healthy_targetsâ)ãå®è¡æ¡ä»¶ ( elb_status_code != "" ã〠elb_status_code != "200" ) ã远å ããŠãšã©ãŒã¬ã¹ãã³ã¹ã®ãšãã ãåäœãããã°ãæåãããªã¯ãšã¹ãã«ã¯ãã®ãã£ãŒã«ããä»ããªãããããã€ãºãæããããŸãã å³ 7: JSONãè§£æãã¿ã€ãã倿ãGeoIP ããã»ããµãŒã远å ããããã»ããµãŒèšå®ç»é¢ Test processors ãéžæããä¿åããåã«ãµã³ãã«ã®ãã°ã€ãã³ãã§èšå®ãæ€èšŒããŸãã å
容ã確èªããŠãã€ãã©ã€ã³ãäœæããŸãã ALB ãã°ã 1 ã€ã®ã¢ã«ãŠã³ãã«éçŽãã è€æ°ã®ã¢ã«ãŠã³ãã«ãŸããã£ãŠã¯ãŒã¯ããŒããéçšããŠããå Žåã¯ã CloudWatch Logs ã®éçŽ (centralization) ã䜿ã£ãŠãè€æ°ã®ã¢ã«ãŠã³ããšãªãŒãžã§ã³ã®ãã°ã°ã«ãŒãã 1 ã€ã®éä¿¡å
ã¢ã«ãŠã³ãã«çµ±åã§ããŸããéçŽããããã°ã°ã«ãŒãã«ã¯ @aws.account ãš @aws.region ã®ãã£ãŒã«ããä»å ãããããããã©ãããã©ãŒã ããŒã 㯠1 ãæãããã¹ãŠã®ç°å¢ããŸãšããŠã¯ãšãªã§ããŸãã è©³çŽ°ãªæé 㯠Amazon CloudWatch Logs ã®äžå
åã䜿çšãããã°ç®¡çã®ç°¡çŽ å ãåç
§ããŠãã ããã Contributor Insights Contributor Insights ã¯ããããã¿ãŒã³ã«å¯äžããŠããäžäœ N ä»¶ã®èŠå ãç¶ç¶çã«ã©ã³ãã³ã°ããŸãããã³ãã¬ãŒãã¯æ¬¡ã® 2 ã€ã®ã«ãŒã«ãäœæããŸãã ã«ãŒã« ããŒãã£ãŒã«ã ã©ã³ãã³ã°å¯Ÿè±¡ TopClientIPs-ConnectionLogs $.client_ip æ¥ç¶æ°ã®å€ãã¯ã©ã€ã¢ã³ã IP ã®äžäœ (æ¥ç¶ãã°ãã) TopTargetsByRequests-AccessLogs $.target_port ãªã¯ãšã¹ãéã®å€ãã¿ãŒã²ããã®äžäœ (ã¢ã¯ã»ã¹ãã°ãã) äžäœã¯ã©ã€ã¢ã³ã IP ã®ã«ãŒã«ãæåã§äœæããæé ã¯æ¬¡ã®ãšããã§ãã CloudWatch ã³ã³ãœãŒã« ãéãã ãã° > Contributor Insights ã«ç§»åããŸãã ããã Contributor Insights ãã¡ãã¥ãŒã«ãªãå Žå㯠ãã° > ãã°åæ ãéžæãã ãªããã¢ãŠã (Log insights) ãã¯ãªãã¯ããŠãã ãããïŒ ã«ãŒã« ãäœæ ãéžæããŸãã ãã°ã°ã«ãŒã ã§ ALB ã®ãã°ã°ã«ãŒã (äŸ: /aws/elb) ãéžæããŸãã ã«ãŒã«ã¿ã€ã ã§ ã«ã¹ã¿ã ã«ãŒã« ãéžæããŸãã ãã°ã®åœ¢åŒ ã§ JSON ãéžæããŸãã ã³ã³ããªãã¥ãŒã·ã§ã³ ã§æ¬¡ãèšå®ããŸãã ã㌠㫠$.client_ip ãå
¥åããŸãã ãã£ã«ã¿ãŒ ã远å ããŸãã äžèŽ ã« $.client_ip ãå
¥åããŸãã ç¶æ
ã« IsPresent ãéžæããŸãã å€ ã§ true ãéžæããŸãã éèš ã§ ã«ãŠã³ã ãéžæããŸãã æ¬¡ãž ãéžæããŸãã ã«ãŒã«å ã« ALB-TopClientIPs-ConnectionLogs ãå
¥åããŸãã æ¬¡ãž ãéžæããŸãã ã«ãŒã«ãäœæ ãéžæããŸãã å³ 8: 3 æéã®ãŠã£ã³ããŠã§æ¥ç¶æ°äžäœ 10 ä»¶ã®ã¯ã©ã€ã¢ã³ã IP ãã©ã³ãã³ã°ãã TopClientIPs-ConnectionLogs ã«ãŒã« ã¯ãªãŒã³ã¢ãã æéã®çºçãæ¢ããã«ã¯ã次ã®é åºã§ãªãœãŒã¹ãåé€ããŸãã åã蟌㿠> æå¹åã«ãŒã« ãããã¬ã¡ããªã«ãŒã«ãåé€ããŸãã ãã€ãã©ã€ã³ãäœæããå Žåã¯ã åã蟌㿠> ãã€ãã©ã€ã³ ããåé€ããŸãã CloudFormation ã¹ã¿ãã¯ãåé€ããŸã (ããã·ã¥ããŒããš Contributor Insights ã«ãŒã«ãåé€ãããŸã)ã ALB ã®ãã°ã°ã«ãŒããåé€ããããä¿ææéãçãèšå®ããŸãã ãŸãšã ALB ã®ã¢ã¯ã»ã¹ãã°ãæ¥ç¶ãã°ããã«ã¹ãã§ãã¯ãã°ãæ§é å JSON ãšã㊠CloudWatch Logs ãžçŽæ¥é
ä¿¡ãããããã«ãªããã¯ãŒã¯ããŒãã®å
¥å£ããªã¯ãšã¹ãåäœã»æ¥ç¶åäœã»ã¿ãŒã²ããåäœã§å¯èŠåã§ããããã«ãªããŸãããæå¹åã«ãŒã«ã 1 ã€äœæããã°ãAWS çµç¹å
ã®ãã¹ãŠã®ããŒããã©ã³ãµãŒãã«ããŒã§ããŸããLog Analytics ã¯ããŒããã©ã³ãµãŒã®é害ãšã¢ããªã±ãŒã·ã§ã³ã®é害ãåãåãããã°ã¢ã©ãŒã ã¯åé¡ãèµ·ãããšãã«éç¥ããContributor Insights ã¯ãã©ãã£ãã¯ã®å€§åãå ããã¯ã©ã€ã¢ã³ããšã¿ãŒã²ãããäžäœãã瀺ããŸãããã€ãã©ã€ã³ãããŒã¹åŠçã远å ã®ã€ã³ãã©ãå¿
èŠãããŸããã ãŸã㯠CloudWatch ã³ã³ãœãŒã«ãéã㊠åã蟌㿠> æå¹åã«ãŒã« ã«ç§»åããApplication Load Balancer åãã®ã«ãŒã«ãäœæããŠã¿ãŠãã ããã詳现㯠Amazon CloudWatch Logs ã®ããã¥ã¡ã³ããåç
§ããŠãã ããã èè
ã«ã€ã㊠Raviteja Sunkavalli Raviteja Sunkavalli 㯠Amazon Web Services ã®ã·ãã¢ã¯ãŒã«ãã¯ã€ãã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ãAIOps ãšçæ AI ã®ãªãã¶ãŒãããªãã£ãå°éãšããŠããŸããè€éã§åæ£ããã¯ã©ãŠãç°å¢ã«ãããŠãäžçäžã®ã客æ§ããªãã¶ãŒãããªãã£ãšã€ã³ã·ãã³ã管çã®ãœãªã¥ãŒã·ã§ã³ãå®è£
ã§ããããæ¯æŽããŠããŸããä»äºä»¥å€ã§ã¯ãã¯ãªã±ãããããããæ°ããæçã®ã¬ã·ãã詊ãããããŠéãããŠããŸãã Siva Guruvareddiar Siva Guruvareddiar 㯠AWS ã®ã·ãã¢ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ãã客æ§ãé«å¯çšæ§ã·ã¹ãã ãèšèšã§ããããæ¯æŽããããšã«æ
ç±ã泚ãã§ããŸãããã€ã¯ããµãŒãã¹ãã³ã³ããåããªãã¶ãŒãããªãã£ããµãŒãã¹ã¡ãã·ã¥ãã¯ã©ãŠãç§»è¡ãšãã£ãæè¡ã掻çšããŠãã©ãããã©ãŒã åºç€ãšå
éšã¢ãŒããã¯ãã£ãã¢ããã€ãºããã¯ã©ãŠããã€ãã£ããžã®ç§»è¡ãå éãããæ¯æŽãããŠããŸããLinkedIn: linkedin.com/in/sguruvar æ¬ããã°ã¯ 2026 幎 8 æ 25 æ¥ã«å
¬éããã Analyze Application Load Balancer Logs with Amazon CloudWatch Logs ã®æ¥æ¬èªèš³ã§ãã翻蚳ã¯ãã¯ãã«ã«ã¢ã«ãŠã³ããããŒãžã£ãŒã®æ¥å¹³ãè¡ããŸããã
ã¯ããã« åæïŒãšãŒãžã§ã³ãã®æ§æ 課é¡ïŒç»é¢ãé¢ãããšåçãæ¶ãã èšèšæ¹éïŒå®è¡ã®äœæãšè³Œèªãåé¢ãã DB ã¹ããŒãïŒæ®ãå±¥æŽãšå®è¡äžã®ç¶æ
ãåãã ä¿ååäœã¯ãAG-UI ã® Message 1 ä»¶ = 1 è¡ã DynamoDB ã§ã¯ãªã Aurora MySQL ãéžãã çç± äŒè©±å±¥æŽã¯ãµãŒããŒãçµã¿ç«ãŠã æžã蟌ã¿èšèšïŒã€ãã³ãã¯ä¿åãããçæéäžã®åçããäžæžããã ååæµïŒäŒè©±å
šäœã®ã¹ãããã·ã§ããã§è¿œãã€ã åæå®è¡å¶åŸ¡ïŒå®è¡äžããã¯ã NULL å¯ã®ãŠããŒã¯åã§äœã ããã¯ã®è§£æŸæŒãã«åãã 忢ïŒåæãšãã£ã³ã»ã«ãåºå¥ãã Redis ã¯èŠãã ãŸãšã ã¯ããã« éçºæ¬éš éçº1éšã® ãããŸã ã§ãã ç§ãã¡ã®ããŒã ã§ã¯ãWeb ã¢ããªã®æ°æ©èœãšããŠããã£ãã圢åŒã§ããŒã¿ãåæã§ãã AI ãšãŒãžã§ã³ããéçºäžã§ããéçºãé²ããäžã§ããåçã®çæäžã«ç»é¢ãé¢ãããšããã®åçãåãåããªããªããäŒè©±ãæ®ããªãããšãã課é¡ã«åãåãããšã«ãªããŸããã æ¬èšäºã§ã¯ããã®èª²é¡ã解決ããããã«è¡ã£ããäŒè©±å±¥æŽã®æ°žç¶åããšãããã¯ã°ã©ãŠã³ãå®è¡ãã®èšèšãšå®è£
ã玹ä»ããŸããDB ã¹ããŒãã»å®è£
ã³ãŒãã»æ€èšããŠæšãŠãæ¡ãŸã§å«ããŠæžããŸãã åæïŒãšãŒãžã§ã³ãã®æ§æ ãã®ãšãŒãžã§ã³ãã¯æ¬¡ã®æ§æã§åããŠããŸãã ãã©ãŠã¶ïŒãã£ãã UIïŒ â AG-UI ã€ãã³ãïŒSSEïŒ âŒ Next.jsïŒAPI Route ââ ãã©ãŠã¶ãš AgentCore ã®äžç¶åœ¹ïŒ â InvokeAgentRuntimeïŒSSEïŒ âŒ Amazon Bedrock AgentCore RuntimeïŒStrands Agents 補ãšãŒãžã§ã³ãïŒ â MCP ⌠MCP ãµãŒããŒïŒèªç€ŸããŒã¿ã®æ€çŽ¢ã»éèšããŒã«çŸ€ïŒ Amazon Bedrock AgentCore : AI ãšãŒãžã§ã³ãã®å®è¡åºç€ãšãªã AWS ã®ãµãŒãã¹ã§ããã»ãã·ã§ã³ããšã« microVM åäœã§å®è¡ç°å¢ãåé¢ãããŸãã Strands Agents : AWS ãå
¬éããŠãããªãŒãã³ãœãŒã¹ã® AI ãšãŒãžã§ã³ã SDK ã§ãã AG-UI : ãšãŒãžã§ã³ããšããã³ããšã³ãéã®ã€ãã³ãã¹ããªãŒãã³ã°ã®ãããã³ã«ã§ãã RUN_STARTED ã» TEXT_MESSAGE_CONTENT ã» TOOL_CALL_* ã» RUN_FINISHED ãªã©ã®ã€ãã³ãåãå®ããŠããŸããè»¢éæ¹æ³ã¯ SSE ã«éå®ãããŸãããããã®ã¢ããªã§ã¯ SSE ã§æµããŠããŸãã ãŠãŒã¶ãŒã質åãéããšããšãŒãžã§ã³ãã MCP ããŒã«ã§ããŒã¿ãååŸã»åæããåçãã¹ããªãŒãã³ã°ã§è¿ããŸããããŒã«ãç¹°ãè¿ãåŒã¶ããã1 åã®åçã«æ°åç§ãããããšããããŸãã 課é¡ïŒç»é¢ãé¢ãããšåçãæ¶ãã AI ãã£ããã§åºã䜿ãããã®ã¯ãPOST + ã¹ããªãŒãã³ã°å¿çãã®æ§æã§ãããã©ãŠã¶ã質åã POST ãããµãŒããŒãçæã€ãã³ããæµããç»é¢ã«é次衚瀺ããŸããç»é¢é¢è±ãæ³å®ããªããã°ãããã§ååã«æ©èœããŸããç§ãã¡ã®åæå®è£
ããã®æ§æã§ããã ç§ãã¡ã®å Žåã¯åçã«æ°åç§ãããããããçæäžã«ç»é¢ãé¢ããŠãå®è¡ã¯å®èµ°ããŠã»ããããšããèŠä»¶ãå ãããŸããããã®èŠä»¶ãæºããããšãããšã3 ç®æãåé¡ã«ãªããŸãã æ¹ä¿®åã®æ§é ãç»é¢é·ç§»ããç¬éã«ã以éã®ã€ãã³ããåãåãææ®µããªããªã 1 ã€ç®ã¯ããã³ããšã³ãã§ãã ãã®æ§æã§ã¯ããã£ããç»é¢ã® hook ã unmount æã«å®è¡ãäžæïŒ abortRun() ïŒããäœãã«ãªããã¡ã§ããç»é¢é·ç§»ããã®ãŸãŸå®è¡äžæã«ãªããŸãã // ãã£ããç»é¢ã® hookïŒunmount æã«å®è¡ãäžæããäœãïŒ useEffect( () => () => { stopRequestedRef. current = true ; agentRef. current ?.abortRun(); } , [] , ); 2 ã€ç®ã¯äžç¶åœ¹ã® API Route ã§ãã ãã©ãŠã¶ãš AgentCore ã®éã§ SSE ãäžç¶ãã Next.js ã® API Route ã¯ãã¯ã©ã€ã¢ã³ãã®åæãäžæµã® AgentCore ãžã®èªã¿åããã£ã³ã»ã«ãšããŠäŒæããŸãã ReadableStream ã® cancel() ã¯ãã¯ã©ã€ã¢ã³ããããèªãŸãªãããšãã«åŒã°ããã³ãŒã«ããã¯ã§ãããã§äžæµã®èªã¿åããæ¢ãããšãåæãšãã£ã³ã»ã«ã®åºå¥ããªããªããŸãã // äžç¶åŠçïŒã¯ã©ã€ã¢ã³ããåãããšäžæµã®èªã¿åããæ¢ãŸãäœãïŒ const readable = new ReadableStream( { async start ( controller ) { // äžæµïŒAgentCoreïŒã® SSE ãèªã¿ããã®ãŸãŸã¯ã©ã€ã¢ã³ããžäžç¶ãã } , cancel () { reader.cancel(); } , } ); 3 ã€ç®ã¯ä¿åå
ã§ãã ã€ãã³ãã¯äžç¶ãããã ãã§ãã©ãã«ãä¿åãããŸããã仮㫠1 ã€ç®ãš 2 ã€ç®ãçŽããŠå®è¡ãå®èµ°ããããã«ããŠããæ»ã£ãŠããç»é¢ã«è¡šç€ºããããŒã¿ããããŸããã ãå®è¡ç¶æ
ã React ã®ã°ããŒãã«ã¹ãã¢ã«æãŠã°ãç»é¢é·ç§»ã«èããããã®ã§ã¯ããšããæ¡ãæ€èšããŸãããããããã®ã¢ããªã§ã¯ããã£ããç»é¢ããä»ã®ç»é¢ãžã®é·ç§»ã window.location.href ã«ããããŒãžå
šäœã®åèªã¿èŸŒã¿ã§å®è£
ãããŠããŸããåèªã¿èŸŒã¿åŸã®ããŒãžã¯ JavaScript ã®å®è¡ç°å¢ããšæ°ããäœããããããReact ã® state ãã°ããŒãã«ã¹ãã¢ã«å
¥ããå€ã¯åŒãç¶ãããŸããã èšèšæ¹éïŒå®è¡ã®äœæãšè³Œèªãåé¢ãã 倧ããå€ããã®ã¯æ¬¡ã® 3 ã€ã§ãã äœæãšè³Œèªã®åé¢ : POST /runs ã¯å®è¡ãéå§ã㊠202 { runId } ãå³åº§ã«è¿ããŸãã衚瀺㯠GET /runs/{runId}/events ã® SSE ã§åãåããŸãããã®ãSSE ãåä¿¡ãç¶ããããšãããæ¬èšäºã§ã¯ã賌èªããšåŒã³ãŸãã賌èªã¯ãã€åããŠããããäœåºŠã§ãåéã§ããŸãã å®è¡ã¯ãŒã«ãŒã®ç¬ç« : AgentCore ã® SSE ãæåŸãŸã§èªã¿åã£ãŠèšé²ããåŠçïŒå®è¡ã¯ãŒã«ãŒïŒããHTTP ã¬ã¹ãã³ã¹ããç¬ç«ããéåæã¿ã¹ã¯ã«ããŸããããã©ãŠã¶ãåæããŠãå®è¡ã¯å®èµ°ããŸãã äºå±€ã®ä¿å : å®è¡äžã¯ãçæéäžã®åçãã DB ã«äžæžãä¿åãç¶ããå®äºããã宿ããã¡ãã»ãŒãžã DB ã®å±¥æŽããŒãã«ã«ä¿åããŸããããŒãã«æ§æã¯æ¬¡ã®ç¯ã§èª¬æããŸãã ãªããå®è¡ã¯ãŒã«ãŒã¯ Next.js ãšåãããã»ã¹å
ã§åãããŠããããããªã¯ãšã¹ãããšã«å®è¡ç°å¢ãçµäºãããµãŒããŒã¬ã¹ç°å¢ã§ã¯ãã®åœ¢ã¯åããŸãããçŸåšã¯æ€èšŒæ®µéã®ãããã®æ§æã«ããŠããŸãããNext.js ã®ãããã€ã«èµ°è¡äžã®å®è¡ãå·»ã蟌ãŸããªãããã«ãããããæ¬æ¥ã¯å®è¡ã¯ãŒã«ãŒãç¬ç«ããããã»ã¹ã«åãåºãæ¹ãæãŸãããšèããŠããŸããçŸç¶ãããã»ã¹ããããã€ãªã©ã§æ¢ãŸãå Žåã®åŸå§æ«ã¯ãåæå®è¡å¶åŸ¡ã®ç¯ã§èª¬æããååã®ä»çµã¿ãæ
ããŸãã æ¹ä¿®åŸã®æ§é ãå®è¡ã¯æ¥ç¶ãšç¡é¢ä¿ã«å®èµ°ãã賌èªã¯äœåºŠã§ãåå
¥å Žã§ãã ãã©ãŠã¶ãšãµãŒããŒã®éã® API ã¯æ¬¡ã® 5 æ¬ã§ãã API åœ¹å² POST /runs å®è¡ãäœæã㊠202 { runId, conversationId } ãå³è¿ã GET /runs/{id}/events SSE 賌èªãåæã»åå
¥å Žãèªç± POST /runs/{id}/cancel æç€ºçãªãã£ã³ã»ã« GET /conversations äŒè©±äžèЧïŒå±¥æŽãµã€ãããŒçšïŒ GET /conversations/{id} äŒè©±ã®å
šã¡ãã»ãŒãž + å®è¡äžã® runïŒããã°ïŒ æåŸã® API ããã€ã³ãã§ãããªããŒããå¥ã¿ãã§äŒè©±ãéããçŽåŸãã¯ã©ã€ã¢ã³ãã¯äŒè©± ID ããç¥ãããå®è¡äžã® run ããããã©ãããåãããŸãããããã§ GET /conversations/{id} ã¯ãäŒè©±ã®ã¡ãã»ãŒãžã«å ããŠãå®è¡äžã® run ã® IDããè¿ããŸããã¯ã©ã€ã¢ã³ãã¯ãã® ID ã§ GET /runs/{id}/events ã賌èªããçæéäžãã衚瀺ãåéããŸãã DB ã¹ããŒãïŒæ®ãå±¥æŽãšå®è¡äžã®ç¶æ
ãåãã ãã®ã¢ããªã§ã¯ä»¥åãããæ¬äœæ©èœã®ããŒã¿ã Aurora MySQL 8.0 + Prisma ã§ç®¡çããŠããŸãããšãŒãžã§ã³ãã®å±¥æŽãåã DB ã«ã3 ã€ã®ããŒãã«ã§æã€ããšã«ããŸããããã£ãšæ®ããå±¥æŽããšãå®è¡äžã ã䜿ããå®è¡ç¶æ
ãã§ããŒãã«ãåããŠããŸãã åºå ããŒãã« åœ¹å² è¡ã®æ±ã å±¥æŽ conversations äŒè©±ã¹ã¬ãã 1 ä»¶ã®ã¡ã¿æ
å ± ãã£ãšæ®ã å±¥æŽ conversation_messages ã¡ãã»ãŒãž 1 ä»¶ = 1 è¡ã宿ããçºè©±ãä¿å ãã£ãšæ®ã å®è¡ç¶æ
runs å®è¡ 1 åã®ç¶æ
+ çæéäžã®åç + ãã㯠è¡ã¯å®è¡ 1 åããšã«å¢ããçµäºåŸãèšé²ãšããŠæ®ããçæéäžã®åçãããã¯ã¯å®è¡äžã ã䜿ã ER å³ Prisma ã¹ããŒãã¯æ¬¡ã®éãã§ããå®éã«æ¡çšãããã®ãããã¿ã€ã ã¹ã¿ã³ãåã»ãªã¬ãŒã·ã§ã³å®çŸ©ã»enum å®çŸ©ïŒRunStatus / MessageStatusïŒãçããŠããŸãã model Conversation { id String @id @default(cuid()) companyId Int @map("company_id") userId String @map("user_id") threadId String @map("thread_id") @db.Char(36) title String @db.VarChar(255) deletedAt DateTime? @map("deleted_at") @@unique([companyId, userId, threadId]) @@map("conversations") } model ConversationMessage { id String @id @default(cuid()) conversationId String @map("conversation_id") runId String? @map("run_id") sequence Int role String @db.VarChar(16) parts Json status MessageStatus @default(complete) @@unique([conversationId, sequence]) @@map("conversation_messages") } model Run { id String @id @default(cuid()) conversationId String @map("conversation_id") clientTurnId String @map("client_turn_id") @db.VarChar(64) status RunStatus @default(queued) lockKey String? @unique @map("lock_key") ownerInstanceId String? @map("owner_instance_id") @db.VarChar(64) errorCode String? @map("error_code") @db.VarChar(64) partialState Json? @map("partial_state") heartbeatAt DateTime @default(now()) @map("heartbeat_at") @@unique([conversationId, clientTurnId]) @@index([status, heartbeatAt]) @@map("runs") } lockKey ã® UNIQUEã clientTurnId ã®è€åãŠããŒã¯ã [status, heartbeatAt] ã®ã€ã³ããã¯ã¹ãããããäœã®ããã«ãããã¯ãåŸã®ç¯ã§é ã«èª¬æããŸãã ãŸããæ¬èšäºã«ã¯ 4 çš®é¡ã® ID ãç»å ŽããŸããããã§æŽçããŠãããŸãã ID äœãæãã conversationId DB äžã®äŒè©±ãAPI ã§äŒè©±ãæããšãã«äœ¿ã threadId AG-UI äžã®äŒè©± IDãDB äžã®äŒè©±ïŒ conversationId ïŒãš 1 察 1 ã§å¯Ÿå¿ runId 質å 1 åã¶ãã®å®è¡ runtimeSessionId AgentCore ã®å®è¡ç°å¢ãæãã IDã t{companyId}-u{userId}-{threadId} ã®åœ¢åŒã§ãäŒè©±ããšã«åºå® ä¿ååäœã¯ãAG-UI ã® Message 1 ä»¶ = 1 è¡ã conversation_messages ã¯è¿œèšå°çšã§ãAG-UI ã® Message ããã®ãŸãŸ parts ïŒJSONïŒã«æ ŒçŽããŸããããã¹ãã ãã®ã¿ãŒã³ã¯ user / assistant ã® 2 è¡ãããŒã«ã䜿ãã¿ãŒã³ã¯ assistantïŒããŒã«åŒã³åºãïŒãš toolïŒçµæïŒã®è¡ãæãŸã£ãŠ 4 è¡ä»¥äžã«ãªããŸãã 1 äŒè©±ã®ã¡ãã»ãŒãžè¡ã®äŸãããŒã«ã䜿ãã¿ãŒã³ã¯ userã»assistantïŒããŒã«åŒã³åºãïŒã»toolã»assistant ã® 4 è¡ã䜿ããªãã¿ãŒã³ã¯ 2 è¡ã«ãªã ãã®ä¿ååäœãéžãã çç±ã¯ãããã³ãã®è¡šç€ºããžãã¯ã®äœãã«ãããŸããã©ã€ã衚瀺ã¯ãAG-UI ã® Message é
åãåãåããã¿ãŒã³ã®åºåããããŒã«ã®å®è¡ã¹ããã衚瀺ãçµã¿ç«ãŠãçŽç²é¢æ°ããšããŠèªåã§å®è£
ããŠããŸããä¿åãã Message åããã®ãŸãŸãã®é¢æ°ã«æž¡ãã°ãç»é¢ãé¢ããªãã£ãå Žåãšåäžã®è¡šç€ºãåçŸãããŸããä¿åæã«è¡šç€ºçšã®åœ¢ãžå å·¥ããŠããŸããšãåã衚瀺ãåçŸã§ããªããªããŸãã DynamoDB ã§ã¯ãªã Aurora MySQL ãéžãã çç± äŒè©±å±¥æŽã®ã¢ã¯ã»ã¹ãã¿ãŒã³ïŒäŒè©± ID + é£çªã§é ã«å
šä»¶ååŸã远èšå°çšãJSON äž»äœïŒã¯ DynamoDB ã®åŸæé åã§ãå®éã«ç§»è¡æ¡ãæ€èšããŸãããããã§ã Aurora MySQL äžæ¬ã«ããŠããŸãã ãŸãããã©ã³ã¶ã¯ã·ã§ã³èŠä»¶ãæ§æã®éžæè¢ãçµããŸãã質åã®å仿ã«ã¯ãäŒè©± + user ã¡ãã»ãŒãž + å®è¡ïŒããã¯ïŒã® INSERTãããå®äºæã«ã¯ãassistant ã¡ãã»ãŒãžã® INSERT + å®è¡ã®å®äº + ããã¯è§£æŸãããããããåäžãã©ã³ã¶ã¯ã·ã§ã³ã§è¡ãå¿
èŠããããŸãããå±¥æŽã¯ DynamoDBãå®è¡ç¶æ
㯠Auroraãã®ããã« 2 ã€ã®ã¹ãã¢ã«åãããšããã®ååæ§ãä¿èšŒã§ããŸãããååæ§ãç¡ããšãããšãã°æ¬¡ã®ãããªå£ãæ¹ãããŸãã åçã¯æ®ã£ãã®ã«æ¬¡ã®è³ªåãã§ããªã : å®äºåŠçã®ãåçãä¿åããšãããã¯è§£æŸãã®éã§ããã»ã¹ãèœã¡ããšãç»é¢ã«ã¯åçãåºãŠããã®ã« DB ã¯ããã¯ãæ¡ã£ããŸãŸã«ãªããæ¬¡ã®è³ªåããå®è¡äžã§ãããšæåŠããç¶ããŸãã çãã®ãªã質åãå±¥æŽã«æ®ã : éä¿¡ã®äºåºŠæŒãã§ 2 æ¬ç®ãã質åãä¿å â ããã¯ã§åŒŸããããã®é ã«é²ããšã誰ãåçããªã質åã ããå±¥æŽã«æ®ããŸãã1 ãã©ã³ã¶ã¯ã·ã§ã³ãªãããã¯ååŸã®å€±æãšåæã«è³ªåã®ä¿åãåãæ¶ããããšã©ãŒå¿çã ããè¿ããŸãã ãããã£ãŠéžæè¢ã¯ãå
šéš Auroraãããå
šéš DynamoDBãã«çµãããŸããåŸè
ãæè¡çã«ã¯æç«ããŸãïŒDynamoDB ã§ã TransactWriteItems ã§è€æ°ã®é
ç®ããŸãšããŠååçã«æžããŸãïŒã ããã§ã Aurora ã«ããã®ã¯ãæ¢åã®éçšãšã®äžè²«æ§ã®ããã§ãããã®ã¢ããªã®ä»ã®ããŒã¿ã¯ãã¹ãŠ Aurora + Prisma ã§ç®¡çããŠããŠããã€ã°ã¬ãŒã·ã§ã³ã®æé ãã¬ãã¥ãŒã®èгç¹ãšãã£ãããŒã ã®éçšãããã§æã£ãŠããŸããããŒã¿ã¹ãã¢ã 2 ã€ã«ãããšããã®éçšã 2 系統ã«ãªããŸããèŠæš¡ã®é¢ã§ããDB ãžã®æžã蟌ã¿ã¯ããŒã¯ã§ãæ¯ç§æ°ååã®èŠç©ããã§ãAurora ã§ååã«åããããŸããDynamoDB ã®ã¹ã±ãŒã«æ§èœãå¿
èŠã«ãªãæ°Žæºã§ã¯ãããŸããã äŒè©±å±¥æŽã¯ãµãŒããŒãçµã¿ç«ãŠã ãšãŒãžã§ã³ãã¯æ¯åã®åŒã³åºãã§äŒè©±ã®å
šå±¥æŽãåãåããç¶æ
ããŒãããçµã¿ç«ãŠçŽãäœãã«ããŠããŸãããã®å
šå±¥æŽã誰ãçšæãããã«ã¯ 2 ã€ã®åœ¢ããããŸããã¯ã©ã€ã¢ã³ããæå
ã® Message é
åãæ¯åéããã ãµãŒããŒã DB ããçµã¿ç«ãŠã ãã§ããç§ãã¡ã¯åŸè
ã«ããŸãããã¯ã©ã€ã¢ã³ããéãã®ã¯æ°ããã¡ãã»ãŒãž 1 ä»¶ã ãã§ãã åè
ãé¿ããçç±ã¯ãããã¯ã°ã©ãŠã³ãå®è¡ãšçžæ§ãæªãããã§ããå®è¡ãæŸçœ®ããŠå¥ã®ã¿ãã§å®èµ°ããããšãå
ã®ã¿ããæã£ãŠããå±¥æŽã¯å€ããŸãŸã«ãªããŸãããã®å€ãã¿ãããæ¬¡ã®è³ªåãå±¥æŽããšéããšãå®èµ°ããã¯ãã®åçãã¢ãã«ãžã®å
¥åããæãèœã¡ãäŒè©±ã®ã€ãã€ãŸãåããªããªããŸããåŸè¿°ããããã¯ã¯å®è¡äžããå¹ããªãããããã®äºæ
ã¯é²ããŸãããææ°ã®äŒè©±ãåžžã«æã£ãŠããã®ã¯ DB ã ãã§ãã ãªããAgentCore åŽã«äŒè©±ã®ç¶æ
ãæãããæ¡ã 2 ã€æ€èšããèŠéããŸããã å®è¡ç°å¢ïŒmicroVMïŒã®ã¡ã¢ãªã«æã€ : ã»ãã·ã§ã³ ID ã¯äŒè©±ããšã«åºå®ãªã®ã§ãåãäŒè©±ã®åŒã³åºãã¯åãå®è¡ç°å¢ã«å±ããã¡ã¢ãªã«ç¶æ
ãæ®ãããšèªäœã¯ã§ããŸãããã ããã®ç°å¢ã¯ç¡æäœ 15 åïŒããã©ã«ãïŒãªã©ã§çµäºããã¡ã¢ãªããšæ¶ããŸããæéã空ããŠç¶ãäŒè©±ã®çœ®ãå Žã«ã¯ã§ããŸãã Memory ãµãŒãã¹ã«æã€ : AgentCore ã«ã¯äŒè©±ãä¿åãã Memory ãšãããµãŒãã¹ããããŸãããã ãå±¥æŽã¯ã©ã®ã¿ã¡è¡šç€ºã®ããã«èªåã® DB ãžä¿åããã®ã§ãè¶³ããšåã圹å²ã®ä¿åå
ã 2 ã€ã«ãªããŸã POST /runs ã®ããã£ã¯ { conversationId, message, clientTurnId } ã ãã§ããã¢ãã«ãžæž¡ãå±¥æŽã¯ãå®è¡ã¯ãŒã«ãŒã Aurora ããçµã¿ç«ãŠãŸãã // å®è¡ã¯ãŒã«ãŒã®äžéšïŒDB ããäŒè©±å±¥æŽãèªã¿åºããã¢ãã«å
¥åçšã«æŽãã export async function buildModelMessages ( conversationId : string ): Promise < ModelMessagesResult > { const rows = await prisma.conversationMessage.findMany( { where : { conversationId , status : "complete" } , orderBy : { sequence : "asc" } , select : { parts : true } , } ); return normalizeHistory(rows); } // å®è¡ã¯ãŒã«ãŒã®äžéšïŒçµã¿ç«ãŠãå±¥æŽããšãŒãžã§ã³ãã«æž¡ããŠçæãéå§ãã const history = await buildModelMessages(claimed.conversationId); const { companyId , userId , threadId } = claimed.conversation; const agent = new AgentCoreAgent( { threadId , initialMessages : history .messages, agentArn , runtimeUserId : `c ${ companyId } :u ${ userId } ` , runtimeSessionId : `t ${ companyId } -u ${ userId } - ${ threadId } ` , } ); ãããããšãäŒè©±ã®å
容ã¯ãµãŒããŒïŒDBïŒã ããæã€æ§é ã«ãªããŸããAgentCore ã® microVM ãã¿ã€ã ã¢ãŠãã§çµäºããŠããã¯ã©ã€ã¢ã³ãããªããŒãã§ç¶æ
ã倱ã£ãŠããäŒè©±ã¯ Aurora ããåæ§æã§ããŸãã æžã蟌ã¿èšèšïŒã€ãã³ãã¯ä¿åãããçæéäžã®åçããäžæžããã 1 åã®åçã§ AG-UI ã€ãã³ãã¯æ°åãæ°çŸåæµããŸããæ¬æã®æçïŒãã«ã¿ïŒ1 〠1 ã€ãããŒã«åŒã³åºããããããã€ãã³ãã«ãªããããåçãé·ãã»ã©å¢ããŸããããã 1 è¡ã〠INSERT ãããšã1 åçããšã«å€§éã®è¡ãæ°žä¹
ã«ç©ã¿äžãããŸããæ¡çšããã®ã¯æ¬¡ã®åœ¢ã§ãã æç¹ DB æäœ å
容 質åéä¿¡ INSERT conversations ã«äŒè©±ïŒæ°èŠäŒè©±ã®ãšãã®ã¿ïŒã conversation_messages ã«è³ªåã runs ã«å®è¡ã¬ã³ãŒãïŒããã¯ååŸãå
ŒããïŒã®æå€§ 3 è¡ çæäž runs.partial_state ãäžæžã UPDATE AG-UI ã®ã€ãã³ãã§ã¯æ¬æã现åãïŒãã«ã¿ïŒã§å±ããå®è¡ã¯ãŒã«ãŒã¯ãããã€ãªãåãããããã®æç¹ã®ã¡ãã»ãŒãžé
åããä¿æããŠããããããæ°ç§ããšã«åã 1 è¡ãžäžæžãä¿åãè¡ã¯å¢ããªã å®äº conversation_messages ã« INSERT ãã®ã¿ãŒã³ã§çãŸããã¡ãã»ãŒãžïŒåçãããŒã«ã䜿ã£ãå Žåã¯ãã®åŒã³åºããšçµæãïŒãä¿åã runs.partial_state ã空ã«ããããã¯ãè§£æŸ è³ªåéä¿¡æã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ä»¥äžã®ããã«ãªã£ãŠããŸããããã¯ïŒ lockKey ïŒã®ååŸãšè³ªåã®ä¿åããåæã«æç«ãããåæã«å€±æãããã®ã©ã¡ããã«ãªããŸãã // API Route ã®äžéšïŒè³ªååä»æã®æžã蟌㿠return prisma.$transaction( async ( tx ) => { const conversationId = existingId ?? ( await tx.conversation.create( { /* çç¥ */ } )).id; // ããã¯ååŸã«å€±æããããäžã§ä¿åãã質åããšåãæ¶ãããïŒåäžãã©ã³ã¶ã¯ã·ã§ã³ã®ããïŒ const run = await tx.run.create( { data : { conversationId , clientTurnId , lockKey : conversationId } , select : { id : true } , } ); // aggregateïŒéèšã¯ãšãªïŒã§äŒè©±å
ã®æå€§ sequence ãåããæ¬¡ã®é£çªãæ¯ã const highest = await tx.conversationMessage.aggregate( { where : { conversationId } , _max : { sequence : true } , } ); await tx.conversationMessage.create( { data : { conversationId , runId : run. id , sequence : (highest._max.sequence ?? 0 ) + 1 , role : "user" , parts : { id : randomUUID(), role : "user" , content : message } , } , select : { id : true } , } ); return { runId : run. id , conversationId } ; } ); çæäžã® partial_state 㯠3 ç§ééã§éåŒããŠæžããŸããéåŒãã«å ããŠãåã® UPDATE ãå®äºãããŸã§ã次㮠UPDATE ãçºè¡ããªãããšããå¶åŸ¡ãå
¥ããŠããŸããUPDATE ãçºè¡ããé ãš DB ã«åæ ãããé ã¯äžèŽãããšã¯éããªããããå€ãå
容㮠UPDATE ãæ°ããå
容ã®åŸã«é©çšããããšãä¿åæžã¿ã®ãçæéäžã®åçããå·»ãæ»ã£ãŠããŸãããã§ãã // å®è¡ã¯ãŒã«ãŒã®äžéšïŒçæéäžã®åçãæ°ç§ããšã« DB ãžäžæžãä¿åãã const PARTIAL_STATE_INTERVAL_MS = 3_000 ; return { schedule() { // åã®æžã蟌ã¿ãå®äºãããŸã§æ¬¡ãã¹ã±ãžã¥ãŒã«ããªãïŒå€ãå
容ãžã®å·»ãæ»ããé²ãïŒ if (timer || writing || truncated) return ; timer = setTimeout (() => { timer = null ; writing = true ; void writePartialState(runId, ownerInstanceId, produced()) . then (( state ) => { truncated = state.truncated; } ) . catch (( error : unknown ) => console .error( "partial_state ã®æŽæ°ã«å€±æããŸãã" , { runId , error } ), ) . finally (() => { writing = false ; } ); } , PARTIAL_STATE_INTERVAL_MS); } , } ; æ°ç§ããã« UPDATE ãçºè¡ãç¶ã㊠DB ã®è² è·ã¯å€§äžå€«ãªã®ãããšããç¹ã¯æ€èšããŸãããçµè«ãšããŠã¯ãåæã«èµ°ãçæãå€ããŠãæ°åæ¬ãšããèŠæš¡ã§ã¯åé¡ã«ãªããŸãããæŽæ°ã¯åå®è¡ãèªåã® 1 è¡ã ããäž»ããŒæå®ã§è¡ããå®è¡éã®ããã¯ç«¶åã¯ãããŸãããããã«ãæ¥ç¶äžã®ãŠãŒã¶ãŒã®ç»é¢ãžã¯å®è¡ã¯ãŒã«ãŒãã¡ã¢ãªäžã®ã€ãã³ããçŽæ¥æµãããã partial_state ã®çšéã¯åŸè¿°ããååæµã ãã§ããæ¯ç§æžãå¿
èŠããã€ãã³ãã 1 åãã€æžãå¿
èŠããããŸããã å®äºæã¯ãåçã®ç¢ºå®ä¿åããå®è¡ã¹ããŒã¿ã¹ã®å®äºãžã®æŽæ°ããããã¯è§£æŸããçæéäžã®åçïŒ partial_state ïŒã®åé€ãã 1 ãã©ã³ã¶ã¯ã·ã§ã³ã§è¡ããŸãã // å®è¡ã¯ãŒã«ãŒã®äžéšïŒå®äºæã®æžã蟌ã¿ãlock_key ãå€ãæãããšãã®äŒè©±ãæ°žä¹
ã« 409 ã«ãªã return prisma.$transaction( async ( tx ) => { const claimed = await tx.run.updateMany( { where : terminableWhere(runId, ownerInstanceId), data : { status , errorCode , finishedAt : new Date (), lockKey : null , partialState : Prisma.DbNull, } , } ); // å¥ã®çµè·¯ïŒãã£ã³ã»ã«ããåŸè¿°ããç°åžžçµäºæã®åååŠçïŒãå
ã«ãã®å®è¡ã // çµããããŠããããçæç©ã¯ä¿åããªã if (claimed. count === 0 ) return false ; await tx.conversationMessage.createMany( { data : messages. map (( message , index ) => ( { conversationId : targetId, runId , sequence : base + index + 1 , role : message.role, parts : message as Prisma.InputJsonValue , status : messageStatusAt( status , message. id , openMessageIds), } )), } ); return true ; } ); ã¡ãã»ãŒãžã® status ã¯éåžž complete ã§ä¿åããŸãããã£ã³ã»ã«ããšã©ãŒã§å®è¡ãæ£åžžã«çµãããªãã£ãå Žåã¯ããããŸã§ã«çæã§ããŠããåã partialïŒéšåçãã®æå³ïŒãšããŠä¿åããç»é¢ã«æ®ããããã«ããŠããŸãã ååæµïŒäŒè©±å
šäœã®ã¹ãããã·ã§ããã§è¿œãã€ã å®è¡äžã®äŒè©±ã«è³Œèªè
ãå
¥ã£ãŠãããšããµãŒããŒã¯ãŸã RUN_STARTED ïŒãå®è¡ãé²è¡äžã§ããã®åå³ïŒãš MESSAGES_SNAPSHOT ãéããŸããã©ã¡ããäžæµããå±ããã€ãã³ãã®äžç¶ã§ã¯ãªãããã®è³Œèªã®ããã«ãµãŒããŒãæ°ããäœã£ãŠéããã®ã§ãã MESSAGES_SNAPSHOT ãåãåã£ãã¯ã©ã€ã¢ã³ãã¯ãæå
ã®ã¡ãã»ãŒãžäžèŠ§ãæšãŠãŠãã¹ãããã·ã§ããã®å
容ã§äžžããšçœ®ãæããŸãããã®ãããã¹ãããã·ã§ããã«çæéäžã® 1 ä»¶ã ããå
¥ãããšãéå»ã®ã¡ãã»ãŒãžãç»é¢ãããã¹ãŠæ¶ããŠããŸããŸããå¿
ãäŒè©±ã®å
šã¡ãã»ãŒãžãå
¥ããŠéããŸãã ãã®åŸã®é
信㯠2 ã€ã®ã¢ãŒãã«åãããŸããåããç®ã¯ã賌èªããã€å§ãŸã£ãããã§ãã ã¢ãŒã ãã€äœ¿ãããã é
ä¿¡å
容 live 質åã®éä¿¡çŽåŸãã賌èªããŠããå ŽåïŒçæã€ãã³ãããŸã 1 ä»¶ãæµããŠããªããã¡ã«è³Œèªãå§ãŸã£ããšãïŒ å®è¡ã¯ãŒã«ãŒãåãåãçæã€ãã³ãïŒ TEXT_MESSAGE_CONTENT ãªã©ïŒããã¡ã¢ãªãããã®ãŸãŸé次äžç¶ poll ãã以å€ãã¹ãŠïŒãªããŒãã»å¥ã¿ãã»é¢è±ããŠæ»ã£ãŠããå ŽåïŒ 1 ç§ééã§ DB ãèªã¿ãç¢ºå®æžã¿å±¥æŽãš partial_state ã®çæéäžåçãããŒãžããäŒè©±å
šäœã® MESSAGES_SNAPSHOT ããå
容ãå€ãã£ããšãã ãéãçŽããå®è¡ãçµãã£ãã RUN_FINISHED ïŒãŸã㯠RUN_ERROR ïŒã§ç· ãã ã€ãŸããéäžããæ»ã£ãŠãã賌èªè
ãåãåãã®ã¯ live é
ä¿¡ã®ã€ãã³ãåã§ã¯ãªãããäŒè©±å
šäœã®ã¹ãããã·ã§ããã®éãçŽããã§ãã // é
ä¿¡ã¢ãŒãã®éžæãã€ãã³ãã 1 ä»¶ã§ãæµããåŸã«å§ãŸã£ã賌èªã¯ poll ã«åã export function attach ( runId : string , signal : AbortSignal ): LiveSubscription | null { const fanout = fanouts. get (runId); if (!fanout) return pollInstead(runId, "fanout_absent" ); if (fanout. closed ) return pollInstead(runId, "fanout_closed" ); // 1 ä»¶ã§ãäžç¶æžã¿ãªãåã®éäžããã«ãªãã®ã§ãå±¥æŽãåºãã poll ã«ä»»ãã if (fanout.relayed > 0 ) return pollInstead(runId, "already_relayed" ); // çç¥ïŒè³Œèªè
ãç»é²ããçæã€ãã³ããæµã AsyncGenerator ãè¿ãïŒ } // poll é
ä¿¡ã®ã«ãŒããäŒè©±å
šäœã®ã¹ãããã·ã§ããããå
容ãå€ãã£ããšãã ãéãçŽã while ( true ) { const event = snapshot(stored, readPartialMessages(progress.partialState)); const serialized = JSON . stringify (event); if (serialized !== previous) { previous = serialized; yield event; } if (isTerminal(progress. status )) break ; await sleep(POLL_INTERVAL_MS, signal); progress = await readProgress(run. id ); if (isTerminal(progress. status )) stored = await loadConversationMessages(run.conversationId); } yield terminalEvent(run, progress); éäžåæµã®è³Œèªè
ã live ã®ã€ãã³ãåã«åæµããã poll ã«åãã®ã¯ãæ£ãããåªå
ããããã§ãããã«ã¿ã®ç¶ãããæµãã«ã¯ããã¹ãããã·ã§ããã«å«ããåããšãããããæµããã«ã¿ãã®å¢çãå³å¯ã«åãããå¿
èŠããããŸããå¢çãããããšã content += delta ã®ç©ã¿äžãã§æ¬æãäºéã«é£çµãããŸããäŒè©±å
šäœã®ã¹ãããã·ã§ãããéãçŽã圢ãªããæ¯åãäžžããšã®çœ®ãæããªã®ã§ããã®äºæ
ãåççã«èµ·ããŸããããã®ä»£ãããpoll é
ä¿¡ã®ç»é¢ã¯ live é
ä¿¡ã®ãããªã¹ããªãŒãã³ã°è¡šç€ºã«ã¯ãªãããæ°ç§ããã«æç« ããŸãšãŸã£ãŠé²ã衚瀺ã«ãªããŸããéäžåæµã§ãã¹ããªãŒãã³ã°è¡šç€ºã«ããããšã¯ãåŸç¶ã®èª²é¡ã«ããŠããŸãã åæå®è¡å¶åŸ¡ïŒå®è¡äžããã¯ã NULL å¯ã®ãŠããŒã¯åã§äœã ãåäžäŒè©±ã«å®è¡äžã® run 㯠1 æ¬ã ããã DB ã§åŒ·å¶ããŸããPostgreSQL ãªã éšåã€ã³ããã¯ã¹ ïŒpartial indexã CREATE UNIQUE INDEX ... WHERE status IN ('queued','running') ã®ããã«ãæ¡ä»¶ãæºããè¡ã ããžäžæå¶çŽããããããŸãïŒã§æžããŸãããMySQL 8.0 ã«ã¯çžåœããæ§æãçšæãããŠããŸããã 代ããã« runs.lock_key ïŒNULL å¯ã»UNIQUEïŒã䜿ããŸãããå®è¡äžã¯ lock_key = conversationId ãçµäºæã« NULL ãžæ»ããŸããMySQL ã®ãŠããŒã¯ã€ã³ããã¯ã¹ã¯ NULL ãéè€ãšããŠæ±ããªã ãããçµäºæžã¿ã® run ã¯äœæ¬ã§ãå
±åã§ããå®è¡äžã¯äŒè©±ããšã« 1 æ¬ã«çµãããŸãã åäžäŒè©±ãžã® 2 æ¬ç®ã® POST /runs ã¯ãINSERT æã«ãŠããŒã¯å¶çŽéåã®ãšã©ãŒãšããŠååçã«åŒŸãããŸããéè€ã«ã¯ 2 çš®é¡ãããŸãã1 ã€ã¯ãåãéä¿¡ã®äºåºŠæŒããã§ããã¯ã©ã€ã¢ã³ãã¯éä¿¡ 1 åããšã« IDïŒ client_turn_id ïŒãçºè¡ãããªãã©ã€ã§ãåã ID ãéãããããã®åã®éè€ã§æ€åºã§ããŸããéä¿¡ãã¿ã³ã®é£æã¯ããã³ãã§ãææ¢ã§ããŸããããããã¯ãŒã¯äžèª¿æã®èªååéãªã©ããã³ãã®å¶åŸ¡ã§ã¯é²ããªãçµè·¯ãæ®ããããDB ã§ãå®ããŸãããã 1 ã€ã¯ãå¥ã®è³ªåã®äžŠè¡éä¿¡ãïŒ lock_key ã®éè€ïŒã§ãåãäŒè©±ãè€æ°ã®ã¿ãã§éããŠãããšãã«èµ·ããŸããã©ã¡ãã ã£ãããåŒãçŽããŠãå¿çãåå²ããŸãã // API Route ã®äžéšïŒéè€ããŒãšã©ãŒã®è§£é } catch (error) { if (!isUniqueViolation(error)) throw error; // äºåºŠæŒããªããå
è¡ã® run ããã®ãŸãŸè¿ãïŒåãé信㯠1 åãšããŠæ±ãïŒ const raced = await findRunByClientTurnId(params); if (raced) return { ok : true , runId : raced. id , conversationId : raced.conversationId } ; // 䞊è¡éä¿¡ãªããå®è¡äžã® run ãæ·»ããŠæåŠãž const activeRunId = await findActiveRunIn(conversationId); if (activeRunId) return { ok : false , reason : "active_run" , activeRunId } ; } // API Route ã®äžéšïŒäžŠè¡éä¿¡ãžã®å¿ç if (result.reason === "active_run" ) { return Response .json( { errors : "ãã®äŒè©±ã¯ããŸå®è¡äžã§ã" , activeRunId : result.activeRunId } , { status : 409 } , ); } 409 ã®ã¬ã¹ãã³ã¹ã« activeRunId ãå«ããŠããã®ã¯ãUI ãããã䜿ã£ãŠãæåŠãã§ã¯ãªããå®è¡äžã® run ãžã®è³Œèªåãæ¿ããã«å€æã§ããããã«ããããã§ãã ããã¯ã®è§£æŸæŒãã«åãã ããã¯ã«ã¯è§£æŸæŒããžã®åããå¿
èŠã§ãããµãŒããŒã®ããã»ã¹ãçªç¶èœã¡ããšãrunning ã®ãŸãŸããã¯ãæ¡ã£ã run ãæ®ããŸãããããªããšã誰ãå®è¡ããŠããªãã®ã«ãã®äŒè©±ãžã®è³ªåããå®è¡äžã§ãããšæåŠããç¶ããŸããåã㯠2 ã€ã®ä»çµã¿ã®çµã¿åããã§ãã å®è¡ã¯ãŒã«ãŒã¯ãå®è¡äžã® run ã® heartbeat_at ã宿çã«çŸåšæå»ãžæŽæ°ããŸãïŒåŠçãç¶ããŠããããšã®èšé²ã§ãïŒ ãããšã¯å¥ã®æé€åŠçãã heartbeat_at ã®æŽæ°ãäžå®æéæ¢ãŸã£ãŠãã queued / running ã® run ããæ
åœããã»ã¹ãç°åžžçµäºããããšã¿ãªã㊠failed ã«ããããã¯ãè§£æŸããŸãã heartbeat_at 㯠INSERT æã«çŸåšæå»ãå
¥ãããã202 ãè¿ããçŽåŸã»å®è¡ãå§ãŸãåã«ããã»ã¹ãèœã¡ãŠ queued ã®ãŸãŸæ®ã£ã run ãããã®çµè·¯ã§ååãããŸãïŒã¹ããŒãã® @@index([status, heartbeatAt]) ã¯ãã®æ€çŽ¢çšã§ãïŒ ããµãŒããŒèµ·åæã«ãæ®ã£ãŠãã running ãå
šéš failed ã«ããããšããããåçŽãªæ¹æ³ã¯æ¡ããŸããã§ããããããã€äžã¯æ°æ§ã®ãµãŒããŒããã°ããåæã«åããŠãããæ§ãµãŒããŒããŸã å®è¡ããŠããæäžã® run ããæ°ãµãŒããŒã®èµ·ååŠçã誀ã£ãŠ failed ã«ããŠããŸãããã§ããrun ã« owner_instance_id ïŒã©ã®ãµãŒããŒããã®å®è¡ãæ
åœããŠãããïŒãæãããŠããã®ãåãçç±ã§ããæé€åŠçã¯ãèªåã®ãµãŒããŒãããŸå®è¡ããŠãã run ã誀ã£ãŠååããªãããããã® ID ãšã¡ã¢ãªäžã®å®è¡äžèЧãçªãåãããŠå€å®ããŸãã ãã®ååã®ä»çµã¿ã¯ããããã€ãã¹ã±ãŒã«ã€ã³ã§ããã»ã¹ããšæ¢ããããå Žåã®åŸå§æ«ãå
ŒããŠããŸããæ¢ãŸã£ãããã»ã¹ãæ±ããŠããå®è¡ã¯éäžããåéã§ããŸããããheartbeat ãéçµ¶ããããæ°å以å
ã« failed ã«ãªãããããŸã§ã®çæå㯠partial ãšããŠå±¥æŽã«æ®ããäŒè©±ã®ããã¯ãè§£æŸãããŸãããŠãŒã¶ãŒã¯å€±æã確èªããŠãããæ¬¡ã®è³ªåã«é²ããŸãã 忢ïŒåæãšãã£ã³ã»ã«ãåºå¥ãã ãã®èšèšã§ã¯ãã¿ããéããã»ç»é¢ãé·ç§»ããã®ã¯ãåæãã§ãããå®è¡ã¯ç¶ç¶ããŸããæç€ºçã«æ¢ããããšã㯠POST /runs/{id}/cancel ãåŒã³ãŸããå®è¡ã¯ãŒã«ãŒã«ãã£ã³ã»ã«èŠæ±ã®å°ãç«ãŠãŠäžæµãžã®è³Œèªãåãé¢ããå®è¡ãããã£ã³ã»ã«ããšããŠèšé²ããŸããèšé²åŸã«é
ããŠå±ããçæç©ã¯ãåè¿°ã®å®äºæãã©ã³ã¶ã¯ã·ã§ã³ã®ãå¥ã®çµè·¯ãå
ã«çµããããŠãããä¿åããªããåå²ã§ç Žæ£ãããŸãã // API Route ã®äžéšïŒãã£ã³ã»ã«åŠç if (getActiveRun(runId) || run.ownerInstanceId === OWNER_INSTANCE_ID) { // çµäºã®èšé²ã¯å®è¡ã¯ãŒã«ãŒã«ä»»ãããããã§æžããšãã¯ãŒã«ãŒããå
ã«çµäºæžã¿ããšå€å®ããŠçæç©ãæšãŠã const active = registerRun(runId); active.cancelRequested = true ; await active.agent?.detachActiveRun(); return { ok : true } ; } // å¥ã®ãµãŒããŒãæ
åœããŠãã runãäŒè©±ã®ããã¯ãè§£æŸããããã«èšé²ã ãæžã await finalizeRun( { runId , status : "cancelled" , finalizedBy : `cancel: ${ OWNER_INSTANCE_ID } ` } ); å®è¡äžã®äŒè©±ãžã®è¿œå éä¿¡ã¯ãåè¿°ã®ããã¯ã«ãã 409 ã§æåŠãããŸãããã ã 409 ãè¿ãã ãã ãšããæ»ã£ãŠãããç»é¢ãæ¢ãŸã£ãŠèŠãã â ããäžåºŠéã â ãšã©ãŒããšããæµãã«ãªãããããããéäžçµéã®å¯èŠåïŒååæµïŒãååãªãªãŒã¹ã®ç¯å²ã«å«ããŠããŸããå®è¡äžã§ããããšãèŠããŠããã°è¿œå éä¿¡ã¯èµ·ãã«ãããæ¹åãå€ãããå Žåãã忢ããŠããéããå°ç·ã«èªå°ã§ããŸãã Redis ã¯èŠãã åçš®ã®èšèšã§ã¯ãå®è¡äžã€ãã³ãã®å
±æã« RedisïŒRedis StreamsïŒãäœ¿ãæ§æãããç¥ãããŠããŸãããã ã Redis ãå¿
èŠã«ãªãã®ã¯ãã¿ã¹ã¯ã 2 ã€ä»¥äžã«å¢ããããã€ã¹ããªãŒãã³ã°è¡šç€ºãä¿ã¡ãããå Žåã§ããä»åã¯ã©ã¡ãã«ãåœãŠã¯ãŸããªããããå
¥ããŠããŸããã çŸåšã¯ ECS 1 ã¿ã¹ã¯ã§åãããŠãããéåžžæã¯åæ¥ç¶ã®ãªã¯ãšã¹ããå®è¡ã¯ãŒã«ãŒãšåãããã»ã¹ã«å±ããŸããã€ãã³ãã¯ããã»ã¹å
ã®ã¡ã¢ãªã§ææž¡ãããããRedis ãªãã§ live é
ä¿¡ãæç«ããŸãã ã¿ã¹ã¯ã 2 ã€ä»¥äžã«å¢ãããšã賌èªã®ãªã¯ãšã¹ããå®è¡ã¯ãŒã«ãŒã®ããªãæ¹ã®ã¿ã¹ã¯ãžå±ãããšããããŸããlive é
ä¿¡ã¯ã¯ãŒã«ãŒãšåãããã»ã¹ã®ã¡ã¢ãªãä»ããŠæãç«ã£ãŠãããããå¥ã®ã¿ã¹ã¯ã«å±ãã賌èªã§ã¯äœ¿ããŸããããã ã DB ã¯ã©ã®ã¿ã¹ã¯ãããèªããã®ã§ãpoll é
ä¿¡ã¯ãã®ãŸãŸåããŸããã€ãŸã live é
ä¿¡ã§ããã¯ãã®è³Œèªã poll é
ä¿¡ã«ãªããã¹ããªãŒãã³ã°è¡šç€ºãæ°ç§ããã®æŽæ°ã«ãªãã ãã§ãå±¥æŽãéäžçµéãèŠãããŸããèšèšæ¹éã®ç¯ã§è§Šãããå®è¡ã¯ãŒã«ãŒãç¬ç«ããããã»ã¹ã«åãåºããå Žåããã¯ãŒã«ãŒãšè³Œèªè
ãå¿
ãå¥ããã»ã¹ã«ãªããããåããäžç¶ãå¿
èŠã«ãªããŸããåœé¢ã¯ 1 ã¿ã¹ã¯ã§è¶³ããèŠæš¡ã®ãããçŸæç¹ã§ã¯ãã®æ§æã«ããŠããŸãã ãŸãšã å®è¡ã®äœæãšè³Œèªãåé¢ããå®è¡ã¯ãŒã«ãŒã HTTP æ¥ç¶ããç¬ç«ãããããšã§ãç»é¢ãé¢ããŠãå®è¡ãå®èµ°ããæ§é ã«ããŸããã å±¥æŽã¯ãã¡ãã»ãŒãž 1 ä»¶ = 1 è¡ãã§ãã£ãšæ®ããçæéäžã®åçã¯äžæžãæŽæ°ã® 1 è¡ã«åããŸãããã€ãã³ãã®é次ä¿åã¯ãããã¢ãã«ãžæž¡ãå±¥æŽããµãŒããŒã DB ããçµã¿ç«ãŠãŸãã åæå®è¡å¶åŸ¡ã¯ MySQL ã®ãNULL å¯ãŠããŒã¯åãã«ããããã¯ã§å®çŸããŸããããã£ã³ã»ã«ã¯è³Œèªã®åãé¢ããšãå®è¡ãããã£ã³ã»ã«ããšããŠèšé²ããããšã§å®çŸããåæãšã¯æç¢ºã«åºå¥ããŠããŸãã AI ãã£ããã®ãå±¥æŽããšãããã¯ã°ã©ãŠã³ãå®è¡ãã¯å¥ã
ã®æ©èœã«èŠããŸãããäœã£ãŠã¿ããšãã©ã¡ãããäŒè©±ã®ç¶æ
ã¯ãµãŒããŒåŽã§æã€ããšããåãèšèšã«è¡ãçããŸãããAI ãã£ããã®å®è¡åºç€ãäœãéã«å
±éããŠçŸããè«ç¹ã ãšæãã®ã§ãåããã®ãäœãæ¹ã®åèã«ãªãã°å¹žãã§ãã
20 幎åã® 8 æ 25 æ¥ã Jeff Barr ã Amazon EC2 ããŒã¿çãå
¬éããããã°èšäºãæžããŸããããã®èšäºã§ã¯ã1 ã€ã®ãªãŒãžã§ã³ (ç±³åœæ±éš) ã§ 1 ã€ã®ã€ã³ã¹ã¿ã³ã¹ã¿ã€ã ( m1.small ) ã®ãæéåäœã§èª²éããããµã€ãºå€æŽå¯èœãª Linux ä»®æ³ãµãŒããŒãã¯ã©ãŠãå
ã§ç޹ä»ããŸãããæå°éã§ãããªããæçšã§ãããã³ã³ãã¥ãŒãã£ã³ã°ã€ã³ãã©ã¹ãã©ã¯ãã£ã«å¯Ÿããäžçã®èãæ¹ãå€ããŸããã 2021 幎ãJeff 㯠EC2 ã® 15 幎ã«ãããæŽå²ã«ã€ããŠããã®è£è©±ãèšæ¶ã«æ®ã EC2 ã®ç«ã¡äžãã«ã€ããŠåãäžããŸãã ãéå» 5 幎éãAWS ã¯ã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ãæäŸã§ããããšã®éçãæŒãåºãç¶ããæ±çšã¯ãŒã¯ããŒããš AI ã¯ãŒã¯ããŒãçšã®ã«ã¹ã¿ã ã·ãªã³ã³ãæ§ç¯ãã2006 幎ã®ã客æ§ãæ³åãã§ããªãã£ãæ°ãããã©ãŒã ãã¡ã¯ã¿ãŒãšãããã€ã¢ãã«ã« EC2 ãæ¡åŒµããŠããŸããã 20 å¹Žã®æŠèŠ Jeff 㯠15 åšå¹Žèšå¿µèšäºã®äžã§ã仿¥ã§ã顧客ãé Œãã«ããŠããåºæ¬çãªãã«ãã£ã³ã°ãããã¯ã確ç«ãã EC2 ã®éèŠãªãã€ã«ã¹ããŒã³ãéžã³ãŸããã Amazon Elastic Block Store (2008) ã¯æ°žç¶ãããã¯ã¹ãã¬ãŒãžãæäŸããŸããã ãšã©ã¹ãã£ãã¯ããŒããã©ã³ã·ã³ã°ããªãŒãã¹ã±ãŒãªã³ã°ãAmazon CloudWatch (2009) ã«ãããã¢ããªã±ãŒã·ã§ã³ã®ã¹ã±ãŒã©ããªãã£ãšå¯çšæ§ãé«ãŸããŸããã Amazon ä»®æ³ãã©ã€ããŒãã¯ã©ãŠã ïŒ2009ïŒã¯ã顧客ã«è«ççã«åé¢ããããããã¯ãŒã¯ãæäŸããŸããã AWS Nitro System (2017) ã¯ãããè¿
éãªã€ãããŒã·ã§ã³ãšåŒ·åãããã»ãã¥ãªãã£ãå®çŸããŸããã AWS Graviton ããã»ããµ (2018) ã¯ãã³ã¹ãéèŠã®ã¹ã±ãŒã«ã¢ãŠãã¯ãŒã¯ããŒãåãã«èšèšãããŸããã 20 幎以äžãããŠãEC2 㯠1 ã€ã®ã€ã³ã¹ã¿ã³ã¹ã¿ã€ããã 1,200 ãè¶
ããã€ã³ã¹ã¿ã³ã¹ã¿ã€ããžãšæé·ã ãæ±çšãã³ã³ãã¥ãŒãã£ã³ã°ãã¡ã¢ãªãã¹ãã¬ãŒãžã«æé©åããããã¢ã¯ã»ã©ã¬ãŒãããã³ã³ãã¥ãŒãã£ã³ã°ãã¡ããªãŒããã€ããã©ãŒãã³ã¹ã³ã³ãã¥ãŒãã£ã³ã°ãã¡ããªãŒã«ããã顧客ã®ããŒãºã«å¿ããŸããããããã®ã€ã³ã¹ã¿ã³ã¹ã¯ã1 ã€ã® AWS ãªãŒãžã§ã³ããäžçã§ 39 ã®ãªãŒãžã§ã³ã«æ¡å€§ããŸãã ããŸããAWS 㯠EC2 ã€ã³ã¹ã¿ã³ã¹ãããŒã«ã«ã§å®è¡ãã AWS Outposts (2018)ãåå°ã«é
眮ãã AWS ããŒã«ã«ãŸãŒã³ (2019)ãäžçäžã® 5G éä¿¡äºæ¥è
ãããã¯ãŒã¯å
ã® AWS Wavelength (2019) ã«ããããªãŒãžã§ã³ã®å¢çãè¶ã㊠EC2 ãæ¡åŒµããŸããã ããã²ããã¯ããããããŸããããéå» 5 幎éã® EC2 ã®ãªãªãŒã¹ã®äžãããæ°ã«å
¥ããããã€ãéžã³ãããšæããŸãã å€§èŠæš¡ãª ML æšè«ã®ããã® AWS Inferentia (2019): AWS Inferentia ããããæèŒããå°çšã® ML æšè«ã€ã³ã¹ã¿ã³ã¹ (inf1) ãå°å
¥ããŸããã Amazon EC2 Inf2 ã€ã³ã¹ã¿ã³ã¹ã¯ ã2023 幎 4 æã«å€§èŠæš¡ãªçæ AI æšè«ã¯ãŒã¯ããŒãåãã«äžè¬å
¬éãããŸãããAWS Trainiumã€ã³ã¹ã¿ã³ã¹ã¯ãInferentiaãã¡ããªãŒãšãšãã«ãæšè«ãšãã¬ãŒãã³ã°ã®äž¡æ¹ã«ããã AI ã©ã€ããµã€ã¯ã«ã®ããããæ®µéã«æé©åããããAWS ãèšèšããã·ãªã³ã³ã®ãã«ã¹ã¿ãã¯ãé¡§å®¢ã«æäŸããããã«ãªããŸããã EC2 Mac ã€ã³ã¹ã¿ã³ã¹ (2020): æåã® Mac ã€ã³ã¹ã¿ã³ã¹ (mac1) ã¯ãAWS ãããã·ã¹ãã äžã®ã€ã³ãã«ã³ã¢ i7 (ã³ãŒããŒã¬ã€ã¯) ãæèŒãã Apple Mac mini äžã«æ§ç¯ãããŸããã Mac M1 (mac2) ã€ã³ã¹ã¿ã³ã¹ã¯ãEC2 ã§åããŠã® ARM ããŒã¹ã® macOS ã€ã³ã¹ã¿ã³ã¹ãšã㊠2022 幎 7 æã«ãªãªãŒã¹ãããŸããã 2023 幎ã«ã¯ M2 Pro Mac ã€ã³ã¹ã¿ã³ã¹ ã 2025 幎ã«ã¯ M4ãšM4 Pro Mac ã€ã³ã¹ã¿ã³ã¹ ã 2026 幎ã«ã¯M3 Ultra Mac ã€ã³ã¹ã¿ã³ã¹ãš M4 Max Mac ã€ã³ã¹ã¿ã³ã¹ãç¶ããŸãã ãããã«ãããApple ã®éçºè
ã¯ãmacOSãiOSãiPadOSãtvOSãwatchOSãããã³ VisionOS ã¢ããªã±ãŒã·ã§ã³åãã®å¹
åºãã¯ã©ãŠãããŒã¹ã®ãã«ãããã³ãã¹ãç°å¢ãå©çšã§ããŸãã å€§èŠæš¡ãªãã«ã¹ã¿ã㯠AI ã¯ãŒã¯ããŒãåã AWS Trainium (2021) : 2021 幎 11 æããã€ããã©ãŒãã³ã¹ãªãã£ãŒãã©ãŒãã³ã°ãã¬ãŒãã³ã°ã«æé©åããã AWS Trainium ã¢ã¯ã»ã©ã¬ãŒã¿ãæèŒãã Trn1 ã€ã³ã¹ã¿ã³ã¹ããã¬ãã¥ãŒããŸããã2024 幎 12 æãAWS Trainium2 ãæèŒãã Trn2 ã€ã³ã¹ã¿ã³ã¹ãããŒã³ããããŸãã ã Trn2 UltraServer 㯠NeuronLink ãä»ã㊠64 åºã® Trainium2 ã¢ã¯ã»ã©ã¬ãŒã¿ãŒããªã³ã¯ãã1å
ãã©ã¡ãŒã¿ãŒã®åºç€ã¢ãã«ãã¬ãŒãã³ã°ããããã®ãã®ã§ããAWS re: Invent 2025 ã§ã¯ãAWS Trainium3 ãæèŒãã Trn3 UltraServer ããæ¬¡äžä»£ã®ãšãŒãžã§ã³ããæšè«ãããã³ãããªçæã¢ããªã±ãŒã·ã§ã³ã«æé«ã®ããŒã¯ã³ãããã®ã³ã¹ãå¹çãæäŸããŸãã1å°ã® Trn3 UltraServer ãæå€§144åã® Trainium3 ããããçžäºæ¥ç¶ããŠãæå€§èŠæš¡ã®ããã³ãã£ã¢ã¢ãã«ã®ãã¬ãŒãã³ã°ãšãµãŒãã¹ãæäŸããŸããçŸåšãAWS Trainium3 ã¯ããã€ããã©ãŒãã³ã¹ãª AI ãã¬ãŒãã³ã°ãšæšè«ãå€§èŠæš¡ã«å®æœããæ¥çãããã¯ã©ã¹ã®ã³ã¹ãããã©ãŒãã³ã¹ãå®çŸããŠããŸãã æ©æ¢°åŠç¿çš EC2 Capacity Blocks (2023): ãã®æ°ãã EC2 å©çšã¢ãã«ã¯ãæ©æ¢°åŠç¿ãšçæ AI ã¢ãã«ã®ãã¬ãŒãã³ã°ãšãããã€ã« GPU ã€ã³ã¹ã¿ã³ã¹ã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããããã«ããããšã§ãML ã®æ°äž»åãããã«ä¿é²ããML ã®æ°äž»åãããã«ä¿é²ããŸããå¿
èŠãª GPU 容é (æå㯠P5 ã€ã³ã¹ã¿ã³ã¹ ) ãå°æ¥ã®æ¥ä»ã®ããã«äºçŽããå¿
èŠãªæéã®ã¿äºçŽããŸãã 2024 幎 11 æãML çš EC2 ãã£ãã·ãã£ãããã¯ã¯ã ããããžã§ãã³ã°ãæ°åã§è¡ããããš ãšãæé· 6 ãæãŸã§å»¶é·ã§ããããšããµããŒãããããã«ãªããŸããã çŸåšãML çš EC2 ãã£ãã·ãã£ãããã¯ã¯ãP5 ã«å ã㊠P6-B300 ã P6-B200ãP5e ã P5en ãP4d ãP4deãTrn1ãTrn2ãTrn3 ã®åã€ã³ã¹ã¿ã³ã¹ããµããŒãããŠããŸãã AWS Graviton5 (2025): 2018 幎ãã 8 幎éç¶ããŠãã Graviton ã®ã€ãããŒã·ã§ã³ãããšã«ãAWS re: Invent 2025 ã§ Graviton5 ãããããã¬ãã¥ãŒããGraviton5 ãæèŒãã第 6 äžä»£ã® AWS Nitro Systemäžã«æ§ç¯ããã M9g ãš M9gd ã€ã³ã¹ã¿ã³ã¹ ãç«ã¡äžããŸããã C9gãšC9gdã¯2026幎6æã«ç¶ããŸãã ãçŸåšã Graviton5 ã¯192ã³ã¢ã5 åã®ãã£ãã·ã¥ãã³ã¢éã®ã¬ã€ãã³ã·ãŒãæå€§ 33% äœæžãããšããç¹åŸŽãåããŠãããããå€§èŠæš¡ã§ç¶ç¶çãã€é«ã¹ã«ãŒãããã® CPU ã³ã³ãã¥ãŒãã£ã³ã°ãå¿
èŠãšãããªã¢ã«ã¿ã€ã æšè«ãã³ãŒãçæããã«ãã¹ãããã®ã¿ã¹ã¯ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãªã©ãé«ãŸããšãŒãžã§ã³ãã£ã㯠AI ã¯ãŒã¯ããŒãã®éèŠã®é«ãŸãã«é©ããŠããŸãã AWS Nitro åé¢ãšã³ãžã³ (2026): ã客æ§ã¯ãåœç€Ÿããã®é£çµ¡ã ãã§ãªããNitro ãã€ããŒãã€ã¶ãŒã«ãããã¯ãŒã¯ããŒãåé¢ã®èšŒæ ãèŠãããšèããŠããŸãããNitro Isolation Engine ã¯ãNitro Hypervisorå
ã®å°çšã³ã³ããŒãã³ãã§ãããæ£åŒãªæ€èšŒãå©çšããŠã客æ§ã®ã¯ãŒã¯ããŒããçžäºã«ããŸã AWS ãªãã¬ãŒã¿ãŒããåé¢ãããŠããããšãæ°åŠçã«ä¿èšŒããŸããããã«ãããæ°åŠçã«èšŒæãããã¯ã©ãŠãã»ãã¥ãªãã£ã®æ°ããæšæºãéæãããŸãããã®æ©èœãã2017 幎ã®å°å
¥ä»¥æ¥é²åãç¶ããŠãã第 6 äžä»£ã® AWS Nitro ã·ã¹ãã ã«åºã¥ããŠããŸãã ãã®æ ¹åºã«ããåºç€ 20 幎ã«ããã驿°ã«ãããããããAmazon EC2 ã®åºæ¬çãªäŸ¡å€ææ¡ã¯å€ãã£ãŠããŸãããã客æ§ã¯ãããå©çšããŠãå®å
šã§ãµã€ãºå€æŽå¯èœãªã³ã³ãã¥ãŒãã£ã³ã°å®¹éãæ°åã§æã«å
¥ããããšãã§ããæ¯æãã¯äœ¿çšããåã®ã¿ã§ãé·æçãªå¥çŽãªãã«ãªã³ããã³ãã§æ¡åŒµã§ããŸãããã®æè»æ§ã¯ã2006 幎ã«ã¯èª°ãäºæ³ããŠããªãã£ãèŠæš¡ã®AIã¯ãŒã¯ããŒãã«ãåãã§ããŸãã EC2 ã¯äŸç¶ãšã㊠AWS ã®åºç€ãšãªãã³ã³ãã¥ãŒãã£ã³ã°ã¬ã€ã€ãŒã§ãã Amazon ECSã Amazon EKS ãAWS LambdaãAWS FargateãAWS Batch ã Amazon EMRãAmazon SageMaker AIãAmazon Bedrockã¯æçµçã« EC2 ãã£ãã·ãã£ã§åäœããŸã ãã·ã³ãã«ãªãŠã§ããµãŒããŒããæ°å
ã®ãã©ã¡ãŒã¿ãæã€åºç€ã¢ãã«ãã¬ãŒãã³ã°ã¯ã©ã¹ã¿ãŒãŸã§ãã客æ§ãéå» 20 幎éã«æ§ç¯ããŠãããã¹ãŠã®ã¢ãŒããã¯ãã£ãã¿ãŒã³ã¯ãã€ã³ã¹ã¿ã³ã¹ãèµ·åããæ±ºå®ããå§ãŸããŸãã ç§ãã¡ã¯ 2006 幎ã«ç¢ºåºããåºæ¬æ±ºå®ãäžãããµãŒãã¹ãæ¡å€§ããäœå°ãæ®ããŸããã20 幎çµã£ãä»ããæå°éã§ãããªãã䟿å©ãªãµãŒãã¹ãäœæããè¿
éã«ãªãªãŒã¹ããã客æ§ã®ãã£ãŒãããã¯ã«å¿ããŠè¿
éã«å埩ãããšããæŠç¥ããç§ãã¡ãæ§ç¯ããæ¹æ³ã®æéãšãªã£ãŠããŸããä»åŸ 20 幎éã®ã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ã«ã¯ãç§ãã¡ããŸã æ³åããŠããªãã£ãæ©èœãå¿
èŠã«ãªããŸããAmazon EC2 ã¯åŒãç¶ããã客æ§ã®ã¯ãŒã¯ããŒããå®è¡ããåºç€ãšãªããŸãã Amazon EC2 ã®è©³çްã«ã€ããŠã¯ãAmazon EC2 補åããŒãžãã芧ã«ãªãã ã EC2 ã®æ°æ©èœãã芧ãã ãã ã â Channy åæã¯ ãã¡ã ã§ãã





















