ã¯ããã« ãã¯ããããããŸããIWSã§ãã AWSã䜿ã£ãŠãã人ã§ããã°äžåºŠã¯èŠãããšãããã§ããã Amazon CloudWatch ã®ããã·ã¥ããŒã(以äžããã·ã¥ããŒã)ã ç§éã®ããŒã ã§ã¯ã³ã³ãœãŒã«ç»é¢ãããœã¡ãœã¡æåã§äœã£ãŠããã®ã§ãããä»å Terraform ã§1ããç°å¢ãäœãæ©äŒããããããã·ã¥ããŒãã Terraform ã䜿ã£ãŠäœã£ãŠã¿ãŸããã ãã£ãããªã®ã§åå¿é²ããŠãèšäºã«ããŠãããããªãšæããŸãã Terraform ä»å䜿ãTerraformã®ãã£ã¬ã¯ããªæ§æã¯ãã¡ãã§ããé¢ä¿ããªããã¡ã€ã«ãªã©ã¯çç¥ããŠããŸãã . âââ dev â âââ dashboard.tf # åç°å¢ããšã®å€ãmoduleã«æž¡ã âââ modules â âââ dashboard â âââ api.tf # åã°ã©ãã®èšå® â âââ main.tf # ããã·ã¥ããŒãæ¬äœã®èšå® â âââ variables.tf âââ prod âââ dashboard.tf # åç°å¢ããšã®å€ãmoduleã«æž¡ã module ã«ããã·ã¥ããŒããšãã®ã°ã©ãã®èšå®ãæžããåç°å¢ããšã®å€ïŒECS ã¯ã©ã¹ã¿ãŒã®ååã ALB ã® ID ãªã©ïŒã dev, prod é
äžã® dashboard.tf ããæž¡ããŠããŸã ããã·ã¥ããŒããã€ããã Terraform ã§ããã·ã¥ããŒããäœãã«ã¯ aws_cloudwatch_dashboard ã䜿ããŸãã https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_dashboard resource "aws_cloudwatch_dashboard" "main" { dashboard_name = var.dashboard_name dashboard_body = jsonencode( { "start" : "-P4W", # éå»4é±é "periodOverride" : "inherit", "widgets" : [] # ã°ã©ãã®èšå® }) } dashboard_name : ããã·ã¥ããŒãã®åå dashboard_body : ããã·ã¥ããŒãã衚瀺ããã°ã©ããèšå®ãJSON åœ¢åŒ start , end : ããã·ã¥ããŒãã§äœ¿çšããæéç¯å² periodOverride : ããã·ã¥ããŒããšã°ã©ãã®æéç¯å²ã©ã¡ããåªå
ããã widgets : 衚瀺ããã°ã©ãã®èšå® dashboard_body ã®è©³çްã¯AWSã®ããã¥ã¡ã³ãã«ãããŸã https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/APIReference/CloudWatch-Dashboard-Body-Structure.html periodOverride ã inherit ã«ããŠãããšã°ã©ãããšã«èªç±ã«æéç¯å²ãèšå®ã§ããŸãã éã«ãã¹ãŠçµ±äžãããå Žå㯠auto ã«ããŠããã°ããã·ã¥ããŒãã®æéç¯å²ãåªå
ãããã®ã§ãã¡ããèšå®ããŸãããã ã°ã©ããã€ããã ã°ã©ãã®èšå®ã¯ widgets ã«æžããŸãã äŸãšããŠãECS ã® CPU Utilization ã®ã°ã©ããäœãã³ãŒãã¯ä»¥äžã®ãšããã§ãã [ { "type" : "metric", "x" : 0, "y" : 0, "width" : 6, "height" : 6, "properties" : { "metrics" : [ [ "ECS/ContainerInsights", "CpuReserved", "ServiceName", "${var.api.ecs_service_name}", "ClusterName", "${var.api.ecs_cluster_name}", { "id" : "m1", "visible" : false, "stat" : "Maximum" } ], [ "ECS/ContainerInsights", "CpuUtilized", "ServiceName", "${var.api.ecs_service_name}", "ClusterName", "${var.api.ecs_cluster_name}", { "id" : "m2", "visible" : false, "stat" : "Maximum" } ], [{ "expression" : "m2/m1*100", "label" : "CPUUtilization" }] ], "period" : 300, "stat" : "Average", "region" : "ap-northeast-1", "title" : "API ECS CPUUtilization", "liveData" : false, "legend" : { "position" : "right" }, "yAxis" : { "left" : { "label" : "Percent", "showUnits" : false } } } } ] äœãèšå®ãããäžããèŠãŠãããŸããããã x,y ã§ã¯ã°ã©ããã©ã®äœçœ®ã«é
眮ãããã®èšå®ãããŠããŸãã [ { "type" : "metric", "x" : 0, "y" : 0, ... Terraformããããã·ã¥ããŒããäœãå Žåã¯ãã©ãã«ãŠã£ãžã§ãããé
眮ããããå·Šäžã (0, 0) ãšããŠåº§æšã§èšå®ããããšãã§ããŸããããã©ã«ãã§æ¬¡ã«äœ¿çšå¯èœãªäœçœ®ã䜿ããããšããããäžããè©°ã蟌ãã§è¡šç€ºããã®ã§ããã°ãšãã«æ°ã«ããå¿
èŠã¯ãããŸããã ã°ã©ãã®èšå®ã«ã€ããŠã¯ properties ã® metrics ããèšå®ã§ããŸãã ãã®ã³ãŒãã§ã¯ã ECS/ContainerInsights ãã CpuReserved ãš CpuUtilized ã®ã°ã©ããååŸã expression ã§çãèšç®ããŠè¡šç€ºããŠããŸããïŒèšç®ã«äœ¿ã£ã m1, m2 ã®ã°ã©ã㯠"visible" : false, ã§é衚瀺ã«ããŠããŸãïŒ "properties" : { "metrics" : [ [ "ECS/ContainerInsights", "CpuReserved", "ServiceName", "${var.api.ecs_service_name}", "ClusterName", "${var.api.ecs_cluster_name}", { "id" : "m1", "visible" : false, "stat" : "Maximum" } ], [ "ECS/ContainerInsights", "CpuUtilized", "ServiceName", "${var.api.ecs_service_name}", "ClusterName", "${var.api.ecs_cluster_name}", { "id" : "m2", "visible" : false, "stat" : "Maximum" } ], [{ "expression" : "m2/m1*100", "label" : "CPUUtilization" }] ], ... } ã¡ãªã¿ã«ãããªã°ã©ããäœããŸãã ãããå€ãè¶
ããå Žåèµ€ãèŠåãåºãã²ãŒãžã®ã°ã©ãã§ãã ã¬ã¹ãã³ã¹ã¿ã€ã ã®ãããªãããå€ãè¶
ããå Žåã«åãããããããŠè¡šç€ºã»ãããããªãã®ã«ããããã§ãã [ [ "AWS/ApplicationELB", "TargetResponseTime", "LoadBalancer", "${var.api.load_balancer_id}", "TargetGroup", "${var.api.target_group_id}", { "id" : "m1", "visible" : true, "label" : "Average", "stat" : "Average", "color" : "#ff402e" } ], [ "AWS/ApplicationELB", "TargetResponseTime", "LoadBalancer", "${var.api.load_balancer_id}", "TargetGroup", "${var.api.target_group_id}", { "id" : "m2", "visible" : true, "label" : "p99", "stat" : "p99", "color" : "#ff402e" } ] ], "period" : 30 * 24 * 60 * 60, "view" : "gauge", "region" : "ap-northeast-1", "title" : "API ECS responseTime", "liveData" : false, "legend" : { "position" : "right" }, "yAxis" : { "left" : { "label" : "Seconds", "min" : 0, "max" : 1 } }, "annotations" : { "horizontal" : [ { "label" : "Target", "value" : 0.2, "color" : "#7bff71", "fill" : "below", } ] } "view" : "gauge", ãæå®ããããšã§ãã®ã°ã©ããäœãããšãã§ããŸãã "color" : "#ff402e" ãã°ã©ãã®ããã©ã«ãã®è²ã§ãããªããèµ€ãèšå®ããŠããŸããçç±ã¯åŸè¿°ããŸãã ã²ãŒãžã®æšªã«ããå°ããããŒã¯æ°Žå¹³æ³šéã§ãããããå€å
ã®ç¯å²ã衚ããŠããŸãããã®ã°ã©ãã§ã¯ value ã§ 0ã0.2 ããããå€å
ïŒæ£åžžå€ïŒãšããŠèšå®ããŠããŸãã "annotations" : { "horizontal" : [ { "label" : "Target", "value" : 0.2, "color" : "#7bff71", "fill" : "below", } ] } color ãš fill ã§ãããå€ä»¥äžã®ãšãã®ã°ã©ãã®è²ãšã©ã¡ãã«åºãããèšå®ããŠããŸããããã§ã¯ #7bff71 ïŒç·è²ïŒãš below ãæå®ããŠããŸããã "fill" : "below", ã§ãããå€ä»¥äžã®ãšãã« color ã®è²ã§å¡ãã€ã¶ãããã«èšå®ããŠããŸããããã©ã«ãã¯èµ€è²ããããå€ä»¥äžã®ãšãã¯ç·ã«å¡ãã€ã¶ããŠããšããŠããããã§ãã ãããã©ã«ãã¯ç·è²ããããå€ä»¥äžã®ãšãã¯èµ€è²ã«ããã§ããããããããšãªããããªã®ã§ãããå察㮠above ã«ãããšæ°Žå¹³æ³šéã®äœçœ®ãæå€§å€åŽã«ãªã£ãããšå°ãå€ã«æããã®ã§ãã®ããã«ããŠããŸãã ãŸãšã ä»åã¯ç·ãšã²ãŒãžã®ã°ã©ãããèŠãããŸããããã¡ããç·ãšã²ãŒãžä»¥å€ã®çš®é¡ã®ã°ã©ããTerraformããäœãããšãã§ããŸãã®ã§ãã²ãèªèº«ã®ç°å¢ã§ãè²ã
詊ããŠã¿ãŠãã ããïŒ ãããã£ã§ã¯ã ããŸããŸãªãããã¯ããžææŠãã ãšã³ãžãã¢ãçµ¶è³åéäžã§ãïŒ ãèå³ã®ããæ¹ã¯ä»¥äžã®æ¡çšãµã€ããã ãæ°è»œã«ãé£çµ¡ãã ããïŒ ãããã£æ ªåŒäŒç€Ÿæ¡çšæ
å ± Tech TalkãMeetUpãéå¬ããŠãããŸãïŒ ãã¡ãããæ°è»œã«ãå¿åãã ããïŒ Event – NIFTY engineering connpassã§ãããã£ã°ã«ãŒãã« åå ããã ããš ã€ãã³ãã® ãç¥ãããå±ããŸãïŒ connpassã§ ãããã£ã°ã«ãŒãã«åå ãã