Fluentdを活用したオブジェクトストレージ[S3互換]へのログ転送[東日本/西日本リージョン3向け]#
要求事項#
- s3cmdツールを導入し、オブジェクトストレージ[S3互換]のバケット操作を手軽に実施
- Fluentdツールを導入し、Webサーバへのアクセスログをオブジェクトストレージ[S3互換]にアップロード
本パターンでは、以下、オブジェクトストレージ[S3互換]をオブジェクトストレージと表記します。
対応するデザインパターン概要#
1. s3cmdとは#
s3cmdツールは、S3プロトコルを使用するオブジェクトストレージサービスに対し、ファイルのアップロード・取得・管理を行うためオープンソースツールです。ツールはPythonにより記述され、S3プロトコルを使用するFJcloud-Oのオブジェクトストレージへのファイルの格納が容易になります。
2. Fluentdとは#
Fluentdツールは、大量のログファイルをはじめとするデータを集約・管理するためのオープンソースツールです。2011年にTreasure Data社により開発され、現在も同社を中心とするコミュニティベースで開発されています。ツールはRubyにより記述され、大量のログデータをFJcloud-Oのオブジェクトストレージに転送することが容易になります。
構造 (イメージ図)#
本パターンでテストを行うシナリオは以下の通りです。
- クライアントPC(作業端末)からSSL-VPN経由でWebサーバにアクセス
- Fluentdツールにより、Webサーバのアクセスログがオブジェクトストレージに転送
- s3cmdツールを使用し、アクセスログをオブジェクトストレージからクライアントサーバにダウンロード
実装サンプル#
1. 内部ネットワークの作成#
仮想ネットワークを作成します。
- 「内部ネットワークA0」を作成
- DHCPは「有効」、DNSサーバは「8.8.8.8」を設定
- 作成手順は初期構築ガイド 仮想ネットワークの作成 を参照
- 以下の設定値例を参照
ネットワーク | 仮想ネットワーク名 | サブネット名 | サブネット | ゲートウェイIP | 用途 |
---|---|---|---|---|---|
内部ネットワークA0 | nwA0 | subnetA0 | 192.168.0.0/24 | 192.168.0.1 | テスト用Webサーバ・クライアントサーバの配備 |
以下の設定値例に従い、仮想ルータを作成します。作成した仮想ルータに内部ネットワークのサブネットを接続します。
- 仮想ルータの作成手順は、初期構築ガイド 仮想ルータの作成 を参照
- 仮想ルータと内部ネットワークのサブネットを接続する手順は、初期構築ガイド 仮想ルータとサブネットの接続 を参照
仮想ルータ名 | 外部ネットワーク | サブネット接続 | IPアドレス | 用途 |
---|---|---|---|---|
routerA0 | 接続(fip-net) | subnetA0 | 192.168.0.1 | 外部接続・SSL-VPN接続用 |
2. セキュリティグループの作成#
以下のセキュリティグループ・セキュリティグループルールを作成します。
実際の運用においては、 セキュリティグループ活用 を参考に、適切なセキュリティグループを設定してください。
- セキュリティグループ
- セキュリティグループ名:SG-A0
- 作成手順は初期構築ガイド セキュリティグループの作成 を参照
- セキュリティグループルール
- 送信セキュリティグループルール
- 「TCP」「UDP」「ICMP」を全て許可
- 受信セキュリティグループルール
- 「SSL-VPNクライアントプール」からの「SSH (22/tcp)」を許可
- 「SSL-VPNクライアントプール」からの「HTTP (80/tcp)」を許可
- 「サブネットA0」からの「ALL TCP(1-65535)」を許可
- 「サブネットA0」からの「ALL UDP(1-65535)」を許可
- 「サブネットA0」からの「ICMP」を全て許可
- 設定手順は初期構築ガイド セキュリティグループルールの作成 を参照
- 以下の設定値例を参照
- 送信セキュリティグループルール
No. | ルール | 方向 | オープンポート | ポート | 接続先 | CIDR | 用途 |
---|---|---|---|---|---|---|---|
1 | ALL TCP(1-65535) | 送信 | - | - | CIDR | 0.0.0.0/0 | |
2 | ALL UDP(1-65535) | 送信 | - | - | CIDR | 0.0.0.0/0 | |
3 | ALL ICMP | 送信 | - | - | CIDR | 0.0.0.0/0 | |
4 | カスタムTCPルール | 受信 | ポート番号 | 22 | CIDR | 192.168.246.0/24 | SSL-VPN接続用(SSH) |
5 | カスタムTCPルール | 受信 | ポート番号 | 80 | CIDR | 192.168.246.0/24 | SSL-VPN接続用(HTTP) |
6 | ALL TCP(1-65535) | 受信 | ポート番号 | 1-65535 | CIDR | 192.168.0.0/24 | サブネット内通信用 |
7 | ALL UDP(1-65535) | 受信 | ポート番号 | 1-65535 | CIDR | 192.168.0.0/24 | サブネット内通信用 |
8 | ALL ICMP | 受信 | - | - | CIDR | 192.168.0.0/24 |
3. SSL-VPNの作成#
仮想サーバへのセキュアな接続を実現するため、SSL-VPNを作成します。
- 作成手順は初期構築ガイド SSL-VPN構築 を参照
4. 仮想サーバの作成#
以下の設定値例に従い、「Webサーバ」、「クライアントサーバ」を作成します。
- サーバグループは「設定なし」、デバイスサイズは最小ディスク容量を設定
- キーペアは任意のキーペアを選択
- 作成手順は初期構築ガイド 仮想サーバの作成 を参照
仮想サーバ | 仮想サーバ名 | 仮想サーバタイプ | OSイメージ | 選択済み仮想ネットワーク | セキュリティグループ |
---|---|---|---|---|---|
Webサーバ | WebServer | C3-2 | CentOS 8.3 | nwA0 | SG-A0 |
クライアントサーバ | ClientServer | C3-2 | CentOS 8.3 | nwA0 | SG-A0 |
5. オブジェクトストレージの設定#
APIを使用し、FJcloud-O オブジェクトストレージの設定を行います。
こちらの手順に従い、FJcloud-O オブジェクトストレージのアクセスキー・シークレットアクセスキーを作成します。
6. s3cmdツールの導入#
SSL-VPN経由でクライアントサーバにログインし、s3cmdツールを導入します。
(1) インストール手順#
以下の手順に従い、s3cmdツールのインストールを行います。
-
サードパーティー・リポジトリとしてepel-releaseをインストール
# yum -y install epel-release
-
パッケージを最新版に更新
# yum -y update
-
s3cmdをインストール
# yum -y install s3cmd
-
インストールされたs3cmdのバージョンを確認
# s3cmd --version s3cmd version 2.1.0
(2) 初期設定#
s3cmdでは、コマンドs3cmd --configure
を入力することで、対話形式の初期設定が可能です。
以下実行例の★を付けた箇所を入力し、それ以外の設定項目はEnterを押下によりスキップします。
なお、これ以降の実行例では東日本リージョン3のオブジェクトストレージを使用しています。
ご利用リージョンのAPIエンドポイントの値に適宜修正の上、設定を行ってください。
リージョン | APIエンドポイント |
---|---|
西日本リージョン3の場合 | https://objectstorage-s.jp-west-3.cloud.global.fujitsu.com |
東日本リージョン3の場合 | https://objectstorage-s.jp-east-3.cloud.global.fujitsu.com |
- 実行例:
# s3cmd --configure Enter new values or accept defaults in brackets with Enter. Refer to user manual for detailed description of all options. Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables. Access Key: <アクセスキー>★(オブジェクトストレージへのアクセスキーを指定) Secret Key: <シークレットアクセスキー>★(オブジェクトストレージへのシークレットアクセスキーを指定) Default Region [US]: Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3. S3 Endpoint [s3.amazonaws.com]: objectstorage-s.jp-east-3.cloud.global.fujitsu.com★(オブジェクトストレージへのAPIエンドポイントを指定) Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used if the target S3 system supports dns based buckets. DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: objectstorage-s.jp-east-3.cloud.global.fujitsu.com/%(bucket)s★(オブジェクトストレージのバケット名の形式を指定) Encryption password is used to protect your files from reading by unauthorized persons while in transfer to S3 Encryption password: Path to GPG program [/usr/bin/gpg]: When using secure HTTPS protocol all communication with Amazon S3 servers is protected from 3rd party eavesdropping. This method is slower than plain HTTP, and can only be proxied with Python 2.7 or newer Use HTTPS protocol [Yes]: On some networks all internet access must go through a HTTP proxy. Try setting it here if you can't connect to S3 directly HTTP Proxy server name: New settings: Access Key: <アクセスキー> Secret Key: <シークレットアクセスキー> Default Region: US S3 Endpoint: objectstorage-s.jp-east-3.cloud.global.fujitsu.com DNS-style bucket+hostname:port template for accessing a bucket: objectstorage-s.jp-east-3.cloud.global.fujitsu.com/%(bucket)s Encryption password: Path to GPG program: /usr/bin/gpg Use HTTPS protocol: True HTTP Proxy server name: HTTP Proxy server port: 0 Test access with supplied credentials? [Y/n] y★(オブジェクトストレージへのアクセスを確認) Please wait, attempting to list all buckets... Success. Your access key and secret key worked fine :-) Now verifying that encryption works... Not configured. Never mind. Save settings? [y/N] y★(上記の設定内容を保存) Configuration saved to '/root/.s3cfg'
上記の初期設定にて未完了の設定箇所に対し、コンフィグファイル(/root/.s3cfg
)を編集します。
オブジェクトストレージでのAPI実行を可能とするために、以下実行例に記載の通りコンフィグファイル内のsignature_v2
の値をFalse
からTrue
に変更します。
- 実行例:
# cat /root/.s3cfg | grep signature signature_v2 = True
(3) バケット操作の確認#
バケットを作成し、オブジェクトを格納するテストを実施します。
-
バケットの作成
web-accesslog
という名前のバケットを作成# s3cmd mb s3://web-accesslog Bucket 's3://web-accesslog/' created
-
ダミーファイルの作成
- 10MBの
dummy.dat
ファイルを/tmp
に作成# fallocate -l 10M /tmp/dummy.dat # ls -l -h /tmp/ total 10M -rw-r--r--. 1 root root 10M Sep 3 07:54 dummy.dat
- 10MBの
-
ダミーファイルをバケットに格納
- 作成した
dummy.dat
をバケットweb-accesslog
に格納# s3cmd put dummy.dat s3://web-accesslog/ upload: 'dummy.dat' -> 's3://web-accesslog/dummy.dat' [1 of 1] 10485760 of 10485760 100% in 0s 17.48 MB/s done
- 作成した
-
オブジェクトの確認
- バケット
web-accesslog
内にオブジェクトdummy.dat
が格納されていることを確認# s3cmd ls s3://web-accesslog 2021-09-03 07:57 10485760 s3://web-accesslog/dummy.dat
- バケット
7. httpdのインストール#
SSL-VPN経由でWebサーバにログインし、以下の手順でWebサービス(httpd)をインストールします。
httpdのインストール完了後はテストページを作成し、アクセス確認を実施します。
-
httpdのインストール
# sudo yum -y install httpd # systemctl start httpd # systemctl enable httpd
-
デモページの作成
- テスト用のデモページを作成
# cat /var/www/html/index.html <html> <head> </head> <body> <h1>TestPage!</h1> <h2>Welcome to this page!</h2> </body> </html>
- テスト用のデモページを作成
-
デモページの確認
- クライアントPC(作業端末)のブラウザから、作成したWebサーバのプライベートIPアドレスにアクセスしWebページを確認
8. Fluentdツールの導入#
引き続き、SSL-VPN経由でWebサーバにログインし、Fluentdツールを導入します。
(1) インストール手順#
以下の手順に従い、Fluentdツールのインストールを行います。
-
Fluentdのインストール
- 以下のスクリプトを実行しFluentdのインストールを実施
# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
- 以下のスクリプトを実行しFluentdのインストールを実施
-
Fluentdのバージョン確認
- インストールされたFluentd(サービス名はtd-agent)のバージョンを確認
# td-agent --version td-agent 1.11.5
- インストールされたFluentd(サービス名はtd-agent)のバージョンを確認
(2) 初期設定#
以下の手順に従い、Fluentdの初期設定を行います。
-
td-agentサービスを開始し、自動起動を有効化
# systemctl start td-agent # systemctl enable td-agent
-
パーミッション変更
- td-agentサービスがWebサービスのアクセスログを取得できるよう、ディレクトリのパーミッションを変更
# chmod o+rx /var/log/httpd/ # chmod o+r /var/log/httpd/access_log
- td-agentサービスがWebサービスのアクセスログを取得できるよう、ディレクトリのパーミッションを変更
-
コンフィグファイルのバックアップ
- この後の手順でコンフィグファイル(
/etc/td-agent/td-agent.conf
)を修正するため、事前にバックアップを取得# cd /etc/td-agent/ # ls plugin td-agent.conf # cp td-agent.conf td-agent-original.conf # ls plugin td-agent.conf td-agent-original.conf
- この後の手順でコンフィグファイル(
-
コンフィグファイルの編集
- コンフィグファイル(
/etc/td-agent/td-agent.conf
)を編集し、ログ取得・格納に関する設定を実施- ログの取得元を
/var/log/httpd/access_log
に設定 - ログの転送先をオブジェクトストレージのバケット
web-accesslog
に設定 - ログの保存形式はテキスト形式に設定
- Webサーバに対する新規のアクセス情報を30秒ごとに上記バケットに転送
# cat td-agent.conf <source> @type tail format apache2 path /var/log/httpd/access_log #アクセスログの取得元を設定 pos_file /var/log/td-agent/httpd.access.log.pos #転送が完了したログの情報を格納 tag s3.httpd.access # ログに"s3.httpd.access"のタグを添付 </source> <match s3.*.*> # タグが"s3.*.*"とマッチした場合に、以下の処理を実行 @type s3 aws_key_id <アクセスキー> #取得したオブジェクトストレージのアクセスキーを設定 aws_sec_key <シークレットアクセスキー> #取得したオブジェクトストレージのシークレットアクセスキーを設定 s3_bucket objectstorage-s # 作成したバケット名を設定 s3_endpoint https://jp-east-3.cloud.global.fujitsu.com/web-accesslog # 利用中のリージョンのAPIエンドポイントを設定 store_as text #ログをtext形式で格納 check_apikey_on_start false # Fluentd起動時にアクセスチェックを行う機能を無効化 s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension} >> バケット格納される時のファイルフォーマット path logs/ # オブジェクトストレージに格納される際のパス buffer_path /var/log/td-agent/s3_httpdlog flush_interval 30s # オブジェクトストレージにログを格納する際の間隔 time_slice_format %Y%m%d%H # オブジェクトストレージに保存されるログのタイムスタンプフォーマット </match>
- ログの取得元を
- コンフィグファイル(
-
Fluentdの再起動
- 上記の設定を反映するため、サービスtd-agentの再起動を実施
# service td-agent restart Restarting td-agent (via systemctl): [ OK ]
- 上記の設定を反映するため、サービスtd-agentの再起動を実施
Note
ここでエラーが発生した際は、/var/log/td-agent/td-agent.log
のログをご確認ください。
以下のエラーは、ディレクトリのパーミッション変更が正しく行われていない場合のものです。
# tail -n2 /var/log/td-agent/td-agent.log 2021-09-03 09:09:47 +0000 [error]: #0 unexpected error error_class=Errno::EACCES error="Permission denied @ rb_file_s_stat - /var/log/httpd/access_log" 2021-09-03 09:09:47 +0000 [error]: #0 suppressed same stacktrace
9. アクセステストの実施#
Webサーバにアクセステストを行い、ログがオブジェクトストレージに格納されることを確認します。
クライアントPC(作業端末)のブラウザから、作成したWebサーバのプライベートIPアドレスにアクセスし、以下を実施します。
-
ログの存在確認
- クライアントサーバにログイン
- 以下の実行例の通り、ログが保管されていることを確認
# cd /tmp/ # s3cmd ls s3://web-accesslog/logs/ 2021-09-03 09:44 1390 s3://web-accesslog/logs/2021090309_0.txt 2021-09-03 09:45 155 s3://web-accesslog/logs/2021090309_1.txt 2021-09-03 09:53 2502 s3://web-accesslog/logs/2021090309_2.txt
-
ログファイルのダウンロード・確認
- ログファイルの一つをダウンロードし、内容を確認
# s3cmd get s3://web-accesslog/logs/2021090310_0.txt download: 's3://web-accesslog/logs/2021090310_0.txt' -> './2021090310_0.txt' [1 of 1] 278 of 278 100% in 0s 5.15 KB/s done # cat 2021090310_0.txt 2021-09-03T10:02:04+00:00 s3.httpd.access {"host":"192.168.246.2","user":null,"method":"GET","path":"/index.html","code":304,"size":null,"referer":null,"agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"}
- ログファイルの一つをダウンロードし、内容を確認
注意事項#
- 本パターンは2021年9月時点のFJcloud-O 東日本/西日本リージョン3にて動作検証しています。
- 本パターンは、Fluentdツールのバージョン1.11.5にて動作検証しています。
- 本パターンは、s3cmdツールのバージョン2.1.0にて動作検証しています。
- 本ページで掲載されているFluentdツール・s3cmdツールはFJcloud-O提供のサービスではないため、サポート対象外となります。
- Fluentdツールの詳細は以下を参照ください。
https://www.fluentd.org/ - s3cmdツールの詳細は以下を参照ください。
https://s3tools.org/s3cmd
- Fluentdツールの詳細は以下を参照ください。