본문 바로가기

개발/Bash, Shell Script

30일이 지나면 엘라스틱서치 인덱스 삭제하기

#!/usr/bin bash

ELASTICSEARCH="http://127.0.0.1:9200"
ONEMONTHAGO=$(date --date="30 days ago" +%Y-%m-%d)
ONEMONTHAGO2=$(date --date="30 days ago" +%Y.%m.%d)

curl -X DELETE "$ELASTICSEARCH/*$ONEMONTHAGO"
curl -X DELETE "$ELASTICSEARCH/*$ONEMONTHAGO2"

위 코드는 30일이 지나면 엘라스틱서치 인덱스를 삭제하는 쉘 스크립트다. 

30일이 지난 인덱스를 모두 삭제하는 방법은

#!/usr/bin bash

# Defaults
ELASTICSEARCH="http://127.0.0.1:9200"
DATE=$(date --date="30 days ago" +%Y%m%d)
INDEX_NAME="logstash"
STANDARD=`date  -d $DATE +"%Y%m%d"`

# # Validate numeric values
# RE_DATE1="^[0-9]{4}-((0[0-9])|(1[0-2]))-(([0-2][0-9])|(3[0-1]))+$"
# RE_DATE2="^[0-9]{4}.((0[0-9])|(1[0-2])).(([0-2][0-9])|(3[0-1]))+$"

# Get the indices from elasticsearch
INDICES_TEXT=`curl -s "$ELASTICSEARCH/_cat/indices?v" | awk '/'$INDEX_NAME'/{match($0, /[:blank]*('$INDEX_NAME'.[^ ]+)[:blank]*/, m); print m[1];}' | sort -r`

if [ -z "$INDICES_TEXT" ]; then
  echo "No indices returned containing '$GREP' from $ELASTICSEARCH."
  exit 1
fi

# Delete indices
declare -a INDEX=($INDICES_TEXT)
  for index in ${INDEX[@]};do
    # We don't want to accidentally delete everything
    if [ -n "$index" ]; then
        # .*\([0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}\).* 을 \1 이랑 교체 - \1은 정규식의 그룹 중 첫 번째 그룹 = .([0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}\)
        # sed 's/\./-/g' : 을 -로 교체
        # logstash-2017-01-03XXXX -> 2017-01-03 ->  sed 's/\./-/g' 을 거치면 20170103
        # 그리고 첫번째 인풋을 print
        INDEX_DATE1=$(echo $index | sed -n 's/.*\([0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}\).*/\1/p'| sed 's/\.//g')
        INDEX_DATE2=$(echo $index | sed -n 's/.*\([0-9]\{4\}\-[0-9]\{2\}\-[0-9]\{2\}\).*/\1/p'| sed 's/\-//g')

        if [ $STANDARD -ge $INDEX_DATE1 ]; then
            curl -s -XDELETE "$ELASTICSEARCH/$index/" 
        fi
        if [ $STANDARD -ge $INDEX_DATE2 ]; then
            curl -s -XDELETE "$ELASTICSEARCH/$index/"             
        fi   
    fi
  done
exit 0