인덱스삭제 (1)

💻 Programming

AWS Elasticsearch ISM을 활용한 인덱스 자동삭제

안녕하세요 오랜만에 포스팅을 하게 되었습니다.

 

한동안 노가다성 작업만 하다보니 딱히 포스팅할 만한 내용이 없었네요.

 

오늘은 AWS Elasticsearch(이하 ES)의 인덱스를 자동으로 삭제하는 방법에 대해서 알려드립니다.

 

저는 AWS ES를 로깅을 위해서 사용하고 있습니다. 로그 검색 속도가 빨라 디버깅시 원인파악을 빠르게 할 수 있어서 좋죠. 특정 트래킹 ID로 특정 프로세스의 로그들을 하나로 묶어주면 해당 프로세스의 로그만 검색이 가능하여 편리합니다.

 

아무튼, 이렇게 로그를 쌓기 위해서 사용하는 ES가 용량이 부족해지면 별다른 에러나 알람을 주지않고 더이상 로그가 쌓이지 않게되는 현상이 있습니다. 운영 환경에서는 그런 일이 없도록 하기 위해서 큐레이터 설정을 하여 사용중입니다. 이 설정은 인프라 전문팀과 논의하여 설정을 했었습니다. 큐레이터를 이용하려면 좀 귀찮은 작업들이 수반됩니다. 그래서 개발환경에서는 큐레이터 설정 없이 수동으로 가끔씩 인덱스를 삭제해주곤 했죠. ES 버전이 올라가면서 이제는 키바나에서 간단히 설정해주면 자동으로 특정 기간이 지난 인덱스를 삭제할 수 있게끔 되었습니다. 참고로 오리지날 ES에서는 이 기능을 ILM (Index Lifecycle Management) 기능이라고 부르는데 AWS에서는 ISM (Index State Management)라고 합니다.

 

우선 제가 사용중인 AWS ES 버전은 7.9 입니다. 동일한 7.9 버전이라도 패치버전에 따라 키바나 메뉴가 조금 상이합니다.

상이한 메뉴는 각각 스샷첨부드리겠습니다.

 

이제부터 우리가 할 것은 30일이 지난 인덱스를 자동으로 삭제하는 설정을 하는 것입니다.

작업은 3스텝으로 진행합니다.

  1. ISM 정책 생성
  2. 기존 인덱스들에 생성한 정책 적용
  3. 신규 인덱스들에 정책 적용

 

우선 키바나에 접속해서 메뉴를 살펴보겠습니다.

구 버전(좌) 메뉴와 최신 버전(우) 메뉴

 좌측은 패치버전이 구버전인 케이스이고, 우측이 최신버전 (게시글 작성일 기준 R20210331) 패치를 적용한 키바나 메뉴입니다.

 

여기서 Index Management 메뉴를 선택하여 들어갑니다.

그러면 또 메뉴가 아래처럼 다르게 나옵니다.

구 버전(좌) 메뉴와 최신 버전(우) 메뉴

좌측 처럼 메뉴가 나올 경우 Index Policies 메뉴를 선택, 우측 처럼 메뉴가 나올 경우 State management policies 메뉴를 선택합니다.

 

그 다음부터는 거의 동일합니다.

구 버전 스샷
신 버전 스샷

제목만 다를 뿐 내용은 모두 동일합니다. 여기서 create policy를 선택합니다.

 

Name policy 에는 원하는 이름을 명명해주시면 됩니다. 저는 30일이 지난 인덱스를 삭제한다는 의미로 delete_old_indexes_30d라고 명명했습니다. 그리고 define policy 에는 아래 json 포멧 데이터를 적어주시면 됩니다.

{
    "policy": {
        "policy_id": "delete_old_indexes_30d",
        "description": "delete old indexes",
        "default_state": "hot",
        "states": [
            {
                "name": "hot",
                "actions": [],
                "transitions": [
                    {
                        "state_name": "delete",
                        "conditions": {
                            "min_index_age": "30d"
                        }
                    }
                ]
            },
            {
                "name": "delete",
                "actions": [
                    {
                        "delete": {}
                    }
                ],
                "transitions": []
            }
        ]
    }
}

지금 우리는 인덱스 상태를 관리하는 설정을 하는 것입니다. 따라서 policy 내에 상태에 대한 정의를 해주고 있습니다.

policy_id는 Name policy에 명명해주었던 이름을 그대로 사용하고, default_state 를 hot 이라는 상태로 설정해주었습니다.

여기서 우리는 두 가지 상태를 정의해서 사용하고 있습니다. hot 과 delete.

인덱스의 기본상태로는 hot을 정의를 해주었고 그 상태의 인덱스들은 transitions에 설정되어있는 조건에 따라 상태를 변경하게 됩니다. 즉 max_index_age가 30d (30일)이 지나면 상태를 delete로 변경(transition)하게 되죠. 그렇게 delete 상태가 된 인덱스들은 delete 상태 정의의 actions에 있는 delete 설정으로 인해 삭제되게 됩니다.

 

이제 ISM 정책 생성을 완료하였습니다.

이렇게 정책을 생성한 뒤에는 기존 인덱스들에 대해서 해당 정책을 적용해주어야 합니다.

정책을 저장한 뒤에 좌측 메뉴에서 Indices 로 들어가보면 현재 인덱스들 목록이 출력됩니다.

인덱스 목록

목록에서 하나 이상의 인덱스를 선택하면 우상단의 Apply policy 버튼이 활성화 됩니다. 버튼을 클릭하면 정책이 반영되고 새로고침을 해보시면 Managed by Policy 값이 No 에서 Yes로 변경됩니다. .kibana 인덱스처럼 잘 모르면 건들지 말아야하는 인덱스들도 여기 목록에 조회가 되기 때문에 전체 선택하여 정책을 적용시킬 때에는 그런 인덱스들이 포함되어있지 않은지 잘 확인하셔야 합니다. 만약 잘못 적용했다면 적용 취소도 가능합니다.

정책을 적용한 인덱스들을 여기서는 Managed Index라고 부릅니다. 따라서 적용을 취소하려고 할 때에는 Managed Indices 또는 Policy managed indices 메뉴로 들어가서 인덱스를 조회하여 처리합니다.

구 버전 화면
최신 버전 화면 (R20210331)

인덱스를 선택하고 Remove policy(삭제) 하거나 Change policy(변경)이 가능합니다.

 

이상으로 AWS ES에서 ISM을 활용하여 인덱스 자동삭제 정책을 생성 및 적용하는 방법을 알아보았습니다.

 

 

 

궁금한 점이나 잘못된 내용이 있다면 언제든지 댓글달아주세요~

 

감사합니다.