ããã«ã¡ã¯ãæ°è¦ãããã¯ãã®éçºããã¦ãã¾ããa2 ï¼@A2hiro_tim ï¼ã§ãã æ¨æ¥ãéçºãã¦ãããããã¯ãã«ã¤ãã¦ãæ£å¼ãªãªã¼ã¹ãçºè¡¨ããã¦ããã ãã¾ãã ð
prtimes.jp employee.kaminashi.jp
ãã¦ãæ°è¦ãããã¯ãã®ç«ã¡ä¸ãã¯ãæè¡é¸å®ãéç¨ãã¼ã«ã®èªç±åº¦ãé«ããã©ã®ç£è¦ãã¼ã«ã使ããã鏿ã«è¿·ããã¨ãããã¨æãã¾ãã
æã ã®ãã¼ã ã§ã¯è¤æ°ãã¼ã«ã®ä½¿ç¨çµé¨ã¯ãããã®ã®ãç¹å®ã®ãã¼ã«ã®å°å ¥çµé¨ãæ·±ãç¥è¦ãããã¡ã³ãã¼ã¯ããªãã£ãã®ã§ããã©ããã«æ¯è¼æ¤è¨ãã Amazon CloudWatch ã®å©ç¨ããå§ãã¦ã¿ãããã¨æææ±ºå®ãã¾ããã 主ãªé¸å®çç±ã¯ã
- AWS ã¨ã³ã·ã¹ãã ã®ä¸ã§å®çµã§ãããããTerraform Cloud ãªã©ã®æ¢åã®è¨å®ãæµç¨ã§ãã¦æ°ããè¦ãããã¨ãå°ãªããAWS ä¸ã§ã³ã¹ããä¸å 管çã§ãããçã®ã¡ãªãããããã
- ãµã¼ãã¹éå§æã§ã¦ã¼ã¶ã¼ãå°ãªã段éã§ã¯ããã®ä»ã®ãã¼ã«ã¯å°å ¥ã³ã¹ããå¦ç¿ã³ã¹ããå²ã«åããªã
ã® 2 ç¹ã§ããã
Amazon CloudWatch ã¯ã§ãããã¨ãå°ãªãã¤ã¡ã¼ã¸ããã£ã¦ãã¾ããããæ¯è¼ã®ããã«èª¿æ»ãã¦ã¿ãã¨ããæå¤ã¨è²ã ã§ãããã£ãã¨èªèãæ¹ãã¾ããã ä»å㯠Amazon CloudWatch ã使ã£ãç£è¦ä½å¶ã®æ§ç¯ã®ä¸ä¾ã¨ãã¦ããã·ã¥ãã¼ã使ã¨ãSlack éç¥ãå®ç¾ããæµããterraform ã®ã³ã¼ããæ¸ãã¤ã¤ç´¹ä»ãã¾ãã
ç£è¦ãã¼ã«é¸å®ã«æ©ãã§ãããã¼ã ã«ãæ°ããæ å ±ãæä¾ã§ããã°å¹¸ãã§ãã
ãµããªã¼
以ä¸ã®ãããªæ§æãåããã¨ã§ãAmazon CloudWatch ã§å¿ è¦ãªç£è¦ä½å¶ãæ´ãããã¨ãã§ãã¾ãããä¸è¶³ç¹ãããã¾ãããããããéç¨ãæ´ãããã¼ã ã«ããã¦ã¯ååãªæ©è½ãåãã¦ãã¾ãããã®ä»ãCloudWatch Alarm ã«ã¯ã¢ã©ã¼ã ãåãã¨ã£ãã¨ã³ã¸ãã¢ãªã³ã°ã¡ã³ãã¼ãã©ã®ãããªåå対å¿ãããã°è¯ãããè¨è¼ããã¹ã ã¼ãºã§æ£ç¢ºãªéç¨ã«ãªãããã«å·¥å¤«ãã¦ãã¾ãã
1.ããã·ã¥ãã¼ãã®ã¬ã¯ã使
ç£è¦ãã¼ã«ã®æçµçãªã¢ã¦ããããã¯ããã·ã¥ãã¼ãã§ããããCloudWatch ãããã·ã¥ãã¼ãã使ã§ãã¾ãã空ã®ç¶æ ã§ä½ã£ã¦ããã¾ãã
resource "aws_cloudwatch_dashboard" "web_server" { dashboard_name = "WebServer" dashboard_body = jsonencode({ widgets = [] }) }
apply ããå¾ã«ãCloudWatch ã®ãã¼ã¸ãéãã¨ã空ã®ããã·ã¥ãã¼ããä½ããã¦ãã¾ãã
ããã·ã¥ãã¼ãã«ã¯ãã¡ããªã¯ã¹ã Markdown ã§æ¸ããããã¹ããCloudWatch Alarm ãªã©ãã¦ã£ã¸ã§ããã¨ãã¦é ç½®ã§ãã¾ãã
2. CloudWatch Alarmã®ä½æ
ããã·ã¥ãã¼ãã¯ä¸è¦§æ§ãé«ãããã®ã§ãããå®éã«æ¬²ããã®ã¯ã·ã¹ãã ã®ç£è¦ã§ããAmazon CloudWatch ã®ä¸ã§é¾å¤ãè¨å®ãã¦ã¢ã©ã¼ããä¸ãããã§ããã®ã¯ã CloudWatch Alarm ã§ãã ä¾ã¨ãã¦ã Amazon SQS ã CloudWatch Alarm ã使ã£ã¦ç£è¦ãã¦ã¿ã¾ãã
CloudWatch Alarm ä½æã« Amazon SNS topic ãå¿ è¦ã«ãªãã®ã§ãå ã«ä½ã£ã¦ããã¾ãããã® Amazon SNS topic ã¯ãã¢ã©ã¼ãã Slack ã«éç¥ããæã«ä½¿ãã¾ãã
resource "aws_sns_topic" "cloudwatch_alarm_for_slack_topic" { name = "cloudwatch-alarm-topic" }
CloudWatch Alarm ã¯ãæåã¯ããã¸ã¡ã³ãã³ã³ã½ã¼ã«ããå®ç¾©ããã®ãããããããã®ã§ããããã§ããCloudWatch > Alarms ãã âCreate Alarmâ ãæ¼ãã¦é²ãã¾ãã
é¾å¤ã®è¨ç®æ¹æ³ãæ°å¤ãè¨å®ã§ãã¾ããã·ã³ãã«ãªç£è¦ã«ã¯ååã§ããããä»ã«ããæ£è¦åå¸ãæ³å®ããç°å¸¸æ¤ç¥ãè¨å®å¯è½ã§ãã
CloudWatch Alarm ã使ããããTerraform ã³ã¼ãã¨ã㦠import ãã¾ãã
import { to = aws_cloudwatch_metric_alarm.sqs_approx_age_of_oldest id = "sqs_approx_age_of_oldest" # alarm ã«è¨å®ããåå }
terraform plan -generate-config-out=generated.tf
以ä¸ã®ããã« terraform block ãçæããã¾ãã
# __generated__ by Terraform from "sqs_approx_age_of_oldest" resource "aws_cloudwatch_metric_alarm" "sqs_approx_age_of_oldest" { actions_enabled = true alarm_actions = ["arn:aws:sns:ap-northeast-1:012345678901:cloudwatch-alarm-topic"] alarm_description = null # æ¸ãã¦ããã¨ä¾¿å©ãå¾è¿° alarm_name = "sqs_approx_age_of_oldest" comparison_operator = "GreaterThanThreshold" datapoints_to_alarm = 1 dimensions = { QueueName = "batch_queue" } evaluation_periods = 1 metric_name = "ApproximateAgeOfOldestMessage" namespace = "AWS/SQS" period = 300 statistic = "Average" threshold = 300 }
Amazon SQS ã terraform ã§çæãã¦ããã°ã alarm_actions
ã¯æ¸ãæãã¦ããã¾ãã
alarm_actions = [aws_sns_topic.cloudwatch_alarm_for_slack_topic.arn]
3. Alarm ã®ããã·ã¥ãã¼ãã¸ã®è¿½å
使ãã Alarm ãããã¸ã¡ã³ãã³ã³ã½ã¼ã«ãã Dashboard ã«è¿½å ãã¦ããã¾ãã§ Text ã¦ã£ã¸ã§ããã追å ãã¦ã¿ã¾ãã
CloudWatch Alarm ã¯ãã®ã¹ãã¼ã¿ã¹ã«ãã£ã¦å²ãã§ããç·ã®è²ããããã¾ããè¨å®ããæ£å¸¸ç¯å²ã«åã¾ã£ã¦ããªãæã¯èµ¤ããªãã®ã§ããããããã§ãã
ãã¨ã¯åãè¦é ã§å¥½ããªã ãã¦ã£ã¸ã§ããã追å ãã¦ããã¾ãã Dashboard ãããç¨åº¦ã§ããããterraform ã«åæ ãã¾ãã âView/edit Sourceâ ããJSONå½¢å¼ã§ããã·ã¥ãã¼ãã®ä¸èº«ãé²è¦§ã§ãã¾ãã
æã
ã®ãã¼ã ã§ã¯ç¾å¨ãJSON ãã³ãã¼ãã¦ãã¡ã¤ã«ã«ä¿åã㦠templatefile
ã§åç
§ãã¦ãã¾ãã
resource "aws_cloudwatch_dashboard" "web_server" { dashboard_name = "ApplicationStatus" dashboard_body = templatefile("../../modules/dashboard/dashboard-source.json", { cloudwatch-alarm-for-slack-topic = aws_sns_topic.cloudwatch_alarm_for_slack_topic.arn }) }
ã¦ã£ã¸ã§ããã®åº§æ¨æå®ã ARN æå®ã®ç½®ãæããªã©ãç ©éãªã®ã§ãä»ã«ã鏿è¢ãææ¡ãã¦ããã¾ãã
- copy ãã JSON ã jsonencode ã®å¼æ°ã«æ¸¡ãï¼å¿ è¦ã«å¿ãã¦å¤æãã¼ã«ãå©ç¨ ï¼æ¹æ³ãããã¾ãã
- ããããããã·ã¥ãã¼ãã¯ã³ã¼ã管çããªãæ¹éãããããã¨æãã¾ãã
- åº§æ¨æå®ã«ã¤ãã¦ã¯ãé ã®ä¸ã« render ãããäººã¯æåããç´æ¥ JSON ãç·¨éãããã¨ã§ã«ãã¼ã§ããããããã¾ãããå¥éãç¥ãã¾ãã
4. ã¡ããªã¯ã¹ããã°ãããã·ã¥ãã¼ãã«è¡¨ç¤ºãã
ã¡ããªã¯ã¹ããã°ã®è¡¨ç¤ºã¯ãããã·ã¥ãã¼ãã®ç»é¢ããè¡ãã¾ããã CloudWatch Alarm ã®ä½æã¨ã»ã¼åãã§ãã è¤æ°ã®ã¡ããªã¯ã¹ãåãã°ã©ãã«è¡¨ç¤ºã§ããããLogs Insights ã®çµæã表示ã§ããããã¾ãã
ã½ã¡ã½ã¡è§¦ãã°ããç¨åº¦åããã¨æãã®ã§ãæ¬è¨äºã§ã¯å²æãã¾ãã
5. ã¢ã©ã¼ãã Slack ã«éç¥ãã
ç£è¦ãã¦ããå¤ã«ç°å¸¸ãããã°ãæ°ã¥ãã¦ããã«å¯¾å¿ã«çæã§ããããã«ãã¦ããããã§ããããããä¾ã¨ã㦠Slack éç¥ã®æ¹æ³ãåãä¸ãã¾ããCloudWatch Alarm ã®ä½ææã«æå®ãã Amazon SNS topic ãããSlack ã¸ã®éç¥ã¾ã§ã®å¦çã追å ãã¾ãã
Slack ã¸ã®éç¥ã«ã¯ AWS Chatbot ã使ãã¾ããä»ã«ã Email çµç±ã§ã®éç¥ãSlack app 㨠Lambda ã使ã£ãéç¥ãã®äºã¤ãæ¤è¨ãã¾ããããéç¥ã®åããããããéç¨ã®ç°¡åããã Chatbot ãå©ç¨ãããã¨ã«æ±ºãã¾ããã
AWS Chatbot ç¨ã® subscription ãä½ãã¾ã
resource "aws_sns_topic_subscription" "cloudwatch_alarm_for_slack_subscription" { topic_arn = aws_sns_topic.cloudwatch_alarm_for_slack_topic.arn protocol = "https" endpoint = "https://global.sns-api.chatbot.amazonaws.com" }
AWS Chatbot 㯠terraform å ¬å¼ã®ãªã½ã¼ã¹ã¨ãã¦ã¯ãªãªã¼ã¹ããã¦ãã¾ãããã³ãã¥ããã£çãããã¾ãããã©ãããè¿ãå ã«å ¬å¼ãããªãªã¼ã¹ãããã*1ãªã®ã§ãä»ã¯ããã¸ã¡ã³ãã³ã³ã½ã¼ã«ããä½ããã¨ã«ãã¾ãã
AWS Chatbot ã使ããå¾ãèªè¨¼å¦çãæ¸ã¾ããããtest message ãéã£ã¦ç¢ºèªã§ãã¾ãã
以ä¸ã§è¨å®ã¯å®äºã§ãå®éã« CloudWatch Alarm ã§è¨å®ããé¾å¤ãè¶ ããã¨ã Slack ã¡ãã»ã¼ã¸ãChatbot ããå±ãã¾ãã
å®éã®éç¨ããã¼ã ã§ã®ã¢ã©ã¼ã対å¿ã«ããã¦ã¯ Slack éç¥ã ãã§ã¯ä¸ååã§ããã±ãã管ççãå¿ è¦ã«ãªã£ã¦ããã¨æãã¾ãããæ¬è¨äºã§ã¯å²æãããã¾ãã
6. Alarm ã« Description ãè¨è¼ãã¦ãéç¨è² è·ã大ããä¸ãã
Slack ã«æç¨¿ãããã¡ãã»ã¼ã¸ã®å³ä¸ã« Alarm Description ãè¨è¼ããã¦ãã¾ããCloudWatch Alarm ã«è¨å®ããã Description ã§ãã(å è¿°ã® terraform ã³ã¼ãã¯ãµã³ãã«ã³ã¼ããªã®ã§ null ã«ãªã£ã¦ãã¾ã) ã¹ã¯ãªã¼ã³ã·ã§ããã«è¨è¼ãã¦ããã®ã¯ä»®ã®å 容ã§ãããå®éã«éç¨ãã¦ãã Alarm ã§ã¯ã Description ã«ä»¥ä¸ãæ¸ãããã«ãã¦ãã¾ãã
- ã©ããªç¶æ³ããã©ããªã¦ã¼ã¶ã¼å½±é¿ãåºã¦ããã
- ãã®ã¢ã©ã¼ããè¦ãäººã¯æ¬¡ã«ã©ãããè¡åãã¨ãã°ãããï¼å¿ è¦ã«å¿ãã¦æé æ¸ã¸ã®ãªã³ã¯ãªã©ãè¨è¼ï¼
ç¹ã« 2 ã¯ãã ããããããã¤ã³ãã§ãããªãã¨ãªãç£è¦å¯¾è±¡ã追å ãã¦ããã ãã ã¨ã1ãæ¸ãã¦çµãããã¨ãå¤ãã§ããããã ã¨ãã¢ã©ã¼ããé³´ã£ã¦ãã·ã¹ãã ã«ç¿çãã¦ãã人ã§ãªãã¨ã©ãããã°ããããããã¾ããã
ä¾ãã°ãSQS ã®ãã¥ã¼ã®ã¡ãã»ã¼ã¸ã®æ»çã® CloudWatch Alarm ã®è¨è¼ã¯ä»¥ä¸ã®ããã«ãªã£ã¦ãã¾ãã
ã¿ã¹ã¯A ã®ãã¥ã¼ã«60 ç§ä»¥ä¸ message ãæ»çãã¦ãã¾ã ãµã¼ãã¹A ã§ã®ã¦ã¼ã¶ã¼ã®è¿½å ã»åé¤ãå³æåæ ããã¦ãã¾ãã **対å¿** æ»çã®åå ã¨æ ä¿ãããµã¼ãã¹å質ã®è¦³ç¹(link)ããã以ä¸ã®ãããããè¡ãªã£ã¦ãã ãã - worker ã®æ°ãå¢ãã - ã¡ãã»ã¼ã¸ã®å¦çãæé©åãã¦ãæéãç縮ãã - ãã¦ã¼ã¶ã¼ã®åæã«ã¯Xåç¨åº¦æéããããå ´åãããã¾ããã¨ç»é¢è¡¨ç¤ºãã
対å¿ãæ¸ãã¦ããã¨ãå¿ããããã«ã¢ã©ã¼ããé³´ã£ã¦ãããããã¨ã¯ããã«æ¸ãã¦ããã®ã§æç¢ºã§ãã ã¾ããããããã¢ã©ã¼ãã追å ããéã«ãç£è¦å¯¾è±¡ãã¢ã©ã¼ãç¶æ ã«ãªã£ãæã«ãã©ãããã°ãããããèããããã«ãªãã®ã§ãå®éã®éç¨ããã¼ãã¤ã¡ã¼ã¸ãã¦å®è£ ããããããä¿®æ£ãã¦ãããããä»ã®ã¡ããªã¯ã¹ãç£è¦å¯¾è±¡ã«è¿½å ããããã¹ã ã¼ãºãªéç¨ä½å¶ãæ§ç¯ã§ãã¾ãã
触ã£ã¦ã¿ã¦ããã£ããã¨
以ä¸ãã Amazon CloudWatch ãæ´»ç¨ãã¦ç£è¦ä½å¶ãæ§ç¯ãã大ã¾ããªããã¼ã«ãªãã¾ãã æçµçãªæ§æã®ã¤ã¡ã¼ã¸ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
æå¾ã«ãå®éã«æ§ç¯ãã¦ã¿ã¦ãæ³å®ã¨éã£ããã¨ã注æç¹ãåæãã¦ããã¾ã
- CloudWatch Alarm ãã¤ãã³ããçºè¡ããã®ã¯ãã¹ãã¼ããå¤ãã£ãæã®ã¿ã§ãããã®ãããã15åéã¯éç¥ããªãããã«ãµã¤ã¬ã³ã¹ãããããç´ã£ã¦ããªãéã¯ãã£ã¨éç¥ããããã¨ãã£ããã¨ã¯ã§ãã¾ãããEventBridge ã Lambda ãæ´»ç¨ãã¦å®ç¾ããããDatadog çã®ãã¼ã«ã«ä¹ãæããå¿ è¦ãããã¾ãã
- æ¢ã«è§¦ããéããDashboard ã®ã³ã¼ã管çã¯ç ©éã§ããterraform ã§ã®å·®åããããã¥ããã¨ãã£ãåé¡ãããã¾ããæã ã®ãã¼ã ã§ã¯ã¤ã³ãã©ç°å¢ãã¢ã¸ã¥ã¼ã«åãã¦è¤æ°ã®ç°å¢ã«é©ç¨ãã¦ããé¢ä¿ã§ IaC ã«ãã ãã£ã¦ãã¾ãããããã·ã¥ãã¼ãã¯ã³ã¼ã管çããå¤ã㦠Production ç°å¢ã®ã¿ã§ã½ã¡ã½ã¡ããã®ãæãã¨æãã¾ãã
- ã¡ããªã¯ã¹ã¯ Dimension ã§ç¹å®ããããã«ãªã£ã¦ãããç®çã®ã¡ããªã¯ã¹ã CloudWatch ã®ç»é¢ä¸ããæ¢ãã®ã大å¤ããããã¾ãã
ãããã«
Amazon CloudWatch ãæ´»ç¨ãã¦ç£è¦ã®åå°ãæ´ãã¦ã¿ã¾ãããéç¨ãé²ããä¸ã§ãæ©ããä¸è¶³ããç¹ãéç¨ä¸ã®æéã«ãªãç®æãã¿ãã¦ãã¦ãã¾ããçãã¨ããã«æãå±ããªãæè§¦ãããã¾ããããããã¯ãã®åæãã§ã¼ãºãªã©ãã·ã¹ãã éç¨ã¸ã®å¤§ããªæéçã»ééçæè³ãé£ãã PMF åã®ãããªç¶æ³ä¸ã§ã¯ååã ã¨æãã¾ãã
ç§å人ã¯ãæ©è½ãè±å¯ãªãã¼ã«ãå ¥ããã¨ãåã£ã¦ãã¾ã£ãããç¥ããªãæ©è½ã使ã£ã¦ã¿ãããªãã¿ã¤ã*2ãªã®ã§ããã®æå³ã§ããããç¨åº¦ã®ä¸èªç±ãããæ¹ãå´ã£ã¦ãããã¨ããããããã¨èªåãæ£å½åããããã¦ãã¾ãã
ãã¼ã æ°ãå¢ãããããµã¼ãã¹ãæé·ãã¦ç´°ããè¦æ±ãåºã¦ããæ®µéã§ãããããã¦ç£è¦ãã¼ã«ã®æ¡å¼µãè¦ç´ããè¡ããã¨ãæåããè¦éã«ããã¦ãã¾ãããã¼ã ã®ã¹ãã«ã»ããã«å¿ãã¦ãã¹ã¿ã¼ãã¢ããã«æ±ããããé度ãå®ç¾ã§ãããã¼ã«é¸æã大äºã ã¨æãã¾ãã
éç¨ã¾ã§è¦éã«ããã¤ã¤ãã¹ã¿ã¼ãã¢ããã®é度ã¨ã®ãã©ã³ã¹ãåããªããæææ±ºå®ãã¦ç©äºãé²ãã¦ããããããªãããã¯ãå¿åã®æ¹ãAWS 好ããªæ¹ãã«ããã·ã§ä¸ç·ã«åãã¾ãããï¼
ã«ããã·ã§ã¯é¢è«ããã¹ã¿ã¼ãããã¦ããã ãã¦ããã¾ãããã²ãå¿åãå¾ ã¡ãã¦ããã¾ãï¼
*1:https://github.com/hashicorp/terraform-provider-aws/blob/v5.61.0/CHANGELOG.md#5610-unreleased
*2:if all you have is a hammer, everything looks like a nail