[v8.7] Elasticsearch/Kibana/Fleet/Elastic Agentをdocker-composeでインストールする手順（試用用途）

# はじめに
下記の記事にて`docker-compose`を使ってElasticsearchとKibanaを構成する方法を説明しました。
https://qiita.com/takeo-furukubo/items/c2f194679afadc06a4e9

今回は更に一歩進んでFleetを設定する方法を説明します。
これにより手元環境でElastic Solutionsを試すことができるようになります。

# Fleetとは？
https://www.elastic.co/guide/en/fleet/current/fleet-server.html
Elastic Agentの管理プレーンです。その実体はElastic Agentです（ややこしい・・）
Elastic Agentの説明についてはこちらをご覧ください。
https://qiita.com/yukshimizu/items/abec12ac46749db46b40

Fleetを立ててそこにElastic Agentを登録するとKibanaの画面からバージョンアップや設定の変更を行うことが出来るようになります。

## 本手順を試した環境
- クラウド：GCP
- OS: Ubuntu 18.04.6 LTS
- スペック: e2-standard-2インスタンス (2 vCPU, 8GB mem)
- Docker version 23.0.5, build bc4487a
- docker-compose version 1.29.2, build 5becea4c

## ドキュメント
基本はこちらですが、`docker-compose.yaml`ファイルは記載されておりません。
https://www.elastic.co/guide/en/fleet/current/fleet-server.html

## 設定ファイル
Gitからクローンしてください。
https://github.com/legacyworld/elasticstack

singlenodeとmultinodeの２つのディレクトリができますが、今回はsinglenodeです。
`docker-compose_with_fleet.yml`を`docker-compose.yml`にコピーして使います。
### `docker-compose.yml`

`docker-compose`ファイルがかなり長くなっています。
[前回](https://qiita.com/takeo-furukubo/items/c2f194679afadc06a4e9#docker-composeyml)から変わっているところを中心に説明していきます。
```yaml
version: "2.2"

services:
  setup:
    profiles:
      - first
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
...(略)
        if [ ! -f config/certs/certs.zip ]; then
          echo "Creating certs";
          echo -ne \
          "instances:\n"\
          "  - name: es01\n"\
          "    dns:\n"\
          "      - es01\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          "  - name: fleet\n"\
          "    dns:\n"\
          "      - fleet\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
...(略)
  es01:
    profiles:
      - first
...(略)
  kibana:
    profiles:
      - first
...(略)
  fleet:
    profiles:
      - fleet
    image: docker.elastic.co/beats/elastic-agent:${STACK_VERSION}
    container_name: fleet
    restart: always
    user: root # note, synthetic browser monitors require this set to `elastic-agent`
    ports:
      - ${FLEET_PORT}:8220
    environment:
      - FLEET_ENROLL=0
      - FLEET_INSECURE=1
      - FLEET_URL=https://${HOST_IP}:${FLEET_PORT}
      - FLEET_SERVER_ENABLE=true
      - FLEET_SERVER_ELASTICSEARCH_HOST=https://${HOST_IP}:${ES_PORT}
      - FLEET_SERVER_POLICY=fleet-server-policy
      - FLEET_SERVER_SERVICE_TOKEN=${FLEET_SERVER_SERVICE_TOKEN}
      - ELASTICSEARCH_CA=/usr/share/fleet/config/ca/ca.crt
      - FLEET_CA=/usr/share/fleet/config/ca/ca.crt
      - CERTIFICATE_AUTHORITIES=/usr/share/fleet/config/ca/ca.crt
      - FLEET-SERVER-CERT=/usr/share/fleet/config/fleet/fleet.crt
      - FLEET-SERVER-CERT-KEY=/usr/share/fleet/config/fleet/fleet.key
      - FLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT=${FLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT}
    volumes:
      - certs:/usr/share/fleet/config/
  elastic-agent:
    profiles:
    - agent
    image: docker.elastic.co/beats/elastic-agent:${STACK_VERSION}
    container_name: elastic-agent
    restart: always
    user: root
    environment:
    - FLEET_ENROLLMENT_TOKEN=${FLEET_ENROLLMENT_TOKEN}
    - FLEET_ENROLL=1
    - FLEET_INSECURE=1
    - FLEET_URL=https://fleet:8220
```
以下の部分が変更になっています。
- profile
    - これは`docker-compose`でコンテナを立ち上げるときに、どれを立ち上げるか選択するためのものです。
    - Fleetを設定するためにはまずElasticsearchを立ち上げていくつか設定を変更する必要があります
- fleetの証明書作成
- fleetのEnvironment設定

### .envファイル
```
STACK_VERSION = 8.7.0
ELASTIC_PASSWORD = elastic
KIBANA_PASSWORD = elastic
ES_PORT = 9200
CLUSTER_NAME = mac
LICENSE = trial
MEM_LIMIT = 2147483648
KIBANA_PORT = 5601
FLEET_PORT = 8220
HOST_IP = <ip address>
FLEET_SERVER_SERVICE_TOKEN = <Service Token>
FLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT = <Finger Print>
FLEET_ENROLLMENT_TOKEN = <Enrollment Token>
```
- HOST_IP
    - コンテナの外からElastic Agentを設定する際に必要になります
- FLEET_SERVER_SERVICE_TOKEN
    - Fleetを登録する際に必要です
    - Kibanaで取得します
- FLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT
    - Elasticsearch Outputの設定に使用します
    - Elasticsearchコンテナでコマンドを実行して取得します
- FLEET_ENROLLMENT_TOKEN
    - Elastic AgentをFleetに登録する際のTokenです

# 手順
## Elasticsearch / Kibana起動
`.env`ファイルの`KIBANA_PORT`より上の部分を正しく記載したら下記コマンドを実行します
`docker-compose --profile first up -d`
その後`https://${HOST_IP}:${KIBANA_PORT}`へアクセスして起動を確認します。

うまくいかなくて一度停止したい場合は
`docker-compose.yml`ファイルのある場所で`docker-compose down -v`
volumeも一緒に消しておきます。

## FingeprintとCAの取得
`fleet.sh`ファイルを実行すると下記のようになります。
この実行結果をコピペして後ほど使います。

```
$ ./fleet.sh 
SHA256 Fingerprint=14232D66E884346F573D82B1746D6697F171114EDA5640F7CE36BF94D7BE06D3
ssl:
 certificate_authorities:
 - |
    -----BEGIN CERTIFICATE-----
    MIIDSjCCAjKgAwIBAgIVAJH/WfHyUTMqXdBVV2itgbkWlz8JMA0GCSqGSIb3DQEB
...(略)
    BX30eBuzhpQRnq/gI7t8ejdUbcsxlvuOadFMMvQU
    -----END CERTIFICATE-----
```
`fleet.sh`の２行目以降ではCAファイルを読み取って、YAML形式で出力するようになっています。

## Outputの設定
Elastic Agentがどこにデータを送るかという設定です。
ElasticsearchとLogstashを設定できます。
左のメニューからManagement -> Fleetをクリックして、Settingsタブをクリックします。
![スクリーンショット 2023-05-02 10.11.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/f1650b71-77df-5691-307b-a250d2dee940.png)

Outputの右端のActionsの下にある鉛筆マークをクリックして編集モードに入ります。
![スクリーンショット 2023-05-01 17.52.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/c8063e16-2837-6151-3ef5-ff58c6bdd99a.png)

- Hosts
    - `https://${HOST_IP}:${ES_PORT}`を入力
- Elasticsearch CA trusted fingerprint (optional)
    - 先程のfleet.shの実行結果の１行目の"="の右側
- Advanced YAML configuration
    - 先程のfleet.shの実行結果の２行目以降をそのままコピペ

入力したら"Save andd apply settings"をクリックして保存

## Fleetサーバ追加
"Add Fleet Server"をクリックします。
![スクリーンショット 2023-05-01 14.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/2270a1cd-0c2e-e7ac-4676-799028355d49.png)
- Name
    - 自由に入力
- URL
    - https://HOST_IP:FLEET_PORTを入力

上記を入力後、"Generate Fleet policy"をクリックして暫く待つと以下のような画面になります。
![スクリーンショット 2023-05-02 10.57.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/7853ca28-269f-6427-6be3-f38caf1b4b9d.png)

以下の２つの値を`.env`に設定します。
- `--fleet-server-service-token=`の右側の文字列をコピーして、`.env`ファイルの`FLEET_SERVER_SERVICE_TOKEN`に貼り付けます。
- `--fleet-server-es-ca-trusted-fingerprint=`の右側の文字列をコピーして、`.env`ファイルの`FLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT`に貼り付けます

## Fleetサーバ起動
以下のコマンドを実行します
`docker-compose --profile fleet up -d`

暫くすると以下のように登録が完了します。
![スクリーンショット 2023-05-02 10.28.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/5305f847-d5d9-5436-50c0-a9b838cd7e01.png)

### データの確認
左側のメニューからAnalytics -> Discoverをクリックします。
左上のDataviewが"logs-*"となっているはずです。
![スクリーンショット 2023-05-02 10.31.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/6ce84771-3ccf-274c-aa55-5a62306fc6a5.png)
ここで何も出てこない場合、何らか失敗している可能性があります。
左側のメニューからManagement -> Fleetをクリックすると登録されたFleetサーバが表示されます。
![スクリーンショット 2023-05-02 10.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/74f7d769-33be-4440-897f-a4ffe30b8da6.png)

### うまく行かない場合の確認
- コンテナの状態の確認
```
# docker-compose  ps
       Name                     Command                  State                             Ports                       
-----------------------------------------------------------------------------------------------------------------------
es01                 /bin/tini -- /usr/local/bi ...   Up (healthy)   0.0.0.0:9200->9200/tcp,:::9200->9200/tcp, 9300/tcp
fleet                /usr/bin/tini -- /usr/loca ...   Up             0.0.0.0:8220->8220/tcp,:::8220->8220/tcp          
kibana               /bin/tini -- /usr/local/bi ...   Up (healthy)   0.0.0.0:5601->5601/tcp,:::5601->5601/tcp          
singlenode_setup_1   /bin/tini -- /usr/local/bi ...   Exit 0 
```
- コンテナログの確認
`docker-compose logs fleet`でログを確認して、X509関係のエラーがないかどうか確認する

## Elastic Agentの登録
### Docker ContainerとしてElastic Agentを起動
#### Policyの作成
Management -> Fleetをクリックして、Agent Policiesタブを選んで"Create Agent policy"をクリック
![スクリーンショット 2023-05-01 14.50.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/f116b65c-4e2f-d37f-25dd-1e5119a2b2d3.png)

Nameに"agent_in_docker"(識別できればなんでも良い)を入力して、右下の"Create Agent policy"をクリックして保存
![スクリーンショット 2023-05-01 14.51.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/1e3a074f-b8be-2737-db43-0fee3f556003.png)

今追加した"agent_in_docker"が表示されるのでそれをクリック
![スクリーンショット 2023-05-01 14.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/1ad80e7d-9b7f-c016-4590-c7a376f12c65.png)

右上にある"Add agent"をクリック
![スクリーンショット 2023-05-02 10.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/491cf554-ee60-3158-5409-f7a99b90ae14.png)

"--enroll"の右側の文字列をコピーして、`.env`ファイルの`FLEET_ENROLLMENT_TOKEN`に設定します。
![スクリーンショット 2023-05-01 14.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/ee66fdda-b647-ed3c-a691-ab05926ed16a.png)

#### Elastic Agent起動
`docker-compose --profile agent up -d`
Fleetに登録できれば以下のようになります。
![スクリーンショット 2023-05-01 14.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/5a361f13-4c46-f435-00b4-ccbbf803704c.png)
うまく行かない場合は`docker-compose ps`や`docker-compose logs elastic-agent`で確認してみましょう。

Agent一覧に追加されました。
![スクリーンショット 2023-05-01 14.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/efaf3e20-9fc1-94a2-2064-729163a71f7e.png)

### ホスト上でElastic Agentを起動

#### policyの作成
コンテナとして起動したときと同様にPolicyを作成します。
名前はわかるようにしておきましょう(agent_on_vmなど)
#### Elastic Agent起動
先程と異なるのはホスト上でインストールすることです。まずは自動的に用意されたコマンドをコピーしましょう。
"Add Agent"のダイアログウィンドウでコマンドが表示されていて、右上のアイコンを押すとコピーされます。
![スクリーンショット 2023-05-02 11.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/c2cae054-b30b-6f20-7015-e75bb70d03de.png)

上記でコピーしたコマンドをホストのターミナルに貼り付けるとAgentをダウンロード・解凍・ディレクトリ変更まで行われます。
最後のインストールはまだ実行しないでください（失敗します）
##### インストールコマンド変更
最後のコマンドの最後に`--insecure`を追加してから実行します。
```
sudo ./elastic-agent install --url=https://10.146.0.53:8220 --enrollment-token=a0ZiazFZY0JCdW9qRkVJODFSRVE6b2RxdDlJMXdRWGVsTUh1ZkIyTUdnZw== --insecure
```
問題なければ以下のように登録されたAgentが３つになります。(`takeo-docker-vm`がホストにインストールされたもの)
![スクリーンショット 2023-05-01 15.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/3d20c116-9e6e-2898-322e-825ccfb55b74.png)

下記のエラーが表示される場合は一度アンインストールしてください。
```
{"log.level":"info","@timestamp":"2023-05-02T02:32:22.965Z","log.origin":{"file.name":"cmd/enroll_cmd.go","file.line":271},"message":"Elastic Agent might not be running; unable to trigger restart","ecs.version":"1.6.0"}{"log.level":"info","@timestamp":"2023-05-02T02:32:22.965Z","log.origin":{"file.name":"cmd/enroll_cmd.go","file.line":271},"message":"Elastic Agent might not be running; unable to trigger restart","ecs.version":"1.6.0"}
```
アンインストールは下記のコマンドです。
`sudo /opt/Elastic/Agent/elastic-agent uninstall`
#### Docker Integrationを入れる
ホストにAgentがあるのでDockerのデータも集めてみます。
Management -> Fleet -> Agent policiesで先程作成したpolicy(agent_on_vm)をクリックして、右上の"Add Integration"をクリック
![スクリーンショット 2023-05-02 11.24.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/32a57c51-6ef1-6ec3-b926-ef9eedde996e.png)

Integrationの検索画面が表示されるので検索ボックスに"docker"と入力して、表示された"Docker"をクリック
![スクリーンショット 2023-05-01 14.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/f9532104-dc6e-a7f5-91b9-6f1806d8764c.png)

Docker Integrationの説明が表示されるので、右上の"Add Docker"をクリック
![スクリーンショット 2023-05-01 15.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/49cac8f7-aa7e-d192-4404-dee21f2a0320.png)

いろいろ細かい設定が表示されるが、そのままにして右下の"Save and continue"をクリック
![スクリーンショット 2023-05-01 15.00.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/bcdf34c5-7572-baaf-9f96-852948e62098.png)

Elastic Agentの設定を変更することになるので、確認のダイアログが立ち上がったら"Save and deploy changes"をクリックする
![スクリーンショット 2023-05-02 11.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/e1480f47-1fc7-fcca-c65d-038668c76638.png)

これでDockerの情報を集め始めるので、しばらく待ってから左側のメニューからObservability -> Infrastructure -> Inventoryをクリックして、"Show"のドロップダウンメニューから”Docker Containers"を選ぶと、下図のようにコンテナが表示されます。
![スクリーンショット 2023-05-01 15.04.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/504e6b58-dd23-5b12-4560-3272f2a136d8.png)

## 停止
`docker-compose.yml`ファイルのある場所で`docker-compose down -v`
Volumeも消します

## 削除
全てのコンテナイメージやボリュームなどまとめて消したい場合は停止後に`docker system prune -a`
勿論Elasticsearch以外も消してしまいますのでご注意を。

# 最後に
本手順が完了すればオンプレでElastic Agentを試すことが出来るようになります。
今後以下のような内容で記載する予定です。
- Elasticsearchを複数立ち上げる
- Master Dedicatedを立ち上げる

### Elastic Cloud 無料トライアル
こちらからElastic Cloudの14日間無料トライアルを是非お試しください
[Elastic Cloud 無料トライアル](https://cloud.elastic.co/)

手順は下記リンクをご参照ください
[Elastic Cloud について　〜実際にデプロイメントを作ってみよう〜](https://qiita.com/tomo_s_el/items/3584d0b1fabb0bafa4fa)