Elasticsearch version8 におけるAPIの認証の通し方

# はじめに
Elasticsearchがversion8になってからcurlコマンドが実行できなくなったことはありませんか？
```shell
$ curl -s http://localhost:9200/
```
実行結果
```json
{
   "error":{
      "root_cause":[
         {
            "type":"security_exception",
            "reason":"missing authentication credentials for REST request [/]",
            "header":{
               "WWW-Authenticate":[
                  "Basic realm=\"security\" charset=\"UTF-8\"",
                  "ApiKey"
               ]
            }
         }
      ],
      "type":"security_exception",
      "reason":"missing authentication credentials for REST request [/]",
      "header":{
         "WWW-Authenticate":[
            "Basic realm=\"security\" charset=\"UTF-8\"",
            "ApiKey"
         ]
      }
   },
   "status":401
}
```

今回はそれの解決方法です．

# 検証環境
- Ubuntu 22.04.2 LTS
    - `lsb_release -a`[^1]
- Elasticsearch 8.10.3
- curl 7.81.0-1ubuntu1.14
    - `apt list --installed | grep curl`[^2]
- Python 3.10.12
    - `python3 -V`


# 解決方法
解決方法はElasticsearchのユーザー名とパスワードを入力することです．
下にElasticsearchのパスワードが分からない人向けのパスワードのリセットの方法を載せますね[^3]．

## Elasticsearchのパスワードのリセット
Elasticsearchのパスワードをリセットするコマンド
```shell
$ sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
```
実行結果
```shell-session
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y


Password for the [elastic] user successfully reset.
New value: ＜新しいパスワード＞
```

```shell
$ export ELASTIC_PASSWORD="＜新しいパスワード＞"
```
注意：`export`はshellから抜けると代入した変数が消えます．

## 確認
`curl`を用いて疎通確認をする．
```shell
$ curl -u elastic:$ELASTIC_PASSWORD -s http://localhost:9200/
```
実行結果
```json
{
  "name" : "＜ホスト名＞",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "＜クラスターのID＞",
  "version" : {
    "number" : "8.10.3",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "c63272efed16b5a1c25f3ce500715b7fddf9a9fb",
    "build_date" : "2023-10-05T10:15:55.152563867Z",
    "build_snapshot" : false,
    "lucene_version" : "9.7.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
```
これでElasticsearchのAPIを`curl`コマンドで使うことができます．

### Pythonで確認（おまけ）

`curl`でやったことと同様のことをPythonでやってみます．requestsモジュールでBasic認証をしています[^4]．

```python:elastic_requests.py
import requests
from requests.auth import HTTPBasicAuth
import json

elastic_url = 'http://localhost:9200/'

# Basic Authentication
# https://requests.readthedocs.io/en/latest/user/authentication/
basic = HTTPBasicAuth('elastic', '＜新しいパスワード＞')
headers = {
    'Content-Type': 'application/json',
}

response = requests.get(elastic_url, auth=basic, headers=headers)
print(json.dumps(response.json(), indent=4))
```

```shell
$ python3 elastic_requests.py
```

実行すると`curl`と同じ結果が得られます．

実行結果
```json
{
  "name" : "＜ホスト名＞",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "＜クラスターのID＞",
  "version" : {
    "number" : "8.10.3",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "c63272efed16b5a1c25f3ce500715b7fddf9a9fb",
    "build_date" : "2023-10-05T10:15:55.152563867Z",
    "build_snapshot" : false,
    "lucene_version" : "9.7.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
```

# 参考サイト
[1]:https://www.server-memo.net/ubuntu/ubuntu_version.html#:~:text=%E3%80%8Clsb_relase%20%2Da%E3%80%8D%20%E3%80%8Clsb_release,%E3%81%95%E3%81%9B%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E5%87%BA%E6%9D%A5%E3%81%BE%E3%81%99%E3%80%82
[^1]: [Ubuntuのバージョンを確認する方法 | server-memo.net][1]

[2]:https://atmarkit.itmedia.co.jp/ait/articles/1709/01/news025.html
[^2]:[【apt】コマンド（応用編）-パッケージを検索する：Linux基本コマンドTips（140） - ＠IT][2]

[3]:https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
[^3]:[Install Elasticsearch with Docker | Elasticsearch Guide 8.11 | Elastic][3]

[4]:https://requests.readthedocs.io/en/latest/user/authentication/
[^4]:[Authentication — Requests 2.31.0 documentation][4]