esの手動バックアップリストア

雑にメモ

## リポジトリ登録

こちらのリンクの公式手順通りregster-repo.pyを作成し実行する

https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-managedomains-snapshots.html#es-managedomains-snapshot-prerequisites

```bash:
$ python register-repo.py
```

```python:
import boto3
import requests
from requests_aws4auth import AWS4Auth

host = 'https://xxxxx.ap-northeast-1.es.amazonaws.com' # include https:// and trailing /
region = 'ap-northeast-1' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)

# Register repository

path = '_snapshot/my-snapshot-repo1' # the Elasticsearch API endpoint
url = host + path

payload = {
  "type": "s3",
  "settings": {
    "bucket": "es-snapshot-xxxx",
    # "endpoint": "s3.amazonaws.com", # for us-east-1
    "region": "ap-northeast-1", # for all other regions
    "role_arn": "arn:aws:iam::xxxxxxxxxxxx:role/TheSnapshotRole"
  }
}

headers = {"Content-Type": "application/json"}

r = requests.put(url, auth=awsauth, json=payload, headers=headers)

print(r.status_code)
print(r.text)

```


これだけだと、以下のエラーが出る

```
$ python register-repo.py
403
{"error":{"root_cause":[{"type":"security_exception","reason":"no permissions for [cluster:admin/repository/put] and User [name=arn:aws:iam::xxxxxxxxxxxx:user/uehara, backend_roles=[], requestedTenant=null]"}],"type":"security_exception","reason":"no permissions for [cluster:admin/repository/put] and User [name=arn:aws:iam::xxxxxxxxxxxx:user/uehara, backend_roles=[], requestedTenant=null]"},"status":403}
```

https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/fgac.html#fgac-snapshots

一部「manage_snapshots ロールを、TheSnapshotRole を引き受ける iam:PassRole アクセス許可を持つ IAM ロールにマッピングする必要があります。」の作業が必要で、以下のようにKibanaのRoleのmanage_snapshotにUserとBackend rolesをマッピングする

![スクリーンショット 0002-08-18 10.12.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/049eb9f6-4533-110d-8003-077aba72644f.png)

これでackがtrueで返ってきた

```bash:
$ python register-repo.py
200
{"acknowledged":true}
```

## リポジトリの確認

```
GET /_cat/repositories?v

GET /_snapshot/
```

リポジトリを削除したい時。取得済スナップショットがあれば事前にスナップショットの削除が必要

```
DELETE /_snapshot/my-snapshot
```

## スナップショット(バックアップ)

```
###スナップショットリポジトリ情報
GET _snapshot/

###スナップショット実行中のステータス。スナップショットが終われば何も返ってこない
GET /_snapshot/_status

###全インデックスのスナップショット
PUT /_snapshot/my-snapshot-repo1/snapshot-test1

###取得した任意のスナップショットの情報表示(インデックス情報とか)
GET /_snapshot/my-snapshot-repo1/<snapshot-name>

###取得した全てのスナップショットの情報表示(インデックス情報とか)
GET /_snapshot/my-snapshot-repo1/_all
```

## リストア

```
###インデックス削除(必要なら)
DELETE /log-aws-cloudtrail-2020-08-16

##全体リストアは失敗する
##Kibana ときめ細かなアクセス制御インデックスに対する特別なアクセス許可により、特に自動スナップショットから復元しようとする場合は、すべてのインデックスを復元しようとすると失敗することがあります。

POST /_snapshot/my-snapshot-repo1/snapshot-test1/_restore

POST /_snapshot/my-snapshot-repo1/snapshot-test1/_restore
{"indices": "log-aws-cloudtrail-2020-08-16"}
```

## インデックス指定でスナップショット(バックアップ)

```
PUT /_snapshot/my-snapshot-repo1/snapshot-log-aws-cloudtrail-2020-08-31?wait_for_completion=true
{
    "indices": "log-aws-cloudtrail-2020-08-31",
    "ignore_unavailable": true,
    "include_global_state": false
}
```

```json:レスポンス
{
  "snapshot" : {
    "snapshot" : "snapshot-log-aws-cloudtrail-2020-08-31",
    "uuid" : "ZPbqk1rgQdOPunKObWktJA",
    "version_id" : 7070099,
    "version" : "7.7.0",
    "indices" : [ "log-aws-cloudtrail-2020-08-31" ],
    "include_global_state" : false,
    "state" : "SUCCESS",
    "start_time" : "2020-09-03T08:32:43.666Z",
    "start_time_in_millis" : 1599121963666,
    "end_time" : "2020-09-03T08:32:50.869Z",
    "end_time_in_millis" : 1599121970869,
    "duration_in_millis" : 7203,
    "failures" : [ ],
    "shards" : {
      "total" : 3,
      "failed" : 0,
      "successful" : 3
    }
  }
}
```

## インデックス指定でリストア

```
POST /_snapshot/my-snapshot-repo1/snapshot-test1/_restore
{"indices": "log-aws-cloudtrail-2020-08-16"}
```

## スナップショットの削除

```
###取得スナップショットの中身のインデックス情報
GET /_snapshot/my-snapshot-repo1/_all

###スナップショットを指定して削除
DELETE /_snapshot/my-snapshot-repo1/snapshot-log-aws-cloudtrail-2020-08-31
```

## 参考

Elastic社のAPIドキュメント
https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshot-restore-apis.html