EFKスタック · 8 min read · Dec 18, 2025

Ubuntu 22.04にElasticsearch、Fluentd、Kibana (EFK) ロギングスタックをインストールする方法

ログの監視と分析は、サーバーやコンテナインフラストラクチャの重要な部分であり、複雑なアプリケーションを扱う際に役立ちます。人気のあるロギングソリューションの1つが、Elasticsearch、Fluentd、Kibana (EFK) スタックです。チュートリアルを進める前に、スタックの構成要素について学びましょう。

Elasticsearchは、リアルタイムで分散型のスケーラブルな検索エンジンで、全文検索と分析を可能にします。大量のデータをインデックス化し、検索するために使用されます。Kibanaと一緒にデプロイされることが一般的で、KibanaはElasticsearchのための強力なデータビジュアライゼーションダッシュボードです。Kibanaを使用すると、Elasticsearchのログデータを探索し、ダッシュボードやクエリを作成してアプリケーションの洞察を得ることができます。Fluentdは、ログデータを収集、変換し、Elasticsearchバックエンドに送信します。

このチュートリアルでは、Dockerを使用してUbuntu 22.04マシンにEFKスタックをインストールし、Fluentdを使用してフィルタリングおよび変換した後にコンテナログをKibanaに送信します。

前提条件

  • 最低6GBのRAMを搭載したUbuntu 22.04を実行しているサーバー。
  • sudo権限を持つ非rootユーザー。
  • 簡単なファイアウォール(UFW)が有効で実行中。
  • サーバーを指す完全修飾ドメイン名(FQDN)、例:kibana.example.com
  • すべてが更新されていること。
    $ sudo apt update && sudo apt upgrade

ステップ1 - ファイアウォールの設定

パッケージをインストールする前に、最初のステップはHTTPおよびHTTPS接続を許可するためにファイアウォールを設定することです。

ファイアウォールの状態を確認します。

$ sudo ufw status

次のような出力が表示されるはずです。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

HTTPおよびHTTPSポートを許可します。

$ sudo ufw allow http
$ sudo ufw allow https

再度状態を確認して確認します。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

ステップ2 - DockerとDocker Composeのインストール

Dockerの公式GPGキーを追加します。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

次のコマンドを実行してDockerリポジトリを追加します。

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

システムを更新してDockerのリポジトリを含めます。

$ sudo apt update

DockerとDocker Composeプラグインをインストールします。

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

このチュートリアルでは、古いレガシーバイナリの代わりにDocker Compose v2プラグインを使用します。したがって、実行するためのコマンドはdocker-composeからdocker composeに変更され、ここに反映されています。

Dockerは特権を持って実行されるため、コマンドを実行するには頻繁にsudoを使用する必要があります。より良いオプションは、Linuxユーザーアカウントをdockerユーザーグループに追加することです。

$ sudo usermod -aG docker ${USER}

${USER}変数は、現在ログインしているシステムアカウントを取得します。特権を与えたいユーザーでログインしていない場合は、${USER}をユーザー名に置き換えます。

新しいグループメンバーシップを適用するには、サーバーからログアウトして再度ログインするか、次のコマンドを使用します。ユーザーのパスワードが求められます。

$ su - ${USER}

ステップ3 - Docker Composeファイルの作成

まず、EFKプロジェクトのディレクトリを作成します。

$ mkdir ~/efk

ディレクトリに移動します。

$ cd ~/efk

docker-compose.ymlファイルを作成して編集します。

$ nano docker-compose.yml

以下のコードを貼り付けます。

services:
  # ビルドプロセス中に自動的に作成されるカスタムイメージを使用してデプロイします。
  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
    links: # 受信ログをelasticsearchコンテナに送信します。
      - elasticsearch
    depends_on:
      - elasticsearch
    ports: # ログ集約のためにTCPおよびUDPプロトコルの両方でポート24224を公開します。
      - 24224:24224
      - 24224:24224/udp

  elasticsearch:
    image: elasticsearch:8.7.1
    expose:
      - 9200
    environment:
      - discovery.type=single-node # シングルノードとして実行します。
      - xpack.security.enabled=false
    volumes: # elasticsearchデータをesdata Dockerボリュームにローカルに保存します。
      - esdata:/usr/share/elasticsearch/data

  kibana:
    image: kibana:8.7.1
    links: # kibanaサービスをelasticsearchコンテナにリンクします。
      - elasticsearch
    depends_on:
      - elasticsearch
    ports:
      - 5601:5601
    environment: # ホスト構成を定義します。
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200

# Elasticsearchコンテナのためにesdataという名前のDockerボリュームを定義します。
volumes:
  esdata:

ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。Fluentd、Elasticsearch、Kibanaのそれぞれのために3つのサービスを起動するように設定しました。

Fluentdについては、既製のイメージの代わりにコンテナをビルドします。Fluentdのビルドファイルは次のステップで設定されます。ビルドファイル用のディレクトリをマウントし、設定ファイル用のボリュームをマウントし、ログ集約のためにTCPおよびUDPプロトコルの両方でポート24224を公開しました。

次のサービスはElasticsearchで、執筆時点で利用可能な最新バージョンを使用しています。ポート9200を介して公開し、シングルノードクラスターとして実行できるようにいくつかの環境変数を設定し、セキュリティ機能を無効にしました。これは通常推奨されませんが、セキュリティを有効にすることはこのチュートリアルの範囲外です。また、Elasticsearchデータ用のローカルボリュームもマウントしました。

最後に、Kibanaを構成し、ダッシュボードにアクセスするためにポート5601を介して公開します。また、Elasticsearchホストを構成するための変数も設定しました。

ステップ4 - Fluentdビルドファイルの設定

Fluentdと設定ディレクトリを作成します。

$ mkdir fluentd/conf -p

treeコマンドを実行してディレクトリ構造を確認します。

$ tree

次のように表示されるはずです。 Tree command output

Fluentdディレクトリに移動します。

$ cd fluentd

Dockerfileを作成して編集します。

$ nano Dockerfile

以下のコードを貼り付けます。このコードはFluentd Debian Dockerイメージをプルし、Elasticsearch用のFluentdプラグインをインストールします。

# fluentd/Dockerfile
FROM fluent/fluentd:v1.16-debian-1
USER root
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-document", "--version", "5.3.0"]
USER fluent

ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。

設定ディレクトリに移動します。

$ cd conf

fluentd.confファイルを作成して編集します。

$ nano fluentd.conf

以下のコードを貼り付けます。

# fluentdをIP 0.0.0.0にバインド
# ポート24224

  @type forward
  port 24224
  bind 0.0.0.0


# elasticsearchにログを送信
# ホストはelasticsearchコンテナサービスと一致する必要があります。

  @type copy
  
    @type elasticsearch_dynamic
    hosts elasticsearch:9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    tag_key @log_name
    include_timestamp true
    flush_interval 30s
  
  
    @type stdout
  

ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。

上記のsourceディレクティブは、FluentdをTCPパケットを受け入れるTCPエンドポイントに変換するforwardプラグインを使用します。

matchディレクティブは、タグが一致するイベントを探します。この場合、すべてのイベントに一致します。ストレージにはelasticsearch_dynamicプラグインを使用し、構成値を動的に指定できるようにします。hostsフィールドは、Elasticsearchアプリケーションのホスト名を指定します。これはDocker Composeファイル内のサービス名です。logstash_formatはtrueに設定されており、Fluentdは従来の名前形式logstash-%Y.%m.%dを使用します。イベントを書き込むためのプレフィックス名はfluendに設定されています。include_tag_keyはtrueに設定されており、FluentdタグをJSON形式に追加します。tag_keyはタグを抽出するためのフィールド名です。include_timestamp変数をtrueに設定すると、ログにタイムスタンプフィールドが追加されます。flush_intervalはデータフラッシュ間の間隔を指定します。また、stdoutプラグインを使用してイベント/ログを標準出力に印刷します。

ステップ5 - Dockerコンテナを実行

EFKディレクトリに戻ります。

$ cd ~/efk

次のコマンドを使用してコンテナを起動します。

$ docker compose up -d

実行中のコンテナの状態を確認します。

$ docker ps
b3780c311154   efk-fluentd           "tini -- /bin/entryp…"   9 seconds ago   Up 8 seconds   5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp, :::24224->24224/tcp, :::24224->24224/udp   efk-fluentd-1
5a48f0a9ade1   kibana:8.7.1          "/bin/tini -- /usr/l…"   9 seconds ago   Up 7 seconds   0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                efk-kibana-1
dab3a0ab0312   elasticsearch:8.7.1   "/bin/tini -- /usr/l…"   9 seconds ago   Up 8 seconds   9200/tcp, 9300/tcp                                                                                       efk-elasticsearch-1

次のコマンドを使用してEFKビルドプロセスのログを確認します。

$ docker logs efk-fluentd-1
$ docker logs efk-kibana-1
$ docker logs efk-elasticsearch-1

Elasticsearchコンテナを検査します。コンテナの詳細設定が表示されます。

$ docker inspect efk-elasticsearch-1

コンテナに割り当てられたIPアドレスが表示されます。

[
    {
        "Id": "dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66",
        "Created": "2023-05-04T09:58:00.256169904Z",
        "Path": "/bin/tini",
        "Args": [
            "--",
            "/usr/local/bin/docker-entrypoint.sh",
            "eswrapper"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 23619,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2023-05-04T09:58:00.563700803Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:59075530be34d3a06866f894ae9735f6d739a7a751ad45efb86dec3c9bd16836",
        "ResolvConfPath": "/var/lib/docker/containers/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66/hostname",
        "HostsPath": "/var/lib/docker/containers/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66/hosts",
        "LogPath": "/var/lib/docker/containers/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66-json.log",
        "Name": "/efk-elasticsearch-1",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "efk_default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "ConsoleSize": [
                0,
                0
            ],
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "private",
            "Dns": null,
            "DnsOptions": null,
            "DnsSearch": null,
            "ExtraHosts": [],
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": null,
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": null,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "Mounts": [
                {
                    "Type": "volume",
                    "Source": "efk_esdata",
                    "Target": "/usr/share/elasticsearch/data",
                    "VolumeOptions": {}
                }
            ],
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/ee03648cf34e03601848b1769569b4d3bb7192db118102ca050215ba87060bbf-init/diff:/var/lib/docker/overlay2/51d6cfcb59e473a3f163e68984a1ba1325a2c816ed7925c4dffdefcf2e104d11/diff:/var/lib/docker/overlay2/b9c096454bda31f1cb2ea33f108be8b29b2e94827ebe94cc17563eb596b7cab1/diff:/var/lib/docker/overlay2/effe604c5b015ba02cf3b7a238bd3ff5dad7970a72e689ef5275fcf03fd0bcd1/diff:/var/lib/docker/overlay2/72fbf23251467ea2f6af8d9458c7fdd8fa3ef716eeafd9319ceff59d07d96788/diff:/var/lib/docker/overlay2/02094ec9e4ebb04371f782744a3a46852a00bf6fd7e8820d466a3576aeb9d5fc/diff:/var/lib/docker/overlay2/ce364cdd636b67e10c879aa152360d965d08fe456663ed8fbe78c3bd37bde6c7/diff:/var/lib/docker/overlay2/33bf44b475ea5ea249845b7eed75ded47dd9dc7877b9231fa4195b4753071945/diff:/var/lib/docker/overlay2/4f19bd8089599ef879075012c710ec464d8e0446fc0a0813850657dddd23a5dc/diff:/var/lib/docker/overlay2/a39a61b12d8565c6d5b33c17a04d47c8bd47609a787e0548fbac0d47d00eecc8/diff:/var/lib/docker/overlay2/cbd9d77eb9ed6b600511f9a676aab511d2aa2b3dbd18d5403559699558546996/diff",
                "MergedDir": "/var/lib/docker/overlay2/ee03648cf34e03601848b1769569b4d3bb7192db118102ca050215ba87060bbf/merged",
                "UpperDir": "/var/lib/docker/overlay2/ee03648cf34e03601848b1769569b4d3bb7192db118102ca050215ba87060bbf/diff",
                "WorkDir": "/var/lib/docker/overlay2/ee03648cf34e03601848b1769569b4d3bb7192db118102ca050215ba87060bbf/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "efk_esdata",
                "Source": "/var/lib/docker/volumes/efk_esdata/_data",
                "Destination": "/usr/share/elasticsearch/data",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "dab3a0ab0312",
            "Domainname": "",
            "User": "elasticsearch:root",
            "AttachStdin": false,
            "AttachStdout": true,
            "AttachStderr": true,
            "ExposedPorts": {
                "9200": {},
                "9200/tcp": {},
                "9300/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "xpack.security.enabled=false",
                "discovery.type=single-node",
                "PATH=/usr/share/elasticsearch/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "ELASTIC_CONTAINER=true"
            ],
            "Cmd": [
                "eswrapper"
            ],
            "Image": "elasticsearch:8.7.1",
            "Volumes": null,
            "WorkingDir": "/usr/share/elasticsearch",
            "Entrypoint": [
                "/bin/tini",
                "--",
                "/usr/local/bin/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "com.docker.compose.config-hash": "51c818791aa87ea7eccc389578c76ec4d596265eba8baefb8833bf5df13777e3",
                "com.docker.compose.container-number": "1",
                "com.docker.compose.depends_on": "",
                "com.docker.compose.image": "sha256:59075530be34d3a06866f894ae9735f6d739a7a751ad45efb86dec3c9bd16836",
                "com.docker.compose.oneoff": "False",
                "com.docker.compose.project": "efk",
                "com.docker.compose.project.config_files": "/home/navjot/efk/docker-compose.yml",
                "com.docker.compose.project.working_dir": "/home/navjot/efk",
                "com.docker.compose.service": "elasticsearch",
                "com.docker.compose.version": "2.17.3",
                "org.label-schema.build-date": "2023-04-27T04:33:42.127815583Z",
                "org.label-schema.license": "Elastic-License-2.0",
                "org.label-schema.name": "Elasticsearch",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.url": "https://www.elastic.co/products/elasticsearch",
                "org.label-schema.usage": "https://www.elastic.co/guide/en/elasticsearch/reference/index.html",
                "org.label-schema.vcs-ref": "f229ed3f893a515d590d0f39b05f68913e2d9b53",
                "org.label-schema.vcs-url": "https://github.com/elastic/elasticsearch",
                "org.label-schema.vendor": "Elastic",
                "org.label-schema.version": "8.7.1",
                "org.opencontainers.image.created": "2023-04-27T04:33:42.127815583Z",
                "org.opencontainers.image.documentation": "https://www.elastic.co/guide/en/elasticsearch/reference/index.html",
                "org.opencontainers.image.licenses": "Elastic-License-2.0",
                "org.opencontainers.image.ref.name": "ubuntu",
                "org.opencontainers.image.revision": "f229ed3f893a515d590d0f39b05f68913e2d9b53",
                "org.opencontainers.image.source": "https://github.com/elastic/elasticsearch",
                "org.opencontainers.image.title": "Elasticsearch",
                "org.opencontainers.image.url": "https://www.elastic.co/products/elasticsearch",
                "org.opencontainers.image.vendor": "Elastic",
                "org.opencontainers.image.version": "8.7.1"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "bf47cd7764585766349085d35100611e086cf233fc9fc655c6eb9e086f1cd59a",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "9200/tcp": null,
                "9300/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/bf47cd776458",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "efk_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "efk-elasticsearch-1",
                        "elasticsearch",
                        "dab3a0ab0312"
                    ],
                    "NetworkID": "1bc8ac0185982b84a24a201852f2cddc0432a3ffff1a2bd4008074875f696cac",
                    "EndpointID": "e1c67199e679f350d1da47f0b1e208ec6a7767eb57d60f773ba08b88a6962dcf",
                    "Gateway": "172.23.0.1",
                    "IPAddress": "172.23.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:17:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

コンテナには172.23.0.2というIPアドレスが割り当てられています。Elasticsearchが正しく動作しているか確認するには、次のコマンドを実行します。

$ curl 172.23.0.2:9200
{
  "name" : "dab3a0ab0312",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "gldMFBtQSxS5sL93rBAdzA",
  "version" : {
    "number" : "8.7.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "f229ed3f893a515d590d0f39b05f68913e2d9b53",
    "build_date" : "2023-04-27T04:33:42.127815583Z",
    "build_snapshot" : false,
    "lucene_version" : "9.5.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

ステップ6 - Kibanaの設定

EFKスタックがデプロイされたので、Kibanaを設定する時が来ました。ブラウザでURL http://:5601を開きます。

Kibana Welcome Page

Explore on my ownボタンをクリックしてKibanaダッシュボードに進みます。

Kibana Dashboard

Stack ManagementリンクをクリックしてKibanaデータビューを設定します。左側のサイドバーからKibana >> Data Viewsオプションを選択してデータビューページを開きます。

Kibana Data View Page

Create data viewボタンをクリックして進みます。

Kibana Create Data View

データビューの名前とインデックスパターンをfluentd-*として入力します。タイムスタンプフィールドが@timestampに設定されていることを確認します。ソースフィールドは自動的に更新されます。Save data view to Kibanaボタンをクリックしてデータビューの作成を完了します。

次に、上部メニュー(省略記号)をクリックし、Discoverオプションをクリックしてログの監視を表示します。

設定が正常に動作していることを確認するページが表示されます。ログはすべてElasticsearchから取得され、Fluentdログ集約によって送信されます。

Kibana Fluentd Monitoring Logs

ステップ7 - Nginxのインストール

Ubuntu 22.04には古いバージョンのNginxが付属しています。最新バージョンをインストールするために公式のNginxリポジトリをダウンロードする必要があります。

Nginxの署名キーをインポートします。

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Nginxの安定版リポジトリを追加します。

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

システムリポジトリを更新します。

$ sudo apt update

Nginxをインストールします。

$ sudo apt install nginx

インストールを確認します。

$ nginx -v
nginx version: nginx/1.24.0

Nginxサーバーを起動します。

$ sudo systemctl start nginx

ステップ8 - SSLのインストール

最初のステップは、Let’s Encrypt SSL証明書をインストールすることです。SSL証明書を生成するためにCertbotをインストールする必要があります。Ubuntuのリポジトリを使用してCertbotをインストールするか、Snapdツールを使用して最新バージョンを取得できます。Snapdバージョンを使用します。

Ubuntu 22.04にはデフォルトでSnapdがインストールされています。次のコマンドを実行してSnapdのバージョンが最新であることを確認します。

$ sudo snap install core && sudo snap refresh core

Certbotをインストールします。

$ sudo snap install --classic certbot

次のコマンドを使用して、Certbotコマンドが/usr/binディレクトリにシンボリックリンクを作成できるようにします。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

ドメインkibana.example.comのSSL証明書を生成します。

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d kibana.example.com

上記のコマンドは、サーバーの/etc/letsencrypt/live/kibana.example.comディレクトリに証明書をダウンロードします。

Diffie-Hellmanグループ証明書を生成します。

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Certbotの更新スケジューラーサービスを確認します。

$ sudo systemctl list-timers

snap.certbot.renew.serviceがスケジュールされたサービスの1つとして表示されます。

NEXT                        LEFT          LAST                        PASSED         UNIT                     ACTIVATES
------------------------------------------------------------------------------------------------------------------------------------
Mon 2023-05-06 13:37:57 UTC 3h 45min left Mon 2023-05-01 07:20:42 UTC 2h 31min ago   ua-timer.timer           ua-timer.service
Mon 2023-05-06 14:39:29 UTC 4h 47min left Sat 2023-02-04 16:04:18 UTC 2 months ago   motd-news.timer          motd-news.service
Mon 2023-05-06 15:53:00 UTC 6h left       n/a                         n/a            snap.certbot.renew.timer snap.certbot.renew.service

プロセスのドライランを実行して、SSL更新が正常に機能しているか確認します。

$ sudo certbot renew --dry-run

エラーが表示されない場合は、すべて設定完了です。証明書は自動的に更新されます。

ステップ9 - Nginxの設定

KibanaのためのNginx設定ファイルを作成して開きます。

$ sudo nano /etc/nginx/conf.d/kibana.conf

以下のコードを貼り付けます。IPアドレスをElasticsearchサーバーのプライベートIPアドレスに置き換えます。

server {
        listen 80; listen [::]:80;
        server_name kibana.example.com;
        return 301 https://$host$request_uri;
}

server {
        server_name kibana.example.com;
        charset utf-8;

        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        access_log /var/log/nginx/kibana.access.log;
        error_log /var/log/nginx/kibana.error.log;

        ssl_certificate /etc/letsencrypt/live/kibana.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/kibana.example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/kibana.example.com/chain.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m;
        ssl_session_tickets off;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

        resolver 8.8.8.8;

        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;

        location / {
                proxy_pass http://localhost:5601;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。

/etc/nginx/nginx.confファイルを編集します。

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf;の前に次の行を追加します。

server_names_hash_bucket_size  64;

ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。

設定を確認します。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nginxサービスを再起動します。

$ sudo systemctl restart nginx

もう1つのステップが必要です。Docker Composeファイルを編集します。

$ nano ~/docker-compose.yml

Kibanaサービスの環境セクションの下にSERVER_PUBLICBASEURL=https://kibana.example.comの行を貼り付けます。

    environment: # ホスト構成を定義します。
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - SERVER_PUBLICBASEURL=https://kibana.example.com

ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。

コンテナを停止して削除します。

$ docker compose down --remove-orphans

更新された設定でコンテナを再起動します。

$ docker compose up -d

Kibanaダッシュボードは、https://kibana.example.comのURLを介してどこからでもアクセスできるようになります。

ステップ10 - Fluentdログドライバーを使用したDockerコンテナの実行

次に、Fluentdログドライブを使用してDockerコンテナを実行し、スタックに自動的にログを送信します。Nginxコンテナを使用してテストします。

Docker HubレジストリからNginxイメージをプルします。最小のイメージバージョンであるalpineバージョンを使用します。

$ docker pull nginx:alpine

次のコマンドを実行してNginxコンテナを作成して起動します。ログドライバーをFluentdに設定し、ポートを8080に設定します。デフォルトのポート80は、プロキシモードのNginxサーバーによってすでに使用されています。

$ docker run --name nginx-fluentd-test -d --log-driver=fluentd -p 8080:80 nginx:alpine

コンテナの状態を確認します。

$ docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                                    NAMES
038c43e4e1a3   nginx:alpine          "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp                                                                    nginx-fluentd-test
a94ca706bd0c   efk-fluentd           "tini -- /bin/entryp…"   8 hours ago      Up 8 hours      5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp, :::24224->24224/tcp, :::24224->24224/udp   efk-fluentd-1
0cf04a446425   kibana:8.7.1          "/bin/tini -- /usr/l…"   8 hours ago      Up 8 hours      0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                efk-kibana-1
7c7ad8f9b123   elasticsearch:8.7.1   "/bin/tini -- /usr/l…"   8 hours ago      Up 8 hours      9200/tcp, 9300/tcp                                                                                       efk-elasticsearch-1

次のコマンドを実行してNginxコンテナにアクセスし、アクセスログを生成します。

$ curl localhost:8080



Welcome to nginx!



Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

または、ブラウザでURL http://:8080を開くと、次のページが表示されます。 Nginx homepage

Kibanaダッシュボードを開き、左側のサイドバーメニューでDiscoverリンクをクリックします。上部メニューの+記号をクリックしてAdd filterポップアップを表示します。 Kibana Add Filter Popup

ドロップダウンからフィールドcontainer_nameを選択し、演算子としてisを選択し、フィールド値としてコンテナ名(nginx-fluentd-test)を入力します。 Kibana Container select Query

Add filterボタンをクリックして、Nginxコンテナからのデータを視覚化します。 Nginx Container Fluentd Log

結論

これで、Ubuntu 22.04マシンにElasticsearch、Fluentd、Kibana (EFK) ロギングスタックをインストールするチュートリアルが終了しました。質問がある場合は、下のコメントに投稿してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。