- TOP
- ã¿ã°äžèЧ
- Datadog
Datadog
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
æè¡ããã°
ã¯ããã« æ¢åæ§æ èª²é¡æ èšèš CloudWatch Logs ã§ã¯ãªã S3 ã«åã ã¯ã©ã¹ã¿åäœã§ S3 prefix ãåã å®è£
ECS ã¿ã¹ã¯ããŒã«ã«ä»äžãã IAM ããªã·ãŒ ECS ã¯ã©ã¹ã¿ã® executeCommandConfiguration ãããã« ã¯ããã« Amazon Linux 2 (ä»¥äž AL2) ã® EOL (2026 幎 6 æ 30 æ¥) ãè¿ä»ããŠããæšä»ãçæ§ããããéããã§ããããã åŒç€Ÿã§ã¯ SSH èžã¿å°ãšããŠäœ¿ã EC2 ã€ã³ã¹ã¿ã³ã¹ã AL2 ããŒã¹ã§çšæããéçšäœæ¥ã®èµ·ç¹ãšããŠé·å¹Žåãæ±ã£ãŠããŸãããéçšè
ã¯ãããçµç±ã㊠ECS ã¿ã¹ã¯ãåçš®ãããŒãžããµãŒãã¹ãžã¢ã¯ã»ã¹ããŠããçµç·¯ããããåçŽãª SSH èžã¿å°ã§ã¯ãªããéçšæ©èœãéçŽããå®è¡åºç€ãšããŠæ©èœããŠããæ Œå¥œã§ãã åè¿°ã®éã ECS æé©å AL2 AMI ã® EOL ãè¿«ãç¶æ³äžãããã奿©ã«ãã®èžã¿å°ã®åŠéãæ±ºããå¿
èŠãåºãŠããŸãããAWS ã¯åæ¡å
ã«ãããŠåŸç¶ãšã㊠Amazon Linux 2023 (ä»¥äž AL2023) ãžã®ç§»è¡ãæšå¥šããŠãããããããã«æ²¿ãã° AL2023 ã§çŽ çŽã«åæ§ç¯ããã®ãå®ç³ãšãªããŸããäžæ¹ãæ£åžããŠã¿ããšèžã¿å°ã¯ããã€ãã®éçšåºç€ãå
Œåããæ§é ã«ãªã£ãŠãããAL2023 ã§åæ§ç¯ããã°çæç㪠EOL 察å¿ã¯æžããã®ã®ããããã®æ§é ããã®ãŸãŸ AL2023 ã®ãµããŒãæé (2028 幎) ãŸã§æã¡è¶ãããšã«ãªããŸãã èžã¿å°ãæ±ããå圹å²ã¯ããããå¥åã®ä»£æ¿ææ®µãåºæã£ãŠããŠãããããAL2 ã® EOL ã奿©ã«ããŠãèžã¿å°ããšç³ãã§ããŸããæ©èœãå¥ã®ä»£æ¿å
ãžåæ£ããããæ¹éãåãããšã«ããŸãããæ¬çš¿ã¯ãã®åæ£å
ã®ãã¡ãéçšè
ã ECS Exec ã§çŽæ¥ã³ã³ãããžå
¥ãçµè·¯ã®ã»ãã·ã§ã³ãã°ããã¢ããªãã°ãšã¯å¥ç³»çµ±ã§åãæ±ãä»çµã¿ã®è©±ã§ãã æ¢åæ§æ èžã¿å°ãçµç±ããåŸæ¥æ§æã§ã¯ãéçšè
ã®æäœãã°ã¯èžã¿å°åŽã§ãŸãããšååŸã§ããŠããŸãããèžã¿å°ã廿¢ã㊠ECS Exec ãžåãæ¿ãããšããã®çµè·¯ãç¡ããªããŸãã ECS Exec ã®åºåå
ã¯ã¯ã©ã¹ã¿åäœã® executeCommandConfiguration ã§å¶åŸ¡ã§ããŸãã logging ã DEFAULT ã®ãŸãŸ (= æç€ºèšå®ãªã) ã ãšãã¿ã¹ã¯å®çŸ©åŽã§æå®ããã awslogs ã«éçšè
ã®ã¿ãŒããã«åºåãåå±
ããæ Œå¥œãšãªããŸããã¢ããªãã°ã«ã¯ Firelens çµç±ã§ CloudWatch Logs / S3 / Datadog ã® 3 ç³»çµ±ãžæµãã«ãŒãã£ã³ã°ããã§ã«æ·ãããŠãããããããã« ECS Exec ã®ã»ãã·ã§ã³ãã°ãä¹ã£ãããšãåºåå
ã»ä¿ç®¡æéã»é²èŠ§æš©éãã¢ããªãã°åŽã®éœåã«çžãããŠããŸããŸãã èª²é¡æ éçšè
ã®æäœãã°ãšã¢ããªãã°ãåãçµè·¯ã§æ··ãã£ãŠããŸããšã以äžã®ãããªäžäŸ¿ãåºãŠããŸãã åŸããéçšè
ã®æäœã ããåãåºããŠè¿œãã®ã«é£åãã ã¢ããªãã°ã®ã©ã€ããµã€ã¯ã«ã«åŒãããããŠé·æä¿ç®¡ãé£ãããªã ããã§éçšè
ã®æäœãã°ãå°çš S3 ãã±ãããžç¬ç«ããŠæžãåºãããã«æŽåããŸãããæ¬çš¿ã§ã¯ãã®èšèšå€æãšå®è£
æé ãåãæ±ããŸãã èšèš æ°ãã«å°çš S3 ãã±ãããèšããECS Exec ã®ã»ãã·ã§ã³ãã°ããã¹ãŠãããžéçŽããããšã«ããŸããã CloudWatch Logs ã§ã¯ãªã S3 ã«åã ECS Exec ã®åºåå
㯠S3 ãš CloudWatch Logs ã®ãããã (ãããã¯äž¡æ¹) ãéžã¹ãŸãããæ¬ä»¶ã¯ S3 åç¬ãšããŸãããçç±ã¯æ¬¡ã®ãšããã§ãã æ¢åã® SSM Session Manager ã®æäœãã°ãåããå°çš S3 ãã±ããã«éçŽããŠãããéçšè
ã®æäœãã°ã¯ãS3 éçŽããŠãã Athena ã§æšªæçã«è¿œããéçšãšæ¢ã«èŠªåæ§ããã ä¿ç®¡æéãé·ãèªã¿åºãé »åºŠã®äœããã°ã眮ãå
ãšããŠãCloudWatch Logs ãã S3 ã®ã»ããã³ã¹ãå¹çã«åªãã ã©ã€ããµã€ã¯ã«å¶åŸ¡ã CloudWatch Logs ããèªç±ã«å¹ããé·æä¿ç®¡èŠä»¶ã«å¿ããŠäœé »åºŠã¢ã¯ã»ã¹åãã® STANDARD_IA ãã¢ãŒã«ã€ãåãã® GLACIER_IR ãçµã¿åãããŠåããã§èšèšã§ãã ããã§ãããS3 éçŽããŠãã Athena ã§æšªæçã«è¿œããçµè·¯ã¯ãæ¥åæéå€ã®äžå¯©æäœãèªåæ€ç¥ã㊠Slack éç¥ãã瀟å
ã®ä»çµã¿ã§ãã A2RM (ç£æ»åç匷å¶ãã³) ã®åäœåºç€ã«ããªã£ãŠããŸããECS Exec ãã°ãåçµè·¯ã«ä¹ããŠããããšã§ãå°æ¥åãæ çµã¿ã§åãæ±ããäœå°ãçãŸããŸãã https://tech.mntsq.co.jp/entry/2026/03/17/114506 ã¯ã©ã¹ã¿åäœã§ S3 prefix ãåã ECS Exec ãã°ãæžãåºã S3 ãªããžã§ã¯ãããŒã«ã¯ãã¯ã©ã¹ã¿åŽã® executeCommandConfiguration ã§ä»»æã®æ¥é èŸãæå®ã§ããŸããæ¬ä»¶ã§ã¯ããã ${env}-${service}-${cluster_id}/ ãšããã¯ã©ã¹ã¿åäœã®åå空éã«ããŠãããŸããè€æ°ãµãŒãã¹ã® ECS Exec ãã°ãåããã±ããå
ã«åå±
ãããããæ¥é èŸãã¯ã©ã¹ã¿åäœã§åããŠãããªããšãåŸãã Athena ã§ã¯ãšãªãããšãã«ãã£ã«ã¿æ¡ä»¶ãè€éåããŸãã å®è£
ECS Exec ãã°ã®å颿Žåã¯æ¬¡ã® 2 段éã«åããŠæå
¥ããŸããã å°çš S3 ãã±ããã®æ°èšãšãECS ã¿ã¹ã¯ããŒã«ãžã® S3 é¢é£æš©éã®è¿œå ECS ã¯ã©ã¹ã¿ã® executeCommandConfiguration ã logging = OVERRIDE ã«åãæ¿ã é åºäŸåããããããå¿
ã 1 ãå
ã«çå°ãããŠãã 2 ãæå
¥ããå¿
èŠããããŸããã¯ã©ã¹ã¿åŽã® executeCommandConfiguration ã OVERRIDE ã«åãæ¿ããç¬éãéçšè
ã ECS Exec ã§æ¥ç¶ãã床ã«ãã¿ã¹ã¯ããŒã«ãåœè©² S3 ãã±ããã«å¯ŸããŠä»¥äžã® API ãåŒã¶ããã«ãªãããã§ãã s3:GetBucketLocation s3:GetEncryptionConfiguration (ãã±ããåŽã§ s3_bucket_encryption_enabled = true ãèšå®ããŠãããã) s3:PutObject ãããã«å¯Ÿãã IAM æš©éãã¿ã¹ã¯ããŒã«åŽã«æã£ãŠããªãç¶æ
ã§ã¯ã©ã¹ã¿ãåãæ¿ãããšãéçšè
ã ECS Exec ãå©ããç¬éã« AccessDenied ã§èœã¡ãŸããèžã¿å°å»æ¢ã«åã㊠ECS Exec ã®ä¿¡é Œæ§ãæ
ä¿ãããå±é¢ã§ãããèµ·ãããšæ¬æ«è»¢åãªã®ã§ãIAM æŽåãå
ã«çå°ãããŠããã¯ã©ã¹ã¿åæ¿ãæå
¥ããé åºãèžãã®ãå®å
šã§ãã ECS ã¿ã¹ã¯ããŒã«ã«ä»äžãã IAM ããªã·ãŒ ECS ã¿ã¹ã¯ã ECS Exec ã®ã»ãã·ã§ã³ãéãããã®åºåãã°ã S3 ãã±ãããžæžãåºãããã«å¿
èŠãªæš©éããã¿ã¹ã¯ããŒã«ãžã¢ã¿ããããããªã·ãŒãšããŠä»¥äžã®ããã«å®çŸ©ããŸãã IAM policy document ã® Terraform å®çŸ© data "aws_iam_policy_document" "ecs_exec" { # SSM Agent ã«ããã»ãã·ã§ã³ç¢ºç«ã«å¿
èŠ statement { actions = [ "ssmmessages:OpenDataChannel" , "ssmmessages:OpenControlChannel" , "ssmmessages:CreateDataChannel" , "ssmmessages:CreateControlChannel" , ] resources = [ "*" ] } # ECS Exec ãã°ãå°çš S3 ãã±ãããžæžãåºãããã«å¿
èŠ statement { actions = [ "s3:GetBucketLocation" ] resources = [ "*" ] } statement { actions = [ "s3:GetEncryptionConfiguration" ] resources = [ aws_s3_bucket.ecs_exec_logs.arn ] } statement { actions = [ "s3:PutObject" ] resources = [ "$ { aws_s3_bucket.ecs_exec_logs.arn } /*" ] } } s3:GetBucketLocation ã¯ãã±ããã®ãªãŒãžã§ã³è§£æ±ºã«ã s3:GetEncryptionConfiguration ã¯ã»ãã·ã§ã³éå§æã®ãã±ããæå·åèšå®ã®æ€èšŒã«ã s3:PutObject ã¯å®éã®ãã°æžãåºãã«ããããå¿
èŠãšãªããŸãã s3:GetEncryptionConfiguration ã¯ãã±ãã ARN ã«çµã£ãæš©éãšããããšã§ãäžèŠãªèµ°æ»ãæå¶ã§ããŸãã ECS ã¯ã©ã¹ã¿ã® executeCommandConfiguration ECS ã¯ã©ã¹ã¿ã® configuration.execute_command_configuration ã«åºåå
S3 ãã±ãããšæ¥é èŸãæå·åæ€èšŒã®æå¹åãæå®ããŸãã aws_ecs_cluster ã® Terraform å®çŸ© resource "aws_ecs_cluster" "main" { # ... ã¯ã©ã¹ã¿èªäœã®æ¢åèšå® ... configuration { execute_command_configuration { logging = "OVERRIDE" log_configuration { s3_bucket_name = aws_s3_bucket.ecs_exec_logs.bucket s3_key_prefix = "$ { var.env } -$ { var.service } -$ { var.cluster_id } /" s3_bucket_encryption_enabled = true } } } } logging = "OVERRIDE" ã§æç€ºèšå®ã¢ãŒããžåãæ¿ãã log_configuration ã§ãã®å
容ãäžããæ Œå¥œã§ãã s3_bucket_encryption_enabled = true ãæå¹ã«ãããšãã»ãã·ã§ã³éå§æã« SSM Agent ããã±ããåŽã®æå·åèšå®ã s3:GetEncryptionConfiguration ã§æ€èšŒããçµè·¯ã«åããŸãã ãããã« æ¬çš¿ã§ã¯ãèžã¿å°å»æ¢ã«åããŠéçšè
ã® ECS Exec ã»ãã·ã§ã³ãã°ãå°çš S3 ãã±ãããžåé¢ããåãçµã¿ã«ã€ããŠãèšèšå€æãšå®è£
æé ã®äž¡é¢ããåãæ±ããŸããã ECS Exec ã§éçšè
ãã³ã³ããå
ã§å©ããã³ãã³ãã¯ãå¹³æã¯ããŸãé¢å¿ããããããããšã®å°ãªãå
容ã§ãããããããã远跡ãç£æ»ãå¿
èŠã«ãªã£ããšãã«åç
§å
ãã¢ããªãã°ãšæ··ãã£ãŠãããç¬ç«ããŠãããã§ãåŸã®åããããã¯ããã¶ãå€ãããŸããæŽåããç¬éã«äœãã倧ããå€ããããã§ã¯ãªããã®ã®ãèžã¿å°å»æ¢ã®ããã«æ¥ç¶çµè·¯ãåãæ¿ããå Žé¢ã§åŸããããããå¹ããŠããé¡ã®äœãã ãšæããŸãã ECS Exec ã®ã»ãã·ã§ã³ãã°ãã¢ããªãã°ãšã¯å¥çµè·¯ãžåé¢ããäœãã¯ãèŠç¹ããæŒãããã°çŽ çŽã«çµãããã®ã«ãªã£ãŠããŸããåããããªæŽåã«åãçµãæ¹ã®äžå©ãšãªãã°å¹žãã§ãã æè²¬ïŒMNTSQ æ ªåŒäŒç€Ÿ SRE ç§æ¬ 泚èšïŒãã®èšäºã¯æè²¬è
ã®éå»èšäºãšåŒç€Ÿå
ã®ããã¥ã¡ã³ããããšã« Claude Opus 4.7 ãäœæããå
容ã8å²çšåºŠãã®ãŸãŸäœ¿çšããŠããŸã
ã¯ããã« ããã«ã¡ã¯ãæ ªåŒäŒç€Ÿã¹ã¿ã¡ã³ããã©ãããã©ãŒã éšã® åéç° ã§ãïŒ 5æ14æ¥ã»15æ¥ã«åå€å±ã®äžæ¥ããŒã«ã§éå¬ãããã ã¯ã©ãŠããã€ãã£ãäŒè° ãã«åå ããŠããŸããïŒ ç§èªèº«ãä»å¹Žãããã©ãããã©ãŒã éšã«é
å±ãšãªããæ¥ã
ã®æ¥åã§SREããã©ãããã©ãŒã ãšã³ãžãã¢ãªã³ã°ã«æºããããšãå¢ããŸãããä»åã¯ãåé åã®ç¥èŠãåžåããçŸå°ã§ã®åå è
ãšã®äº€æµãéããŠãããããã®æ¥åã«æŽ»ããããã³ããåŸãããã°ãšæãåå ããŠããŸããã ãã®èšäºã§ã¯ãåœæ¥ã®äŒå Žã®æ§åããåŒç€Ÿã®ããŒã¹äŒç»ã§è¡ã£ãã¢ã³ã±ãŒãã®çµæãçŸå°ã§èããã»ãã·ã§ã³ã®åŠã³ã«ã€ããŠãŸãšããããšæããŸãã ã¯ã©ãŠããã€ãã£ãäŒè°ãšã¯ ã¯ã©ãŠããã€ãã£ãäŒè°ã¯ããCloudNative DaysããPlatform Engineering KaigiããSRE Kaigiãã®3ã€ã®ã³ãã¥ããã£ãååã§éå¬ããã«ã³ãã¡ã¬ã³ã¹ã§ãã kaigi.cloudnativedays.jp äŒå Žã®æ§å ä»åã®ã«ã³ãã¡ã¬ã³ã¹ã¯ãçŸå°åå è
684åããªã³ã©ã€ã³èŠèŽè
998åãšãå¹³æ¥ã«ãé¢ãããããããã®æ¹ãåå ãããŠããããã§ãïŒ äŒå Žã«ã¯ãããã€ãã®ã¢ã³ã±ãŒãããŒãããããŸããïŒ(æ®åœ±ããã®ã¯ã«ã³ãã¡ã¬ã³ã¹çµäºééã§ã) ã©ãããæ¥ãŸãããïŒ åå€å±ã§ã®éå¬ãšããããšããããäžéšã»é¢æ±åããã®åå è
ãç®ç«ã¡ãŸããããé¢è¥¿ããã以å€ã®é æ¹ããè¶³ãéãã§ããæ¹ãå€ããæ³šç®åºŠã®é«ãã䌺ããŸããã 䜿ã£ãŠãããªãã¶ãŒãããªãã£ããŒã«ã¯ïŒ/ 䜿ã£ãŠããCI/CDããŒã«ã¯ïŒ ãªãã¶ãŒãããªãã£ããŒã«ã«ã€ããŠã¯ãDatadog ãæãå€ãã£ããã®ã®ãGrafanaãNew Relicãªã©ä»ã®ããŒã«ãåºã䜿ãããŠããã倧ããäžåŒ·ãšããããã¯å瀟ã®ããŒãºã«åãããŠéžå®ãããŠããå°è±¡ã§ãããäžæ¹ã§ãCI/CDããŒã«ã«ã€ããŠã¯ GitHub Actions ã®äœ¿çšçãå§åçã§ãæšæºçãªéžæè¢ã«ãªã£ãŠããããšãæ¹ããŠç¢ºèªããŸããã 䜿ã£ãŠããã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã¯ïŒ ãŸããå人çã«æ³šç®ããŠããã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã®å©çšç¶æ³ã§ã¯ãClaude Code ãäžæ©æãåºããŠããæ§åã§ãããããŒã¹ã§ä»ç€Ÿã®ãšã³ãžãã¢ãšã話ãããŠããŠã Claude Code ãå©çšããŠãããšã®å£°ãå€ãã£ãã§ãïŒ ã¹ã¿ã¡ã³ã§ã¯ãçŸåšãããã¯ãã¡ã³ããŒã«ã¯ Claude Code ãš GitHub Copilot ãé
åž ããŠãããåã
ç¶æ³ã«åãããŠæŽ»çšããŠãããŸãã æèŠªäŒã§ã¯åŒç€ŸCTOã®éå£ãã¹ãã³ãµãŒLTã§ç»å£ããŸããã ããŒã¹ã¢ã³ã±ãŒãã®çµæ ã¹ã¿ã¡ã³ã¯ä»åããŒã¹ãåºå±ãããŠããã ãããè¶ãããã ããçããã«ããä»äºã®ã¿ã€ãããšãAIã®æŽ»çšæ¹æ³ãã«ã€ããŠã®ã¢ã³ã±ãŒãããé¡ãããŸããã ãåå ããã ããçæ§ããããšãããããŸããïŒ çµæã¯ä»¥äžã®éãã§ããã (ç®ã§æ°ããã®ã§ãæ°ã«ééããããå¯èœæ§ããããŸã...) ãããªãã®ãä»äºã¯ã©ã®ã¿ã€ãïŒãã®çµæ æè¡æ¢æ€å®¶ãæ°ããã®ãèŸãã£ã... æè¡ã®æ¢æ€å®¶ïŒæ°ããããŒã«ãæè¡ã詊ãã®ã奜ãïŒïŒ39 çè«ã®äŒéåž«ïŒã¢ãŒããã¯ãã£ããã¹ããã©ã¯ãã£ã¹ã远æ±ããïŒïŒ36 å®å®ã®å®è·ç¥ïŒã·ã¹ãã ã®å®å®æ§ãšä¿¡é Œæ§ã第äžã«èããïŒïŒ32 çŸå Žã®æ¹é©è
ïŒã¬ã¬ã·ãŒãªç°å¢ãã¢ãã³ã«å€ããããšå¥®éäžïŒïŒ30 ã¯ã©ãŠããã€ãã£ãäŒè°ãšããããšããã£ãŠãå®å®æ§ãã¢ãŒããã¯ãã£ã«åŒ·ã¿ãæã£ãŠããããé¢å¿ãé«ãã£ããããæ¹ãå€ãã®ãå°è±¡çã§ããã ãŸããçŸå Žã§ã¬ã¬ã·ãŒãªç°å¢ãšæŠã£ãŠããæ¹ãå°ãªããªããå
±æããéšåãå€ãã£ãã§ãã ãããªãã®AI掻çšã¯ã©ã®ã¿ã€ãïŒãã®çµæ ãã£ã¡ã¯æ°ããããã£ã å¹çã®éè¡åž«ïŒå®åäœæ¥ãæ²æ»
ããŠããã»ã¹ã培åºèªååïŒïŒ53 çéã®éæè
ïŒå§åçãªã¹ããŒããšçç£æ§ã§éçºããïŒïŒ45 䟡å€ã®æŒåºå®¶ïŒä»ãŸã§ã«ãªããããã¯ã䟡å€ãäºæ¥æé·ãçã¿åºãïŒïŒ22 ä¿¡é Œã®å®è·ç¥ïŒã·ã¹ãã ã®å質åäžãšå®å
šæ§ã匷åºã«ããïŒïŒ13 ãã¡ãã¯ãå¹çãããçéããšãã£ãããŒã¯ãŒãã«å€ãã®ç¥šãéãŸããŸãããAIãšãŒãžã§ã³ãã«ããèªåŸçãªéçºããæ¥ã
ã®ãã€ã«åæžã«AIãæŽ»çšããŠããæ¹ãå€ããã§ãã ããŒã¹ã§çŽæ¥ã話ããããŠããã ãäžã§ãããäžå¹Žåãšä»ã§ã¯ä»äºã®ä»æ¹ãå
šãå€ãã£ãããšãã声ãããããèããç§èªèº«ã匷ãæããŠããŸãã ïŒã€ã®ã¢ã³ã±ãŒããå¥ã®ã«ã³ãã¡ã¬ã³ã¹ã§ãã£ãŠã¿ãããŸãéã£ãçµæã«ãªãããã§ãæ¯èŒããŠã¿ãã®ãé¢çœããã ãªãšæããŸããã å°è±¡ã«æ®ã£ãã»ãã·ã§ã³ çŸå°ã§å®éã«èãããšãã§ããã»ãã·ã§ã³ã®äžã§ç¹ã«å°è±¡ã«æ®ã£ãã»ãã·ã§ã³ãïŒã€ç޹ä»ããŸãã ãšã³ã¿ãŒãã©ã€ãºã®å³æ Œãªå¶çŽãéçºè
ã«æèãããªãïŒã¯ã©ãŠããã€ãã£ãéçºåºç€èšèš kaigi.cloudnativedays.jp ãšã³ã¿ãŒãã©ã€ãºç¹æã®å³ããã»ãã¥ãªãã£èŠä»¶ãããäžã§ãããã«ã¢ããªéçºã®ã¹ããŒããèœãšããªãããã«ãéçºå°ç·ãã®æŽåãé²ãããã«ã€ããŠã®ã»ãã·ã§ã³ã§ããã ãšã³ã¿ãŒãã©ã€ãºã®å¶çŽãè€éã§ãããŽãŒã«ãã³ãã¹ã§åžåããããšã§ãéçºè
ã¯å®å
šãã€é«éã«åã«é²ãããšã®ããšã§ããã ä»åã®äºäŸã®ãããªçްããå¶çŽã¯åŒç€Ÿã«ã¯ãªãã§ãããããŽãŒã«ãã³ãã¹ãã®å¿
èŠæ§ãæããŠããŸãã ã¹ã¿ã¡ã³ã§ããæè¿ã¯ AI-DLCïŒAIé§åéçºã©ã€ããµã€ã¯ã«ïŒ ã«ããäœå¶ãžãšã·ããããŠãããåã¡ã³ããŒãèªåŸçã«æ©èœãéçºããŠãããŸãã ããŽãŒã«ãã³ãã¹ããæŽåãããŠããã°ãéçºè
ã®çç£æ§ãäžãããäœèšãªäžå®ãæããã«éçºã§ãããã§ãã ãã®ããã«ãã¹ã¿ã¡ã³ã«ããããããã¯ããªãªãŒã¹ã®ãæäœéå¿
èŠãªãã®ããæ¹ããŠæ£åžããããŽãŒã«ãã³ãã¹ã®æŽåãé²ããŠãããããšæããŸããã ãŸãããè¯ããã®ãäœã£ãŠãã䜿ããããšã¯éããªãããšãã話ãå
±æããŸãããããŒã«ã®ååšãç¥ãããã ãã§çµããããæšªã§äžç·ã«äœã£ãããã ãã€ããŒããªã³ã°ã ãéããŠããã®äŸ¡å€ãçŽæ¥äŒããŠããããšã®å€§åããèªèããŸããã ç¶ç¶çãªè² è·æ€èšŒãç®æã㊠kaigi.cloudnativedays.jp ãµãŒãã¹ãæé·ãæ°ãããšã³ããã€ã³ããæ¥ã
å¢ãç¶ããäžã§ãããã«è² è·æ€èšŒã®ãç¶²çŸ
æ§ããæ
ä¿ããç¶ç¶çã«è©Šéšãè¡ã£ãŠãããã«ã€ããŠã®ã»ãã·ã§ã³ã§ããã ããŒã¯æã«ç¹å®ã®æ¡ä»¶äžã§ã®ã¿çºçããé«è² è·ãªãšã³ããã€ã³ãã詊éšããæŒããŠãããšããé害ã®åçãããAIãæŽ»çšããŠè² è·è©Šéšã®ã·ããªãªãèªåçæããæé·ãããµãŒãã¹ã«å¯ŸããŠç¶ç¶çãªè² è·æ€èšŒããä»çµã¿ãæ§ç¯ãããšã®ããšã§ããã æ¥ã
å¢å ã»å€åãããµãŒãã¹ã«å¯ŸããŠãæåã§ã·ããªãªãç¶²çŸ
ãç¶ããã®ã«ã¯éçãããã®ã§ãè² è·è©Šéšã®ã·ããªãªäœæãAIã«ããããããšã§å¹çãè¯ããªãã®ã¯ãã¡ããã§ãããã人éã§ã¯æ°ã¥ããªããããªã¢ã¯ã»ã¹ãã¿ãŒã³ããçºèŠã§ããå¯èœæ§ããããšãããšããã話ãã¯AIãªãã§ã¯ã®åŒ·ã¿ã ãšæããŸããã äœæãããã·ããªãªã®åŠ¥åœæ§ïŒããžãã¹çã«æå³ããããšã³ããã€ã³ããçïŒã®å€æããå®è¡ã»è©äŸ¡ã«ã€ããŠã¯äººéãè¡ã£ãŠãããšã®ããšã§ãAIã«ä»»ããããéšåã¯ä»»ããããžãã¹é¢ãªã©ã®éèŠãªå€æã¯ãã¯ããŸã 人ãè¡ãå¿
èŠãããããšãåèªèããŸããã ã¹ã¿ã¡ã³ã§ããæ¬çªçžåœã®æ€èšŒç°å¢ã®çšæãšAIãæŽ»çšããæ€èšŒææ³ã«ã€ããŠèããŠãããããšæããŸããã æåŸã« ã¯ã©ãŠããã€ãã£ãäŒè°ã«åå ããŠãæ°ããåŠã³ãåŸãããšãã§ãããŸãèªèº«ã®çè§£ãè¶³ããŠããªãåéã«ã€ããŠãæµ®ã圫ãã«ãªããªã©ãææçŸ©ãªïŒæ¥éãšãªããŸããã ããã§åŸãç¥èŠã掻ãããæ¥ã
ã®æ¥åã§ã¢ãŠããããã§ããããåªããŠããããã§ãã ã¹ã¿ã¡ã³ã§ã¯SREããã©ãããã©ãŒã ãšã³ãžãã¢ãªã³ã°é åã®æ¡çšãç©æ¥µçã«è¡ã£ãŠããŸãã ãèå³ã®ããæ¹ã¯ãã²ãå¿åãã ããïŒ herp.careers
ã¯ããã« SREã®å¯ºå³¶ã§ãã MNTSQã§ã¯ç¶ç¶çãªã³ã¹ãæé©åãé²ããŠãããSREããŒã ã§ããããŸã§ããã€ãã®åæžæœçã宿œããŠããŸãããæ¬èšäºã§ã¯ããã®äžããNAT Gatewayã®ããŒã¿åŠçæéã®åæžã«åããåãçµã¿ã玹ä»ããŸãã çµæãšããŠãNAT Gatewayã®ããŒã¿åŠçæéãçŽ70%åæžããããšã«æåããŸãããä»åã¯ãã³ã¹ãå¢ã®åå ç¹å®ãããå
·äœçãªå¯Ÿå¿ããããŠå¹ææž¬å®ã«ããããŸã§ã®äžé£ã®æµãããå±ãããŸãã ã¯ããã« ãŸã㯠Cost Explorer ã§ã³ã¹ãã®ææ¡ããã NAT Gateway ã®éä¿¡å
容ã調æ»ãã VPC Flow Logs ããŒãã«å®çŸ© éèšã¯ãšãª Route 53 Resolver Query Logs ããŒãã«å®çŸ© IP ãããã¹ãåãåŒãã¯ãšãª éèšçµæ ECR Public ã CloudFront çµç±ã§é
ä¿¡ãããŠããããšã curl ã§ç¢ºèªãã éä¿¡éãåæžã§ãããæ€èšãã Interface Endpoint ãš Gateway Endpoint æœçå¥ã®åæžå¹æã®è©Šç® VPC Endpoint ãš Pull Through Cache ã§ã®éä¿¡åæž Interface VPC Endpoint ã®è¿œå ECR Pull Through Cache ã®å°å
¥ ECS ã¿ã¹ã¯å®çŸ©ã®æžãæã çµæ ãŸãšã é¢é£èšäº ãŸã㯠Cost Explorer ã§ã³ã¹ãã®ææ¡ããã AWS ã®ã³ã¹ãã®å
蚳㯠Cost Explorer ã§ç¢ºèªã§ããŸããæåã«å€§ãŸãã«ã©ã®ãµãŒãã¹ãã³ã¹ãã®å€ããå ããŠããã®ããææ¡ããŸããã ã¬ããŒãã®ãã©ã¡ãŒã¿ã¯ä»¥äžã®å€ãèšå®ãããµãŒãã¹ããšã®ã³ã¹ãã確èªããŸãã ã°ã«ãŒãåã®æ¡ä»¶ ãã£ã¡ã³ã·ã§ã³: ãµãŒãã¹ åŒç€Ÿã§ã¯ã³ã¹ãã®å€ããå ããŠããã®ã¯ ECSãRDSãOpenSearchãEC2 ã€ã³ã¹ã¿ã³ã¹ã§ããããããã¯æ¢ã« Reserved Instance / Savings Plans ã賌å
¥æžã¿ã§ã€ã³ã¹ã¿ã³ã¹ãµã€ãºãæé©åæžã¿ã®ãããæ¬¡ãã§æéãé«ãã£ã EC2 - Other ã®å
èš³ã確èªããããšã«ããŸããã EC2 - Other ã®äžèº«ãèŠãããã«ãã¬ããŒãã®ãã©ã¡ãŒã¿ã以äžã®ããã«å€æŽããŸãã ã°ã«ãŒãåã®æ¡ä»¶ ãã£ã¡ã³ã·ã§ã³: 䜿çšã¿ã€ã é©çšãã£ã«ã¿ãŒ ãµãŒãã¹: EC2 - Other 䜿çšã¿ã€ã(Usage Type) 㯠AWS ã®ãªãœãŒã¹ã»API åäœã§ã³ã¹ããåè§£ã§ãããã£ã¡ã³ã·ã§ã³ã§ãã NatGateway-Bytes ã®ããã«ãµãŒãã¹å
ã®èª²éé
ç®åäœã§å
èš³ãèŠãããšãã«äœ¿ããŸãã çµæãšããŠã EC2 - Other ã®äžã§çŽ3~4å²ã NatGateway-Bytes ãå ããŠããããšãåãããŸããã NatGateway-Bytes 㯠NAT Gateway ãééããããŒã¿éã«å¿ããŠèª²éãããé
ç®ãªã®ã§ãéä¿¡éãæžããã°ãã®ãŸãŸã³ã¹ãåæžã«çŽçµããŸãã ãã ãCost Explorer ããåããã®ã¯NAT Gateway çµç±ã§ããã ãã®éä¿¡ããã£ããšããç·éã ãã§ããã®å
èš³ïŒäœã®éä¿¡ã倧åãå ããŠãããïŒãŸã§ã¯åãããŸãããåæžã§ããäœå°ããããã倿ããããã«ãNAT Gateway ãéã£ãŠããéä¿¡ã®äžèº«ã詳ãã調æ»ããããšã«ããŸããã NAT Gateway ã®éä¿¡å
容ã調æ»ãã NAT Gateway ã®ããŒã¿åŠçæéãåæžããã«ã¯ãã©ã®éä¿¡ã倧åãå ããŠããã®ããç¹å®ããå¿
èŠããããŸããä»å㯠VPC Flow Logs ãš Route 53 Resolver Query Logs ãçµã¿åãããŠèª¿æ»ããŸããã VPC Flow Logs VPC Flow Logs ã¯ãVPC å
ã® ENI ãééããéä¿¡ã®ã¡ã¿ããŒã¿ãèšé²ãããã°ã§ããéä¿¡å
IPãå®å
IPãããŒãããããã³ã«ããã€ãæ°ãªã©ãèšé²ãããŸããåŒç€Ÿã§ã¯äºåã« VPC Flow Logs ã S3 ã«åºåããèšå®ãå
¥ããŠãããããAthena ããã¯ãšãªãçºè¡ã§ããç¶æ
ã«ãªã£ãŠããŸããã 調æ»ã®æµãã¯ä»¥äžã®éãã§ãã ãããžã¡ã³ãã³ã³ãœãŒã«ãŸã㯠aws ec2 describe-nat-gateways ãããNAT Gateway ã® ENI ID ãååŸãã Athena ã§ VPC Flow Logs ã®ããŒãã«ã«å¯Ÿãã interface_id ã NAT Gateway ã® ENI ID ã«çµãã dstaddr ïŒå®å
IPïŒã§ã°ã«ãŒãã³ã°ããŠéåä¿¡ãã€ãæ°ãéèšãã äžäœã®å®å
IP ãæœåºãã ããŒãã«å®çŸ© S3 ã«åºåãã VPC Flow Logs ã Athena ããèªãããã®ããŒãã«å®çŸ©ã¯ä»¥äžã®ãããªåœ¢ã§ãïŒAWS å
¬åŒããã¥ã¡ã³ãã® VPC Flow Logs ã®ããŒãã«äœæäŸ ãããŒã¹ã«ããŠããŸãïŒã CREATE EXTERNAL TABLE IF NOT EXISTS production ( version int , account_id string, interface_id string, srcaddr string, dstaddr string, srcport int , dstport int , protocol bigint, packets bigint, bytes bigint, start bigint, ` end ` bigint, action string, log_status string, vpc_id string, subnet_id string, instance_id string, tcp_flags int , type string, pkt_srcaddr string, pkt_dstaddr string, az_id string, sublocation_type string, sublocation_id string, pkt_src_aws_service string, pkt_dst_aws_service string, flow_direction string, traffic_path int ) PARTITIONED BY ( `day` string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION ' s3://<your-flow-logs-bucket>/AWSLogs/<account_id>/vpcflowlogs/ap-northeast-1/ ' TBLPROPERTIES ( ' skip.header.line.count ' = ' 1 ' , ' projection.enabled ' = ' true ' , ' projection.day.type ' = ' date ' , ' projection.day.range ' = ' 1970/01/01,NOW ' , ' projection.day.format ' = ' yyyy/MM/dd ' , ' storage.location.template ' = ' s3://<your-flow-logs-bucket>/AWSLogs/<account_id>/vpcflowlogs/ap-northeast-1/${day} ' ); éèšã¯ãšãª å®éã« NAT Gateway çµç±ã®ã¢ãŠãããŠã³ãéä¿¡ïŒVPC â å€éšïŒãéèšããã¯ãšãªã¯ä»¥äžã®ãããªåœ¢ã§ããENI ID 㯠production ã® VPC ã«çŽã¥ã NAT Gateway 3 å°åïŒ3 AZïŒãæå®ããŠããŸãã SELECT dstaddr, dstport, SUM (bytes) / POWER ( 1024.0 , 3 ) AS gb, SUM (packets) AS pkts, COUNT (*) AS flows FROM vpc_flow_log.production WHERE day BETWEEN ' 2026/04/10 ' AND ' 2026/04/16 ' AND interface_id IN ( ' eni-xxxxxxxxxxxxxxxx1 ' , ' eni-xxxxxxxxxxxxxxxx2 ' , ' eni-xxxxxxxxxxxxxxxx3 ' ) AND srcaddr LIKE ' 10.x.x.% ' -- VPC CIDR (å
åŽèµ·ç¹) AND dstaddr NOT LIKE ' 10.x.x.% ' -- å€éšå® (NAT è¶ã) GROUP BY dstaddr, dstport ORDER BY gb DESC LIMIT 100 ; interface_id ã« NAT Gateway ã® ENI ID ãã srcaddr / dstaddr ã® LIKE æ¡ä»¶ã« VPC CIDR ãæå®ããããšã§ããVPC å
çºã»å€éšå®ãã®éä¿¡ã«çµã蟌ãã§ããŸãã ãã®ã¯ãšãªãå®è¡ãããšã以äžã®ãããªåœ¢åŒã®çµæãè¿ã£ãŠããŸãïŒå€ã¯äŸç€ºïŒã dstaddr dstport gb pkts flows 3.233.158.83 443 47.86 35,123,456 525,152 142.250.21.95 443 24.91 1,234,567 66,344 3.163.251.13 443 3.96 8,765,432 183,895 ... ... ... ... ... åã«ã©ã ã®æå³ã¯ä»¥äžã®éãã§ãã dstaddr / dstport : å®å
IP ãšããŒã gb : éä¿¡éïŒãã€ãæ°ã GB ã«æç®ïŒ pkts : ãã±ããæ°ã®åèš flows : Flow Logs ã®ã¬ã³ãŒãä»¶æ° ãªããNAT Gateway ã®ããŒã¿åŠçæéã¯ã¢ãŠãããŠã³ãã»ã€ã³ããŠã³ãäž¡æ¹åã«èª²éãããããã調æ»ã®éã¯äž¡æ¹åãéèšããŠããå¿
èŠããããŸãã ã€ã³ããŠã³ãïŒå€éš â VPCããªãã©ã€ïŒãéèšãããå Žåã¯ãäžã®ã¯ãšãªãã以äžã®å·®åã§æžãæããŸãã - SELECT dstaddr, - dstport, + SELECT srcaddr, + srcport, SUM(bytes) / POWER(1024.0, 3) AS gb, ... - AND srcaddr LIKE '10.x.x.%' -- VPC CIDR (å
åŽèµ·ç¹) - AND dstaddr NOT LIKE '10.x.x.%' -- å€éšå® (NAT è¶ã) - GROUP BY dstaddr, dstport + AND dstaddr LIKE '10.x.x.%' -- VPC CIDR (å
åŽç) + AND srcaddr NOT LIKE '10.x.x.%' -- å€éšçº (NAT è¶ãã®ãªãã©ã€) + GROUP BY srcaddr, srcport Route 53 Resolver Query Logs VPC Flow Logs ã ãã ãšãå®å
ã IP ã¢ãã¬ã¹ã§ããåãããªããããã©ã®ãµãŒãã¹å®ã®éä¿¡ããçŽæçã«å€å¥ã§ããŸãããAWS ã® ip-ranges.json ãšçªãåãããã° AWS ãµãŒãã¹ãã©ããã¯åãããŸããããã㯠AWS ãæäŸãããµãŒãã¹ã® IP ã¬ã³ãžããã«ããŒããŠããŸãããNAT Gateway ãéãéä¿¡ã«ã¯ Datadog ãªã©ã®å€éšãµãŒãã¹å®ã®ãã®ãå«ãŸããŠããããããããã® IP ãåãããŠåå¯ãã§ããä»çµã¿ãå¿
èŠã§ããããŸããAWS ãµãŒãã¹å
ã§ã CloudFront çµç±ã®ãšã³ããã€ã³ããªã©å
±æ IP ã®ã±ãŒã¹ã§ã¯ãIP ã¬ã³ãžã ãã§ã¯å
·äœç㪠FQDN ãŸã§ç¹å®ã§ããŸããã ããã§ Route 53 Resolver Query Logs ã䜿ããŸãããã㯠VPC å
ããçºè¡ããã DNS ã¯ãšãªã®ãã°ã§ããã©ã® FQDN ãã©ã® IP ã«è§£æ±ºããããããèšé²ãããŸããAWS ãµãŒãã¹ãå€éšãµãŒãã¹ããåãããVPC å
ããåå解決ãããå®å
ã¯ãã¹ãŠããã«èšé²ããããããVPC Flow Logs ã®å®å
IP ãšçªãåãããããšã§ãIP ã®å
ã«ãã£ããã¹ãåãç¹å®ã§ããŸãã ããŒãã«å®çŸ© Resolver Query Logs ã S3 ã«åºåãããã®ã Athena ããèªãããã®ããŒãã«å®çŸ©ã¯ä»¥äžã®ãããªåœ¢ã§ãïŒãã¡ãã AWS å
¬åŒããã¥ã¡ã³ãã® Route 53 Resolver Query Logs ã®ããŒãã«äœæäŸ ãããŒã¹ã«ããŠããŸãïŒã CREATE EXTERNAL TABLE IF NOT EXISTS production ( version string, account_id string, region string, vpc_id string, query_timestamp string, query_name string, query_type string, query_class string, rcode string, answers array< struct< Rdata: string, Type : string, Class: string> >, srcaddr string, srcport int , transport string, srcids struct< instance: string, resolver_endpoint: string >, firewall_rule_action string, firewall_rule_group_id string, firewall_domain_list_id string ) PARTITIONED BY ( ` date ` string ) ROW FORMAT SERDE ' org.openx.data.jsonserde.JsonSerDe ' STORED AS INPUTFORMAT ' org.apache.hadoop.mapred.TextInputFormat ' OUTPUTFORMAT ' org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat ' LOCATION ' s3://<your-resolver-logs-bucket>/AWSLogs/<account_id>/vpcdnsquerylogs/<vpc_id>/ ' TBLPROPERTIES ( ' projection.enabled ' = ' true ' , ' projection.vpc.type ' = ' enum ' , ' projection.vpc.values ' = ' <vpc_id> ' , ' projection.date.type ' = ' date ' , ' projection.date.range ' = ' 1970/06/26,NOW ' , ' projection.date.format ' = ' yyyy/MM/dd ' , ' projection.date.interval ' = ' 1 ' , ' projection.date.interval.unit ' = ' DAYS ' , ' storage.location.template ' = ' s3://<your-resolver-logs-bucket>/AWSLogs/<account_id>/vpcdnsquerylogs/<vpc_id>/${date}/ ' ); answers ã«ã©ã ã¯æ§é äœã®é
åã«ãªã£ãŠããã1 ã€ã® DNS ã¯ãšãªã«å¯Ÿããè€æ°ã®åçïŒA ã¬ã³ãŒããè€æ°è¿ãã±ãŒã¹çïŒãå
¥ã£ãŠããŸããåŸè¿°ããã¯ãšãªã§ã¯ UNNEST ã§å±éããŠäœ¿ããŸãã IP ãããã¹ãåãåŒãã¯ãšãª VPC Flow Logs ã®éèšçµæïŒå®å
IPïŒãš Resolver Query Logs ã JOIN ããŠãIP ã®å
ã«ãã£ããã¹ãåãç¹å®ããŸããå®éã«äœ¿ã£ãã¯ãšãªã¯ä»¥äžã®ãããªåœ¢ã§ãã WITH flow AS ( SELECT dstaddr, dstport, SUM (bytes) / POWER ( 1024.0 , 3 ) AS gb, SUM (packets) AS pkts, COUNT (*) AS flows FROM vpc_flow_log.production WHERE day BETWEEN ' 2026/04/10 ' AND ' 2026/04/16 ' AND interface_id IN ( ' eni-xxxxxxxxxxxxxxxx1 ' , ' eni-xxxxxxxxxxxxxxxx2 ' , ' eni-xxxxxxxxxxxxxxxx3 ' ) AND srcaddr LIKE ' 10.x.x.% ' AND dstaddr NOT LIKE ' 10.x.x.% ' GROUP BY dstaddr, dstport ), dns AS ( SELECT t.answer.Rdata AS ip, array_agg( DISTINCT query_name) AS domains FROM route53_resolver_query_log.production CROSS JOIN UNNEST(answers) AS t(answer) WHERE date BETWEEN ' 2026/04/10 ' AND ' 2026/04/16 ' AND t.answer. Type = ' A ' GROUP BY t.answer.Rdata ) SELECT f.dstaddr, f.dstport, f.gb, f.flows, d.domains FROM flow f LEFT JOIN dns d ON f.dstaddr = d.ip ORDER BY f.gb DESC LIMIT 100 ; flow CTE ã§åè¿°ã®ã¢ãŠãããŠã³ãéèšããã®ãŸãŸäœ¿ãã dns CTE ã§ answers ã CROSS JOIN UNNEST ã§å±éã㊠A ã¬ã³ãŒãã«çµãã ip â domains ã®ããããäœã£ãŠããŸããæåŸã« Flow Logs ã® dstaddr ãš DNS è§£æ±ºçµæã® ip ã JOIN ããããšã§ããå®å
IP ã®å
ã«ãã£ããã¡ã€ã³çŸ€ããšãéä¿¡éããã»ããã§ååŸã§ããŸãã ãªãã array_agg(DISTINCT query_name) ã䜿ã£ãŠããã®ã¯ãåã IP ã«å¯ŸããŠè€æ°ã®ãã¹ãåã解決ãããããšãããããã§ãïŒCloudFront ã®ããã« 1 ã€ã® IP ã倿°ã® FQDN ã«çŽã¥ãã±ãŒã¹ãå
žåïŒã ãã®ã¯ãšãªãå®è¡ãããšã以äžã®ãããªåœ¢åŒã®çµæãè¿ã£ãŠããŸãïŒå€ã¯äŸç€ºïŒã dstaddr dstport gb flows domains 3.163.251.13 443 1,557.42 1,432,100 [d5l0dvt14r5h8.cloudfront.net] 3.233.158.83 443 47.86 525,152 [trace.agent.datadoghq.com] 142.250.21.95 443 24.91 66,344 [www.googleapis.com, aiplatform.googleapis.com, vision.googleapis.com] ... ... ... ... ... domains ã«ã©ã ã«ã¯ããã® IP ã«è§£æ±ºããã FQDN ã®é
åãå
¥ããŸããGoogle APIs ã®ããã«è€æ°ã®ãµãŒãã¹åã䞊ã¶ã±ãŒã¹ãããã°ãDatadog ã® APM trace ã®ããã« 1 ã€ã® FQDN ã ããå
¥ãã±ãŒã¹ããããŸãã éèšçµæ äžèšã®ãã°ã䜿ã£ãŠ NAT Gateway çµç±ã®éä¿¡ãéèšããçµæãäžäœãå ããŠããã®ã¯ä»¥äžã®éä¿¡å
ã§ããïŒäžéšãéä¿¡å
ã¯é€å€ããŠããŸãïŒã ã€ã³ããŠã³ãïŒå€éš â VPCãã¬ã¹ãã³ã¹åä¿¡ïŒ é äœ éä¿¡å
åè 1 d5l0dvt14r5h8.cloudfront.net (CloudFront çµç±ã® ECR Public ã®å®äœ) image layer ã®å®äœé
ä¿¡ 2 Google APIs ( *.googleapis.com ) OCR / AI åŠçã®ã¬ã¹ãã³ã¹ 3 Datadog ( *.datadoghq.com 系㮠trace / intake / config ãšã³ããã€ã³ã) 4 CloudWatch Logs ( logs.ap-northeast-1.amazonaws.com ) 5 SQS ( sqs.ap-northeast-1.amazonaws.com ) ã¢ãŠãããŠã³ãïŒVPC â å€éšïŒ é äœ éä¿¡å
åè 1 Google APIs ( *.googleapis.com ) OCR / AI åŠçåãã®ç»åã¢ããããŒã 2 Datadog ( *.datadoghq.com 系㮠trace / logs / process / intake) 3 CloudWatch Logs ( logs.ap-northeast-1.amazonaws.com ) Firelens çµç±ã®ãã°éä¿¡ 4 SQS ( sqs.ap-northeast-1.amazonaws.com ) 5 Firehose ( firehose.ap-northeast-1.amazonaws.com ) éä¿¡éã§èŠããšã ã€ã³ããŠã³ãåŽã® ECR Public ããã® image layer é
ä¿¡ãçªåºããŠå€§ãã ãšããçµæã«ãªããŸããã d5l0dvt14r5h8.cloudfront.net ã¯äžèŠãããš AWS ã®ãµãŒãã¹ãã©ããåããã«ãããã¡ã€ã³ã§ããããã㯠ECR Public ã®ã€ã¡ãŒãžã¬ã€ã€ãŒé
ä¿¡ã«äœ¿ãããŠãã CloudFront ãã£ã¹ããªãã¥ãŒã·ã§ã³ ã®å®äœã§ããECR Public Gallery ( public.ecr.aws ) 㯠API éšåã¯å¥ãã¹ãã§åããŠããéä¿¡éã¯å
ãã§ãããã€ã¡ãŒãžã¬ã€ã€ãŒã® blob ããŠã³ããŒã㯠CloudFront çµç±ã§é
ä¿¡ãããä»çµã¿ã«ãªã£ãŠããŸãã åŒç€Ÿã§ã¯å
ã
VPC ã« S3 Gateway Endpoint ããèšå®ããŠããããECS ã¿ã¹ã¯ãã public.ecr.aws/datadog/agent:latest ãªã©ã®ãµã€ãã«ãŒã€ã¡ãŒãžã pull ããéä¿¡ã CloudWatch Logs / SQS å®ã® AWS API éä¿¡ã¯ããã¹ãŠ NAT Gateway ãçµç±ããŠããŸããã ECR Public ã CloudFront çµç±ã§é
ä¿¡ãããŠããããšã curl ã§ç¢ºèªãã d5l0dvt14r5h8.cloudfront.net ã ECR Public ã®ã€ã¡ãŒãžã¬ã€ã€ãŒé
ä¿¡çš CloudFront ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ããããšããç¹ã«ã€ããŠè£è¶³ããŸãã AWS ã®å
¬åŒããã¥ã¡ã³ãã§æç¢ºã«èª¬æããŠããè³æã¯éå®çã§ããã EKS Anywhere ã®ããã¥ã¡ã³ã ã§ã¯ d5l0dvt14r5h8.cloudfront.net (for EKS Anywhere package ECR container images) ãšèšèŒãããŠãããECR ã³ã³ããã€ã¡ãŒãžã®é
ä¿¡çšã§ããããšãèšåãããŠããŸãã ããã«å ããŠãã¬ãžã¹ã㪠API ã®æåã curl ã§å®éã«ç¢ºèªããããšãã§ããŸããECR Public ããã€ã¡ãŒãžã¬ã€ã€ãŒïŒblobïŒãååŸããããšãããšãHTTP 307 Redirect ã§ CloudFront ã«é£ã°ãããä»çµã¿ã«ãªã£ãŠããããã® redirect å
ã®ãã¹ããçŽæ¥èŠãããŸããæé ã¯ä»¥äžã®éãã§ãã # 1. ECR Public ã®å¿åããŒã¯ã³ãååŸ TOKEN=$(curl -s "https://public.ecr.aws/token/" | jq -r .token) # 2. ã€ã¡ãŒãžã®ãããã§ã¹ãããã¬ã€ã€ãŒã® digest ãååŸ # datadog/agent ã¯ãã«ãã¢ãŒã察å¿ã®ããããŸããããã§ã¹ããªã¹ããã # ã¢ãŒãå¥ãããã§ã¹ãã® digest ãåŒãããããã layer digest ãåã MANIFEST_DIGEST=$(curl -s \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \ "https://public.ecr.aws/v2/datadog/agent/manifests/latest" | jq -r '.manifests[0].digest') LAYER_DIGEST=$(curl -s \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \ "https://public.ecr.aws/v2/datadog/agent/manifests/$MANIFEST_DIGEST" | jq -r '.layers[0].digest') # 3. blob ãåãã«è¡ãïŒãªãã€ã¬ã¯ãã远ãããããã®ã¿ç¢ºèªïŒ curl -sI -X GET \ -H "Authorization: Bearer $TOKEN" \ "https://public.ecr.aws/v2/datadog/agent/blobs/$LAYER_DIGEST" | grep -E "^(HTTP|location)" åºå: HTTP/2 307 location: https://d5l0dvt14r5h8.cloudfront.net/v2/.../?... public.ecr.aws/v2/<repo>/blobs/<digest> ã d5l0dvt14r5h8.cloudfront.net é
äžã® URL ã« 307 redirect ããŠããããšã確èªã§ããŸãã aws-for-fluent-bit ãªã©ä»ã®ã€ã¡ãŒãžã§è©ŠããŠããåã CloudFront ãã¡ã€ã³ã« redirect ãããŸãã ãªããECR Public ã䜿ã CloudFront ãã¡ã€ã³ã¯ææã«ãã£ãŠå€ããå¯èœæ§ãããã®ã§ãèªç°å¢ã§åæ§ã®èª¿æ»ãããå Žåã¯äžèšã®æé ã§å®éã® redirect å
ã確èªããã®ã確å®ã§ãã éä¿¡éãåæžã§ãããæ€èšãã éä¿¡å
容ãèŠããŠããã®ã§ãåæžæ¹éãæ€èšããŸãã Interface Endpoint ãš Gateway Endpoint VPC å
ãã AWS ã®ãµãŒãã¹ã« NAT Gateway ãçµç±ããã¢ã¯ã»ã¹ããã«ã¯ãVPC Endpoint ã䜿ããŸããVPC Endpoint ã«ã¯ 2 çš®é¡ãããŸãã Gateway Endpoint : S3 ãš DynamoDB ã®ã¿å¯Ÿå¿ã è¿œå æéãªã ïŒã«ãŒãããŒãã«çµç±ã§ã«ãŒãã£ã³ã°ãããïŒ Interface Endpoint : ã»ãšãã©ã® AWS ãµãŒãã¹ã«å¯Ÿå¿ã AZ ããšã« ENI ãç«ã¡ãæé課é + ããŒã¿åŠçæéãããã S3 ã¯æ¢ã« Gateway Endpoint ãããã®ã§è¿œå ã³ã¹ããªãã§ NAT Gateway ãåé¿ã§ããŠããŸãããã®ä»ã®AWSãµãŒãã¹ã«é¢ããŠã¯ Interface Endpoint ã§å¯Ÿå¿ããå¿
èŠããããŸãã æœçå¥ã®åæžå¹æã®è©Šç® Interface Endpoint ã¯ãã äœãã°å
šéšå®ããªãããã§ã¯ãªããEndpoint èªäœã®åºå®è²»ïŒAZ æ° Ã æé課éïŒãšãNAT Gateway ãéã£ãŠããããŒã¿åŠçæéã®åæžé¡ãæ¯èŒããå¿
èŠããããŸããNAT Gateway çµç±ã®éä¿¡éãå°ãªããµãŒãã¹ã« Endpoint ãäœããšããããã³ã¹ããå¢ããã±ãŒã¹ããããŸãã åæãšãªã ap-northeast-1 ã®å䟡ã¯ä»¥äžã§ãïŒèšäºå·çæç¹ã® AWS ã®å
¬ç§°æéïŒã NAT Gateway : ããŒã¿åŠçæé $0.062 / GB Interface VPC Endpoint : $0.014 / æé à AZ æ° ã®åºå®è²» + ããŒã¿åŠçæé $0.01 / GB ãã®å䟡ã«éèšçµæã®éä¿¡éãåœãŠã¯ããæœçããšã«æŽçããã®ã以äžã®è¡šã§ãïŒå®æ°å€ã¯äŒãã倧å°é¢ä¿ã ã瀺ããŠããŸãïŒã æœç åæžå¯Ÿè±¡ã®éä¿¡é çŽåæžé¡ Pull Through Cache + ECR API / DKR Endpoint çªåºããŠå€§ â 倧å¹
ãã©ã¹ CloudWatch Logs Interface Endpoint äž â å°å¹
ãã©ã¹ SQS Interface Endpoint å° â³ ã»ãŒæçåå²ïŒæ¡çšã¯èŠéãïŒ Datadog PrivateLink äž â³ ã»ãŒæçåå²ïŒæ¡çšèŠéãïŒ Datadog ã¯å¯Ÿè±¡ Endpoint ã®æ°ã§çµæã倧ããå€ãããŸããAPM trace åç¬ã«çµãã°æçåå²ãè€æ° Endpoint ã貌ããšåºå®è²»ãç©ã¿äžãã£ãŠèµ€ååŽã«æ¯ããŸããä»åã¯ã³ã¹ãã¡ãªãããã»ãšãã©ãªãã£ããããPrivateLinkã®æ¡çšã¯èŠéããéä¿¡éãä»åŸå¢ããŠããæ®µéã§ãå°å
¥ã忀èšããæ³å®ã§ãã ãããŸã§ã®è©Šç®ããã æåªå
ã§å¯Ÿå¿ãã¹ã㯠Pull Through CacheïŒ+ ECR API / DKR EndpointïŒã§ãããåãã㊠CloudWatch Logs Endpoint ãå
¥ãã ããšããæ¹éã確å®ããŸããããã®ä»ã® AWS API éä¿¡ïŒSSMãSecrets Manager ãªã©ïŒã¯ä»åã®éèšã§ã¯äžäœã«æ¥ãŠããªãã£ãããã察象å€ãšããŠããŸãã VPC Endpoint ãš Pull Through Cache ã§ã®éä¿¡åæž äžèšã®æ¹éãèžãŸããŠãä»¥äž 3 ã€ãå®è£
ããŸããã ECR API / ECR DKR / CloudWatch Logs ã® Interface VPC Endpoint 远å ECR Pull Through Cache ã®å°å
¥ ECS ã¿ã¹ã¯å®çŸ©ã® image åç
§ã Pull Through Cache çµç±ã«æžãæã Interface VPC Endpoint ã®è¿œå 3 ã€ã® Interface Endpoint ã远å ããŸãããTerraform ã§æžããšä»¥äžã®ããã«ãªããŸãã module "vpc_endpoints" { # ... endpoints = { s3 = { # æ¢åã® S3 Gateway EndpointïŒçç¥ïŒ } ecr_api = { service = "ecr.api" service_type = "Interface" subnet_ids = module.vpc.private_subnets private_dns_enabled = true tags = { Name = "$ { module.vpc.name } -ecr-api-vpc-endpoint" } } ecr_dkr = { service = "ecr.dkr" service_type = "Interface" subnet_ids = module.vpc.private_subnets private_dns_enabled = true tags = { Name = "$ { module.vpc.name } -ecr-dkr-vpc-endpoint" } } logs = { service = "logs" service_type = "Interface" subnet_ids = module.vpc.private_subnets private_dns_enabled = true tags = { Name = "$ { module.vpc.name } -logs-vpc-endpoint" } } } } ECR Pull Through Cache ã®å°å
¥ Interface VPC Endpoint ã远å ããããšã§ <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com å®ã®é信㯠VPC å
ã§å®çµããŸããã public.ecr.aws/... ã®ã€ã¡ãŒãžã¯ ECR PublicããååŸãããããInterface VPC Endpoint ã®å¯Ÿè±¡å€ã§ãã ããã§äœ¿ããã®ã ECR Pull Through Cache ã§ããããã¯ã public.ecr.aws ãªã©ã® upstream registry ã®ã€ã¡ãŒãžããèªã¢ã«ãŠã³ãã® private ECR ã«ãã£ãã·ã¥ãšããŠåã蟌ããæ©èœã§ããåå pull æã«ãã£ãã·ã¥åŽã«ã€ã¡ãŒãžãåã蟌ãŸãã以éã¯èªã¢ã«ãŠã³ãã® ECR ãã pull ã§ããŸããprivate ECR ãžã® pull 㯠Interface VPC Endpoint çµç±ã§å®çµãããããNAT Gateway ãéããªããªããŸãã 詳现ãªèšå®æé ã仿§ã¯ AWS å
¬åŒã® Creating a pull through cache rule ãåç
§ããŠãã ããã Terraform ã§èšå®ããã®ã¯ä»¥äžã®ãªãœãŒã¹ã§ãã resource "aws_ecr_pull_through_cache_rule" "ecr_public" { ecr_repository_prefix = "ecr-public" upstream_registry_url = "public.ecr.aws" } ãããèšå®ãããšã <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/<namespace>/<image>:<tag> ãšãã URL ã§ pull ã§ããããã«ãªããŸãã ecr_repository_prefix ã§æå®ãã ecr-public/ ã®é
äžã«ãupstream ã®ãªããžããªåããã®ãŸãŸå±éããã圢ã§ãã åå pull ã®ãšãã« ecr-public/datadog/agent ã®ãã㪠private ãªããžããªãèªåäœæãããŸãããã®èªåäœæãš upstream ããã®ã€ã¡ãŒãžåã蟌ã¿ã«æš©éãå¿
èŠãªãããIAM Policy ãå¥éçšæããŸãã data "aws_iam_policy_document" "ecr_pull_through_cache" { statement { effect = "Allow" actions = [ "ecr:BatchImportUpstreamImage" , "ecr:CreateRepository" , ] resources = [ "arn:aws:ecr:$ { data.aws_region.current.id } :$ { data.aws_caller_identity.self.account_id } :repository/$ { aws_ecr_pull_through_cache_rule.ecr_public.ecr_repository_prefix } /*" , ] } } resource "aws_iam_policy" "ecr_pull_through_cache" { name = "$ { var.env } -$ { var.service } -ecr-pull-through-cache" description = "Allow importing images from upstream registry via ECR Pull Through Cache" policy = data.aws_iam_policy_document.ecr_pull_through_cache.json } ãã® Policy ã ECS ã® task execution role ã« attach ããããšã§ãã¿ã¹ã¯èµ·åæã®åå pull ãæåããããã«ãªããŸãããããå¿ãããšãåå pull æã« AccessDeniedException ãåºãŠã¿ã¹ã¯ãèµ·åããŸããã ECS ã¿ã¹ã¯å®çŸ©ã®æžãæã Pull Through Cache çµç±ã§ã€ã¡ãŒãžã pull ããã«ã¯ãECS ã®ã¿ã¹ã¯å®çŸ©ã§ public.ecr.aws/... ãåç
§ããŠããç®æãæžãæããå¿
èŠããããŸãã æžãæãã察象ã¯ãåãµãŒãã¹ã§å
±éããŠäœ¿ã£ãŠãã Datadog Agent ãš aws-for-fluent-bitïŒFirelensïŒã®ãµã€ãã«ãŒãäžå¿ã§ãã - "image": "public.ecr.aws/datadog/agent:latest", + "image": "<account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/datadog/agent:latest", - "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:init-2.32.2", + "image": "<account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/aws-observability/aws-for-fluent-bit:init-2.32.2", æžãæããã¿ã¹ã¯å®çŸ©ããããã€ããããšã¯ãECS ã³ã³ãœãŒã«ãã Pull Through Cache çµç±ã§ pull ãããŠãããã確èªã§ããŸããã¿ã¹ã¯ã®è©³çްç»é¢ã®ã³ã³ããã€ã¡ãŒãžæ¬ã«ãæžãæãåŸã® <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/... ãšãã URL ã衚瀺ãããŠããã°æ³å®éãã«åäœããŠããŸãã ããã㊠ECR ã®ã³ã³ãœãŒã«ãéããšã ecr-public/datadog/agent ã®ãã㪠Pull Through Cache çšã®ãã©ã€ããŒããªããžããªãèªåäœæãããŠããã¯ãã§ãã çµæ 察å¿ã®å®äºåŸãCost Explorer ã§ NatGateway-Bytes ã®æšç§»ã確èªãããšããã察å¿åãšæ¯ã¹ãŠçŽ 70% æžå°ããŸããã2026/05/17 ã«åç°å¢ã§å¯Ÿå¿ãåæ ããŠãããã°ã©ãã§ããã®æ¥ãå¢ã«ããŒã¿åŠçæéã倧ããäžãã£ãŠããã®ã確èªã§ããŸãã ãŸããVPC Flow Logs ã§éä¿¡å
容ãåéèšãããšãããECR PublicïŒ d5l0dvt14r5h8.cloudfront.net ïŒãCloudWatch Logsã®éä¿¡ã倧å¹
ã«åæžãããŠããããšã確èªã§ããŸãããPull Through Cache ãš Interface VPC Endpoint ãæå³éãã«å¹ããŠããããšã確èªã§ããŸãã äžæ¹ã§ã察å¿åŸã«éä¿¡éã®äžäœãå ããŠããã®ã¯ Datadog ç³»ïŒAPM traceãagent flaresãlogs intake ãªã©ïŒãš Google APIsïŒVision / AI Platform ç³»ïŒã§ãããã©ã¡ãããµãŒãã¹ã®ã¹ã±ãŒã«ã AI ç³»æ©èœã®æ¡å
ã«äŒŽã£ãŠä»åŸããã«å¢ããŠããããšãæ³å®ãããŸããDatadog ã¯éä¿¡éãå¢ããŠããã°ãPrivateLink å°å
¥ãæ¬¡ã®æã¡æãšããŠæµ®äžããŠãããã§ããGoogle APIs 㯠AWS å€ã®ãµãŒãã¹ã§ VPC Endpoint ã®å¯Ÿè±¡å€ãªã®ã§ãã³ã¹ãé¢ã®å¯Ÿçã¯ã¢ããªã±ãŒã·ã§ã³åŽã§ã®èŠçŽããå¿
èŠã«ãªããŸãã ãŸãšã æ¬èšäºã§ã¯ä»¥äžã®æµãã§Nat Gatewayã®ã³ã¹ããåæžããäºäŸã玹ä»ããŸããã Cost Explorer ã䜿ã£ãã³ã¹ãå
èš³ã®ææ¡ VPC Flow Logs ãš Route 53 Resolver Query Logs ãçµã¿åããã NAT Gateway çµç±ã®éä¿¡å
容ã®ç¹å® VPC Endpointã®å䟡ãšéä¿¡éããæœçã®è²»çšå¯Ÿå¹æã®è©Šç® Interface VPC EndpointïŒECR API / ECR DKR / CloudWatch LogsïŒãš ECR Pull Through Cache ã«ããããŒã¿åŠçæéã®åæž ä»åã®èª¿æ»ãã¹ããŒãã£ãŒã«é²ãã æå€§ã®èŠå ã¯ãåæãšã㊠VPC Flow Logs ãš Route 53 Resolver Query Logs ãæ¢ã« S3 ãžåºåãããŠããããšã§ãããäžãäžã®ãã©ãã«ãçªçºçãªèª¿æ»ã«åããæ¥é ãããã°ãæºããŠããäœå¶ã¥ããã匷ãããããããŸãã NAT Gateway ã¯ã€ã³ãã©æ§ç¯åœåã¯éä¿¡éãå°ãªãããŒã¿åŠçæéãç®ç«ã¡ãŸãããããµãŒãã¹ãã¹ã±ãŒã«ããã«ã€ããŠæ°ã¥ããªããã¡ã«éä¿¡éãå¢ããŠã³ã¹ããå§è¿«ããŸããNAT Gatewayã®ã³ã¹ãåæžãæ€èšããŠããæ¹ãããã°ããã²åèã«ããŠã¿ãŠãã ããã é¢é£èšäº åæ§ã® NAT Gateway ã³ã¹ãåæžã«é¢ããäºäŸãšããŠã以äžã®èšäºãåèã«ãªããŸãã NATã²ãŒããŠã§ã€ã®éä¿¡å
容ã調æ»ããŠå¯Ÿçããã³ã¹ããçŽ60ïŒ
åæžãã話 - ZOZO TECH BLOG Amazon ECRãã«ã¹ã«ãŒãã£ãã·ã¥ã䜿ã£ãŠã¿ã - DMM Developers Blog
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã






