Elasticsearch Service (6.0/6.2) に取り込んだログ（INDEX）をCuratorで削除するメモ

**2020/01/07 追記：**

Python 3.8 / Elasticsearch Service 6.8 対応版アップデート記事はこちらです。

 - **[Elasticsearch Service 6.8 に取り込んだログ（INDEX）を Curator で削除するメモ（Lambda Python 3.8 版）](https://qiita.com/hmatsu47/items/44bee74722d9405a87aa)**

---

Elasticsearch Service (6.0/6.2) 小ネタメモシリーズは、100番煎じ？の**「Curator on Lambdaでログ（INDEX）削除」**でシメたいと思います。

 * **[ALB/CLBのアクセスログをElasticsearch Service (6.0/6.2) に取り込むメモ](https://qiita.com/hmatsu47/items/826b00ff008d4e3edecf)**
 * **[CloudFrontのアクセスログをElasticsearch Service (6.0/6.2) に取り込むメモ（手抜き編）](https://qiita.com/hmatsu47/items/552ec1e4bc8e43051d9e)**
 * **[TABLE形式のAurora（MySQL互換）スロークエリログをElasticsearch Service (6.0/6.2) に取り込みS3に保存するメモ](https://qiita.com/hmatsu47/items/8c92b1a43fd412c054cf)**

で取り込んだログ（INDEX）を、一定期間経過後に削除するものです。

※当然ですが、Elasticsearch Service が起動していて、既に削除すべきログ（INDEX）が存在することが前提です。

# 手順

## 1. IAM Role の確認／作成

すでに IAM Role が作成されていれば問題ないのですが、なければ作成します。

 * **[IAM Role の作成](https://qiita.com/hmatsu47/items/826b00ff008d4e3edecf#iam-role-%E3%81%AE%E4%BD%9C%E6%88%90)（前述の ALB/CLB 取り込みメモより）**

## 2. AWS Lambda ファンクションの作成

### Lambda にアップロードする .zip ファイルの作成

`elasticsearch-curator`が必要なので、今回も .zip ファイルとしてあらかじめ用意します。`elasticsearch-curator`をインストールしたディレクトリに Lambda ファンクションの内容を記述して`.zip`化します。

なお、Elasticsearch Service (6.0/6.2) に対応するのは Curator 5 です。

 * **[Version Compatibility](https://www.elastic.co/guide/en/elasticsearch/client/curator/current/version-compatibility.html)（Curator Reference [5.5] | Elastic）**

今回は Curator 5.5.2 を使いました。

```bash:実行例
$ mkdir ~/logrotate
$ pip2 install elasticsearch-curator -t ~/logrotate/
※環境によって「pip」「pip2」など
$ cd ~/logrotate
$ vi logrotate.py
※Lambda ファンクションの内容を記述して保存
$ zip -r ../logrotate.zip *
```

```python:Lambdaファンクションの内容
import boto3
import curator
import os
from elasticsearch import Elasticsearch, RequestsHttpConnection
from requests_aws4auth import AWS4Auth

es_host = os.environ["ES_HOST"]
es_index = os.environ["ES_INDEX_PREFIX"] + "-"
rotation_period = int(os.environ["ROTATION_PERIOD"])
region = os.environ["AWS_REGION"]

def lambda_handler(event, context):
    awsauth = AWS4Auth(
        os.environ["AWS_ACCESS_KEY_ID"],
        os.environ["AWS_SECRET_ACCESS_KEY"],
        region,
        "es",
        session_token=os.environ["AWS_SESSION_TOKEN"]
    )

    es = Elasticsearch(
        hosts=[{"host": es_host, "port": 443}],
        http_auth=awsauth,
        use_ssl=True,
        verify_certs=True,
        connection_class=RequestsHttpConnection
    )
    runCurator(es)


def runCurator(es):
    ilo = curator.IndexList(es)
    ilo.filter_by_regex(kind="prefix", value=es_index)
    ilo.filter_by_age(source="name", direction="older", timestring="%Y%m%d", unit="days", unit_count=rotation_period)
    delete_indices = curator.DeleteIndices(ilo)
    delete_indices.do_action()
```

### Lambda ファンクションの作成

先ほどの`.zip`ファイルをアップロードする形で作成します。
![curator-log-rotate-1.png](https://qiita-image-store.s3.amazonaws.com/0/123899/d623564d-5bd4-e459-a011-bd8c9d3c7f08.png)
ランタイムは Python 2.7、ハンドラは`【アップロードしたファイル名】.lambda_handler`を指定します。

環境変数の設定は以下の通りです。
![curator-log-rotate-2.png](https://qiita-image-store.s3.amazonaws.com/0/123899/aba1a729-7823-bccd-abc4-08ab7ef81ca3.png)
`ES_INDEX_PREFIX`で削除対象のログ（INDEX）のプレフィックス、`ROTATION_PERIOD`で削除するまでの期間（日数）を指定します。

トリガーは「CloudWatch Events」で cron 式を使って、00:00 UTC を過ぎたあたりの時刻に、毎日実行するよう指定すると良いでしょう（画面は省略）。

実行ロールは最初に確認／作成したものを使います。タイムアウトの時間も延長しておきます。
![curator-log-rotate-3.png](https://qiita-image-store.s3.amazonaws.com/0/123899/27de0b06-7049-7713-4e4c-244c43a23483.png)

ネットワークの設定は環境に合わせます。VPC を使う場合は、先の記事を参考にしてください。

# 補足

まだ削除対象のログ（INDEX）がない場合はエラーが発生しますが、異常ではありません。