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のオブジェクトストレージに転送することが容易になります。

構造 (イメージ図)#

image

本パターンでテストを行うシナリオは以下の通りです。

  • クライアント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. セキュリティグループの作成#

以下のセキュリティグループ・セキュリティグループルールを作成します。
実際の運用においては、 セキュリティグループ活用 を参考に、適切なセキュリティグループを設定してください。

  • セキュリティグループ
  • セキュリティグループルール
    • 送信セキュリティグループルール
      • 「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を作成します。

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
      
  • ダミーファイルをバケットに格納

    • 作成した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(サービス名はtd-agent)のバージョンを確認
      # td-agent --version
      td-agent 1.11.5
      

(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
      
  • コンフィグファイルのバックアップ

    • この後の手順でコンフィグファイル(/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  ]
      

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提供のサービスではないため、サポート対象外となります。