117 Views
November 20, 25
スライド概要
コンテナの基礎的な知識を、AWSを活用して学びたいという背景から、Amazon ECSでDockerコンテナの立ち上げとfluentbitを利用したログの出力を試してみました。
エヌアイデイの若手メンバーが参加し、基礎技術の習得と実践的な経験を目的とした社内の技術検証取り組みの資料です。
株式会社エヌアイデイの公式アカウントです。ソフトウェア開発、システム構築、システム運用まで幅広いICTサービスを提供する、1967年創業の独立系IT企業です。 NIDエンジニアの社内取り組みや登壇資料を共有します。
【初心者向け】 AWSで実践! Dockerで作るコンテナログ基盤 2025年11月27日 株式会社エヌアイデイ ICTデザイン事業部ANA部第2課 R.O. (1年目※検証当時) Copyright(c)2025 NID All Rights Reserved ※記載されている会社名および製品名は、各社の登録商標または商標です。 ※Docker® ロゴは Docker Inc. の登録商標です。 出典:Docker公式メディアリソース(https://www.docker.com/company/newsroom/media-resources/) 1
参加メンバー&検証年月 ICTデザイン事業部ANA部第2課 R.O. (1年目 ※検証当時) ICTデザイン事業部ANA部第2課 Y.K. (3年目 ※検証当時) ※2023年8月~11月検証実施 Copyright(c)2025 NID All Rights Reserved
目次 1. 導入 (Docker・コンテナ・Amazon ECS・ FireLensについて) 2. 構成図 3. 手順 4. 結果 5. まとめ 6. はまったところ 7. 商標に関する注記 Copyright(c)2025 NID All Rights Reserved
1. 導入 本検証の目的 背景: コンテナの基礎的な知識をAWSを活用して学びたい 目的: Amazon ECSでDockerコンテナの立ち上げとFluent Bitを利 用したログの出力を試してみる 期待される結果: Dockerコンテナ(nginxとFluent Bit)の立ち上げ確認・fluentbit のログ出力についてフィルターと出力先の振り分け機能の確 認 Copyright(c)2025 NID All Rights Reserved
Dockerとは 1. 導入 Dockerとは「データやプログラムを隔離できる仕組み・コンテナ管理 ソフトの一つ」 NGINX Fluent Bit MySQL サーバでは 複数のプログラムが動いている Copyright(c)2025 NID All Rights Reserved NGINX MySQL Fluent Bit ライブラリ/ ミドルウェア ライブラリ/ ミドルウェア ライブラリ/ ミドルウェア Docker Docker上で複数のプログラムを ライブラリ/ミドルウェアごと隔離できる
1. 導入 コンテナとは コンテナとは「アプリの実行環境をひとまとめにしたもの」 コンテナ コンテナ コンテナ NGINX MySQL Fluent Bit ライブラリ/ ミドルウェア ライブラリ/ ミドルウェア ライブラリ/ ミドルウェア Docker(コンテナ管理ソフト) ホストOS Copyright(c)2025 NID All Rights Reserved Image Image Image NGINX MySQL Fluent Bit Dockerイメージ: コンテナのテンプレートフ ァイル
1. 導入 コンテナとは メリット • コンテナ化したアプリケーションはハイブリッド・マルチクラウド 環境上のどこでも動くアプリケーションをつくることができる。可 搬性の高さ。 • 早いタイミングでテストやビルドを実施し、製品品質の維持を自動 で行えるCI/CDとの相性の良さ etc... → コンテナを利用したアプリケーションが増えてきている。 アジャイル開発に向いており、B2Cのアプリケーションで使われる ケースも増えている。 Copyright(c)2025 NID All Rights Reserved
1. 導入 Amazon ECSとは Amazon ECSは「AWSでコンテナをデプロイするサービス」 • タスク定義 AWS Fargate コンテナの起動設定。タスク=コンテナ • サービス ALBとAutoScaling Groupに紐づけられたタスク群 • クラスター タスクとサービスを実行する基盤。 今回はサーバーレスのFagateを使用する。 Copyright(c)2025 NID All Rights Reserved Application Load Balancer Task Container Container
AWS FireLensとは 1. 導入 AWS FireLensとは「Amazon ECSで使用できるログルーターのこと 。FireLensはFluentdまたはFluent Bitで動作する。サイドカーコンテ ナとして配置。」 NGINX End User Copyright(c)2025 NID All Rights Reserved nginxコンテナ (Webサーバ) nginx Log Fluent Bit Fluent Bitコンテナ (ログルーター) nginx Log Amazon CloudWatch Logs
AWS FireLensとは 1. 導入 利点 • ログをリアルタイムで集約可能 • コンテナからログを複数の宛先にフィルターして送信できる NGINX nginx1 Log Fluent Bit 全ての nginx Log Amazon Kinesis Amazon Simple Storage Service (Amazon S3) Data Firehose nginxコンテナ1 NGINX Fluent Bitコンテナ (ログルーター) nginxコンテナ2 nginx2 Log Copyright(c)2025 NID All Rights Reserved エラーログ Amazon CloudWatch
2. 構成図 構成図で使用するサービス コンテナの実行基盤 コンテナ ログの送信先 NGINX AWS Fargate nginxコンテナ (Webサーバ) レジストリ Fluent Bit (Dockerイメージの保存先) Amazon Kinesis Data Firehose Amazon Simple Storage Service (Amazon S3) Fluent Bitコンテナ (ログルーター) Amazon Elastic Container Registry (Amazon ECR) Copyright(c)2025 NID All Rights Reserved Amazon CloudWatch
2. 構成図 Copyright(c)2025 NID All Rights Reserved 構成図の概要 NGINX Fluent Bit NGINX Fluent Bit
2. 構成図 今回の目的 • nginxコンテナとFluent Bitコンテナの作成 • Fluent Bitコンテナによりnginxのログを収集し、各ログ送信先サービス にログを送信する ログ送信の条件 Amazon Kinesis Data Firehose:すべてのログを送信する。5分間隔でバッファした ログをS3へ送信。すぐに確認する必要性の低いログ・分析に使用する大量のデータ( すべてのログ)はバッファして送信する。 Cloud Watch Logs:エラーログのみとヘルスチェックログのみフィルターして送信 する。リアルタイムでログを送信。エラーログなど重要なログは即座に確認できる。 Copyright(c)2025 NID All Rights Reserved
3. 手順 事前準備 • Docker Desktopをインストール ※ DockerはLinux OSを使うことが前提 Windows/MacではDocker Desktop for Windows/ Docker Desktop for MacのDocker Engineをインストールする ただし、 Docker Desktop for WindowsはWSL2の仕様を推奨 WSL2: WindowsでLinuxソフトウェアを使うための仕組み。 2020年春にWindowsアップデートにて機能がサポートされた。 Copyright(c)2025 NID All Rights Reserved
Dockerイメージの作成 3. 手順 この二つのコンテナを作りたい・・・ コンテナ コンテナ NGINX Fluent Bit ライブラリ/ ミドルウェア ライブラリ/ ミドルウェア Docker ホストOS Copyright(c)2025 NID All Rights Reserved Image Image NGINX Fluent Bit 基となるDockerイメージを作成する!
3. 手順 Dockerイメージの中身 材料フォルダ image build Dockerファイル =コンテナの設計書 コンテナに入れたい ファイル類 ※ Dockerコマンドを使うときはDocker Desktopを起動しておく Copyright(c)2025 NID All Rights Reserved
3. 手順 Image NGINX イメージの基となるファイルの作成 材料フォルダ (ecs_test) Dockerファイルとhtmlファイル (index.html)を作成 Copyright(c)2025 NID All Rights Reserved Image 材料フォルダ (fluentbit_test) Fluent Bit Dockerファイルとログ出力の設定ファイル (extra.conf)を作成
3. 手順 イメージのビルドとプッシュ 材料フォルダを buildしてイメージを作成 Image Image NGINX Fluent Bit push Amazon ECR docker build . –t {ECRのリポジトリ名} aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS {ECRのリポジトリ名} docker tag {ECRのリポジトリ名}: latest {ECRのURI}/ {ECRのリポジトリ名}: latest.fluentbit docker push {ECRのURI}/ {ECRのリポジトリ名}: latest.fluentbit Copyright(c)2025 NID All Rights Reserved
3. 手順 デプロイの前に周りの環境づくり VPC、サブネット、ログの送信先サービス、各エンドポイントを作成しておく VPC AZ-1a Subnet Subnet Endpoints Amazon Kinesis Data Firehose Amazon S3 AZ-1c Subnet Subnet Endpoints Amazon CloudWatch User Amazon ECR Copyright(c)2025 NID All Rights Reserved Image Image NGINX Fluent Bit
3. 手順 ECS ~クラスターの作成~ ECSのコンソールからクラスターを作成する ⮚ AWS Fargateを使用する Copyright(c)2025 NID All Rights Reserved
3. 手順
ECS ~タスク定義の作成~
ECSからタスク定義を作成する。JSONを使用してタスク定義を作成した。
⮚ コンテナ名やイメージURI、コンテナポート、ログの送信先など設定
以下はnginxコンテナのJSONファイルの記載内容。
"containerDefinitions": [
{
"name": "container-tec-ver-ecs-nginx",
"image": “xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/container-tec-verecr:latest",
"cpu": 0,
"portMappings": [
{
"name": "container-tec-ver-ecs-nginx-80-tcp",
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp",
"appProtocol": "http"
}
],
"essential": true,
"logConfiguration": {
"logDriver": "awsfirelens"
}
}
]
Copyright(c)2025 NID All Rights Reserved
3. 手順 ECS ~サービスの作成~ ECSからサービスを作成した。 ⮚ 使用するタスク定義、VPC(subnet)、ロードバランサーなどを設定する Copyright(c)2025 NID All Rights Reserved
3. 手順 Copyright(c)2025 NID All Rights Reserved ECS ~サービスの作成~ NGINX Fluent Bit NGINX Fluent Bit Image Image NGINX Fluent Bit サービス作成で設定したコンテナと 周辺環境(ALB)がデプロイされる!
3. 手順 構築完了 タスクの設定タブ コンテナ欄のステータスがRunning状態なので稼働できている Copyright(c)2025 NID All Rights Reserved
4. 結果 nginxサーバにアクセス ←nginxサーバのページに アクセスできた ↓ALBのモニタリングタブからリクエスト数など確認できる Copyright(c)2025 NID All Rights Reserved
4. 結果 Kinesis Data Firehoseの確認 配信ストリームのメトリクスを確認。S3にログが送信されている。 Copyright(c)2025 NID All Rights Reserved
4. 結果
S3に保存されたログの確認
S3のログを確認し、様々なログが送信されていることを確認した
アクセスログがあることも確認
{"container_id":"f9af5d9e87384c35a86f3e7bc40e1c3f-512604876","container_name":"container-tec-ver-ecs-nginx","ecs_cluster":"container-tec-vercluster","ecs_task_arn":"arn:aws:ecs:ap-northeast-1:680831238148:task/container-tec-vercluster/f9af5d9e87384c35a86f3e7bc40e1c3f","ecs_task_definition":"container-tec-ver-task-def:27","log":"10.1.1.20 - - [26/Sep/2023:08:01:42
+0000] ¥"GET / HTTP/1.1¥" 304 0 ¥"-¥" ¥"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0
Safari/537.36¥" ¥“xxx.xx.xx.xxx¥"","source":"stdout"}
Copyright(c)2025 NID All Rights Reserved
4. 結果
CloudWatch LogsのHealthcheckログの確認
Helthcheckのログのみ送信されている確認した。
/aws/ecs/container-tec-ver/firelens/healthcheck
{ "container_id": "6d446e1b3f91431e9555e11c46673a0d-512604876", "container_name": "container-tecver-ecs-nginx", "source": "stdout", "log": "10.1.1.20 - - [28/Sep/2023:01:16:13 +0000] ¥"GET / HTTP/1.1¥"
200 27 ¥"-¥" ¥"ELB-HealthChecker/2.0¥" ¥"-¥"", "ecs_cluster": "container-tec-ver-cluster", "ecs_task_arn":
"arn:aws:ecs:ap-northeast-1:680831238148:task/container-tec-vercluster/6d446e1b3f91431e9555e11c46673a0d", "ecs_task_definition": "container-tec-ver-task-def:28"}
{ "container_id": "6d446e1b3f91431e9555e11c46673a0d-512604876", "container_name": "container-tecver-ecs-nginx", "source": "stdout", "log": "10.1.1.53 - - [28/Sep/2023:01:16:14 +0000] ¥"GET / HTTP/1.1¥"
200 27 ¥"-¥" ¥"ELB-HealthChecker/2.0¥" ¥"-¥"", "ecs_cluster": "container-tec-ver-cluster",
"ecs_task_arn": "arn:aws:ecs:ap-northeast-1:680831238148:task/container-tec-vercluster/6d446e1b3f91431e9555e11c46673a0d", "ecs_task_definition": "container-tec-ver-task-def:28"}
Copyright(c)2025 NID All Rights Reserved
4. 結果
CloudWatch Logsのエラーログの確認
エラーログのみ送信されていることを確認した。
/aws/ecs/container-tec-ver/firelens/stderr
{ "container_id": "6d446e1b3f91431e9555e11c46673a0d-512604876", "container_name": "container-tecver-ecs-nginx", "source": "stderr", "log": "2023/09/27 23:39:55 [error] 29#29: *5693 open()
¥"/usr/share/nginx/html/.git/config¥" failed (2: No such file or directory), client: 10.1.1.53, server: localhost,
request: ¥"GET /.git/config HTTP/1.1¥", host: ¥"52.199.103.82¥"", "ecs_cluster": "container-tec-ver-cluster",
"ecs_task_arn": "arn:aws:ecs:ap-northeast-1:680831238148:task/container-tec-vercluster/6d446e1b3f91431e9555e11c46673a0d", "ecs_task_definition": "container-tec-ver-task-def:28"}
Copyright(c)2025 NID All Rights Reserved
5. まとめ 検証結果のまとめ • nginxとFluent Bitのコンテナを作成することができた • nginxのログをFluent Bitによりルーティングし、 S3に全てのロ グを、CloudWatch LogsにHelthcheckログとエラーログをフィ ルターし送信することができた Copyright(c)2025 NID All Rights Reserved
5. まとめ 所感 • 技術・ソリューション検証の「下期以降の大型案件や領域拡大に向け た力を蓄える」という目的に関して、各検証内容の基礎となる技術を 身につけることができ、実践的な技術を扱える土台を築くことができ た • エンジニアとして重要な新しい技術を学ぶ姿勢・トライ&エラーを繰 り返す胆力を身につけることができた • 多くの人の前でプレゼンする貴重な機会を経験できた Copyright(c)2025 NID All Rights Reserved
6. はまったところ① イメージのタグ付け buildしてイメージを作成し、タグをつける(どんなタグでもつけられる) しかし、タグ名が規則通りのタグでないとプッシュできない Image tag push Fluent Bit Amazon ECR レジストリの場所/リポジトリ名 : バージョン docker build . –t {ECRのリポジトリ名} docker tag {ECRのリポジトリ名}: latest {ECRのURI}/ {ECRのリポジトリ名}: latest.fluentbit docker push {ECRのURI}/ {ECRのリポジトリ名}: latest.fluentbit Copyright(c)2025 NID All Rights Reserved
6. はまったところ② Fluent Bitの設定
ログの送信先が二つ以上の場合は、独自の設定ファイル(extra.conf)のパスを指定する
※ GUIのタスク定義ではパスの設定不可能
送信先が一つだけの時は、独自の設定ファイルは不要でGUIからのタスク定義・JSON
でのタスク定義で設定可能
フィルター設定する際も独自の設定ファイル(extra.conf)のパス指定が必要
"firelensConfiguration": {
"type": "fluentbit",
"options": {
"config-file-type": "file",
"config-file-value": "/fluent-bit/etc/extra.conf"
}
}
タスク定義でextra.confのパスを指定
Copyright(c)2025 NID All Rights Reserved
6. はまったところ② Fluent Bitの設定
ログの送信先が二つ以上の場合は、独自の設定ファイル(extra.conf)のパスを指定する
※ GUIのタスク定義ではパスの設定不可能
送信先が一つだけの時は、独自の設定ファイルは不要でGUIからのタスク定義・JSON
でのタスク定義で設定可能
フィルター設定する際も独自の設定ファイル(extra.conf)のパス指定が必要
"firelensConfiguration": {
"type": "fluentbit",
"options": {
"config-file-type": "file",
"config-file-value": "/fluent-bit/etc/extra.conf"
}
}
タスク定義でextra.confのパスを指定
Copyright(c)2025 NID All Rights Reserved
7. 商標に関する注記 • 「NGINX」は、F5, Inc.またはその関連会社の登録商標です。 ※本資料中では、技術的文脈に応じて「NGINX」および「nginx」の表記が混在してい ますが、いずれも同一製品を指します。 • 「Fluent Bit」は、Calyptia, Inc.の商標または登録商標です。 • 「MySQL」は、Oracle Corporationの商標または登録商標です。 • 「Docker」は、Docker, Inc.の商標または登録商標です。 • Docker® ロゴは Docker Inc. の登録商標です。 出典:Docker公式メディアリソース (https://www.docker.com/company/newsroom/media-resources/) Copyright(c)2025 NID All Rights Reserved