Elasticsearch Service 6.8 に取り込んだログ（INDEX）を Curator で削除するメモ（Lambda Python 3.8 版）

Curator による取り込みログ（INDEX）削除の Elasticsearch Service 6.8 / Lambda Python 3.8 対応化メモを残しておきます。

**旧記事：**

 - **[Elasticsearch Service (6.0/6.2) に取り込んだログ（INDEX）をCuratorで削除するメモ](https://qiita.com/hmatsu47/items/e4b8a5bd44de0bee1682)**

# 手順

## 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 ファイルの作成（Amazon Linux 2 上で）

```sh:Lambda用アップロードファイル.zip化
$ python3 -m venv dev
$ . dev/bin/activate
(dev) $ mkdir logrotate
(dev) $ cd logrotate/
(dev) $ pip install elasticsearch-curator requests_aws4auth -t ./
（省略）
(dev) $ rm -rf *.dist-info
(dev) $ vi logrotate.py
（ここで「logrotate.py」のコードを入力）
(dev) $ zip -r ../logrotate.zip *
```

```python:logrotate.py
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()
```

※Python コード自体は変わりませんが、.zip ファイルの作成方法が変わっています。

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

ここから先は[旧記事](https://qiita.com/hmatsu47/items/e4b8a5bd44de0bee1682#lambda-%E3%83%95%E3%82%A1%E3%83%B3%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90)と同じ手順です。

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

※elasticsearch-curator の容量が大きくなった関係で、↑のスクリーンショットの頃とは違い、Python のコードは表示されない可能性が高いです。

 - **環境変数**

![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 を使う場合は、[ALB の元記事](https://qiita.com/hmatsu47/items/826b00ff008d4e3edecf#lambda-%E3%83%95%E3%82%A1%E3%83%B3%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90)を参考にしてください。

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