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 updateDockerと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 ~/efkdocker-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 -ptreeコマンドを実行してディレクトリ構造を確認します。
$ tree次のように表示されるはずです。 
Fluentdディレクトリに移動します。
$ cd fluentdDockerfileを作成して編集します。
$ 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 conffluentd.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-1Elasticsearchコンテナを検査します。コンテナの詳細設定が表示されます。
$ 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://を開きます。

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

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

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

データビューの名前とインデックスパターンをfluentd-*として入力します。タイムスタンプフィールドが@timestampに設定されていることを確認します。ソースフィールドは自動的に更新されます。Save data view to Kibanaボタンをクリックしてデータビューの作成を完了します。
次に、上部メニュー(省略記号)をクリックし、Discoverオプションをクリックしてログの監視を表示します。
設定が正常に動作していることを確認するページが表示されます。ログはすべてElasticsearchから取得され、Fluentdログ集約によって送信されます。

ステップ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/nullNginxの安定版リポジトリを追加します。
$ 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 updateNginxをインストールします。
$ sudo apt install nginxインストールを確認します。
$ nginx -v
nginx version: nginx/1.24.0Nginxサーバーを起動します。
$ 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 coreCertbotをインストールします。
$ 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 4096Certbotの更新スケジューラーサービスを確認します。
$ sudo systemctl list-timerssnap.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.confinclude /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 successfulNginxサービスを再起動します。
$ sudo systemctl restart nginxもう1つのステップが必要です。Docker Composeファイルを編集します。
$ nano ~/docker-compose.ymlKibanaサービスの環境セクションの下に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 -dKibanaダッシュボードは、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://を開くと、次のページが表示されます。 
Kibanaダッシュボードを開き、左側のサイドバーメニューでDiscoverリンクをクリックします。上部メニューの+記号をクリックしてAdd filterポップアップを表示します。 
ドロップダウンからフィールドcontainer_nameを選択し、演算子としてisを選択し、フィールド値としてコンテナ名(nginx-fluentd-test)を入力します。 
Add filterボタンをクリックして、Nginxコンテナからのデータを視覚化します。 
結論
これで、Ubuntu 22.04マシンにElasticsearch、Fluentd、Kibana (EFK) ロギングスタックをインストールするチュートリアルが終了しました。質問がある場合は、下のコメントに投稿してください。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。