TroubleShooting
[ECS] ecs-agent 프로세스 모니터링
이슈
멀티컨테이너 식으로 운영되는 개발서버 경우 비용절감을 위해 특정시간 외 다른 시간대는 EC2 Stop/Start를 진행중에 있다. 그러나 간헐적으로 ecs-agent가 정상적으로 죽는 현상 발생이 발생하여 클러스터 내 모든 ECS Service들이 동작하지 않아 확인을 해야하는 상황이 발생하였다.
이슈원인은 대체적으로 ecs-agent가 제대로 동작하지 않아 발생한 이슈이고 자체적으로 재시작기능을 내재하고 있음에도 불구하고 간헐적으로 제대로 동작하고 있지 않았다.
ecs.log에 마땅한 로그가 남지 않아 Case Open을 진행하여도 근본적인 원인을 찾기는 어려웠다.
그렇기에 ecs-agent 프로세스 모니터링을 직접 만들어 해결을 진행하였다.
해결
(1) 매 분 "systemctl is-active ecs" 명령어를 통해 1분 주기로 active 상태 확인 (Crontab 등록)
(2) 만약, active 상태가 아닐 경우 ecs agent 시작 후 슬랙으로 관련 알람 발송
Bash 스크립트
#!/bin/bash
LOG_FILE="/<your-script-path>/ecs_agent_monitor.log"
SLACK_WEBHOOK_URL="<your-slack-url>"
IMAGE_URL="https://www.tothenew.com/blog/wp-ttn-blog/uploads/2016/04/integrations_awsecs@4x-500x500.png"
# 슬렉 메세지 전송
send_slack_message() {
local MESSAGE=$1
local MESSAGE_TIME=$2
local TAG_NAME=$3
local PRIVATE_IP=$4
local PAYLOAD=$(cat <<EOF2
{
"username": "ecs-process 알람",
"icon_url": "$IMAGE_URL",
"attachments": [
{
"fallback": "$MESSAGE",
"color": "#FF0000",
"text": "$MESSAGE",
"fields": [
{"title": "발생시각", "value": "$MESSAGE_TIME", "short": true},
{"title": "인스턴스 명", "value": "$TAG_NAME", "short": true},
{"title": "Private IP", "value": "$PRIVATE_IP", "short": true}
]
}
]
}
EOF2
)
curl -X POST -H 'Content-type: application/json' --data "$PAYLOAD" $SLACK_WEBHOOK_URL
}
# 인스턴스 정보
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
PRIVATE_IP=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)
TAG_NAME=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].Tags[?Key==`Name`].Value' --output text)
# ECS Agent 상태체크
ECS_STATUS=$(systemctl is-active ecs)
if [ "$ECS_STATUS" != "active" ]; then
systemctl start ecs
MESSAGE_TIME=$(date '+%Y-%m-%d %H:%M:%S KST')
MESSAGE="ECS agent inactive 상태 확인 프로세스 재시작 완료."
echo $MESSAGE >> $LOG_FILE
send_slack_message "$MESSAGE" "$MESSAGE_TIME" "$TAG_NAME" "$PRIVATE_IP"
fi
슬랙 알람 사진
댓글