Aws

Ec2 5분마다 healthcheck 하고 실패하면 종료하기

wngnl-dev 2024. 6. 17. 15:11
while true; do
	# health check
    response=$(curl --write-out "%{http_code}" --silent --output /dev/null "http://localhost:8080/health")

    if [ "$response" -ne 200 ]; then
        # 인스턴스 ID 가져오기
        token=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
        Instance_ID=$(curl -s -H "X-aws-ec2-metadata-token: $token" "http://169.254.169.254/latest/meta-data/instance-id")
		Instance_Name=$(aws ec2 describe-instances --instance-ids $Instance_ID --query 'Reservations[0].Instances[0].Tags[?Key==`Name`].Value' --output text)

        # 도커 컨테이너 로그 가져오기
        Container_ID=$(docker ps -a --format "{{.ID}}")
        Error_Log=$(docker logs "$container_id")

        sns_topic_arn='<SNS ARN>'
            message="$Instance_Name (ID: $Instance_ID)를 종료했습니다.\n\n$Error_Log"
            aws sns publish --topic-arn "$sns_topic_arn" --message "$message" --subject "$Instance_Name 인스턴스 종료"

        aws ec2 terminate-instances --instance-ids $Instance_ID
    fi
    
    sleep 300 # 5분 대기
done