IDCF Tech-Blog

読者です 読者をやめる 読者になる 読者になる

IDCF Tech-Blog

クラウド・ビッグデータ・データセンターを提供するIDCフロンティアの公式エンジニアブログ

30分でできる!オブジェクトストレージへのログ保存(fluentd編)

オブジェクトストレージ セルフクラウド

※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。

こんにちは。R&D室の佐藤博之(Facebook)です。

今回のエンジニアブログでは、人気急上昇中のデータコレクタ fluentdを使って、Apache Web Server(以下、Apache)のアクセスログをIDCフロンティア オブジェクトストレージに書き込む手順を紹介したいと思います。

はじめに

昨今、社内・社外でやり取りされる各種ファイル、写真や動画等のリッチメディア、システムが出力するログファイル、そしてM2M(Machine to Machine)で生成されるデータ等、ストレージに保存するデータが急増しており、システム管理者の悩みの種になっています。従来はデータの増加に伴うアプローチとして、ストレージへのディスク追加、ストレージ筐体の追加が行われてきました。しかし、近年、データ増加が予想をはるかに上回るペースで増えており、従来のアプローチでは対応が難しいケースが発生しています。その問題を解決するのがIDCフロンティアのオブジェクトストレージサービスになります。システム管理者はストレージ筐体を自前で持つ必要がなく、そして容量の増加を気にすることなくデータ保存が可能になります。

今回のブログでは、Webサーバーとして多数採用されているApacheのアクセスログを、IDCフロンティア オブジェクトストレージに保存する手順をご紹介します。

オブジェクトストレージサービスについて

オブジェクトストレージは容量無制限のスケーラビリティと高い耐障害性に加え、リーズナブルな価格で利用できる分散型クラウドストレージサービスです。Amazon S3 APIとの互換性が高く、シンプルに設計されたREST形式のWeb APIを通じて、バケットやオブジェクトに対する各種操作を行うことができます。また、インターネットを経由しないプライベート接続にも対応しており、セキュアに通信を行なうことも可能です。詳細については、オブジェクトストレージのサイトをご参照ください。

fluentdについて

fluentdは2011年にシリコンバレーで起業した米国トレジャーデータ社によって開発、運用されているシンプルで汎用的なデータコレクタになります。データコレクタとして古くから使われてきたsyslogdと比べ、ログの収集方法や保存先を柔軟に変更することが可能になります。また、fluentdではログの入力、出力をプラグインで実装されており、Rubyの知識があれば自身でこのプラグインを実装し、fluentdの機能を拡張することが可能になっています。詳細については、こちらをご参照ください。

今回の構成

今回はIDCフロンティア セルフクラウド上にApache Webサーバーを構築し、そのWebサーバーで発生したaccess.logをfluetndを使って、オブジェクトストレージに書き込んでみたいと思います。

それでは構築を開始していきましょう。

サーバーの準備

セルフクラウド上に仮想マシンを準備します。CentOS 6.5のLATESTのテンプレートからサーバーを起動しましょう。
次にポートフォワーディング、ファイアウォールを設定し、sshでログイン、httpアクセスできるようにします。

fluentdのインストール

今回はfluentdの安定版配布パッケージであるtd-agentを使用します。

仮想マシンにSSHログインし、fluentdをインストールします。

 # curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh

fluent-plugin-s3のインストール

Apacheアクセスログを保存するオブジェクトストレージのAPIはAmazon S3互換です。そのため、fluentdのプライグインであるfluent-plugin-s3を使うことで、fluentd経由でオブジェクトストレージにオブジェクトを書き込むことが可能になります。

次のコマンドで、fluent-plugin-s3をインストールします。

 # cd /usr/lib64/fluent/ruby/bin/
 # ./fluent-gem install fluent-plugin-s3

s3cmdのインストール

オブジェクトストレージに保存されたオブジェクトをs3cmdコマンド(以下、s3cmd)で操作します。あらかじめ、仮想マシンにs3cmdをインストールしておきます。

 # cd /var/tmp <strong>任意のディレクトリへ移動</strong>
 # wget http://sourceforge.net/projects/s3tools/files/s3cmd/1.5.0-alpha3/s3cmd-1.5.0-alpha3.tar.gz 
 # tar zxvf s3cmd-1.5.0-alpha3.tar.gz 
 # cd s3cmd-1.5.0-alpha3
 # python setup.py install

Apacheのインストール

仮想マシンにApacheをインストールします。

 # yum install -y httpd

Apacheを起動します。

 # service httpd start

オブジェクトストレージのユーザーおよびバケット作成

次に仮想マシンからログを転送するオブジェクトストレージの設定を実施します。オブジェクトストレージを使うにはセルフクラウドのアカウントが必要になります。

1) オブジェクトストレージのコントロールパネルからユーザーを作成

セルフポータルにログインし、画面の右上[オブジェクトストレージ]をクリックすると、オブジェクトストレージのコントロールパネルにログインできます。 初回お申し込み時のみ、案内にしたがって必要事項を入力してください。

ログイン後に表示される画面右下の「作成」をクリックします。

リージョン(EAST)及びAPIユーザー名(メールアドレス形式)を入力し、ユーザーを作成します。

次の通りユーザーが作成できていれば成功です。

2) s3cmdの設定変更

s3cmdでオブジェクトストレージを操作できるように設定します。

さきほどs3cmdをインストールした仮想マシンで次のコマンドを実行します。

 # s3cmd --configure

 Access key and Secret key are your identifiers for Amazon S3
 Access Key: 確認方法は下記を参照
 Secret Key: 確認方法は下記を参照
 Encryption password is used to protect your files from reading
 by unauthorized persons while in transfer to S3
 Encryption password: 何も入力せずにEnter
 Path to GPG program [/usr/bin/gpg]:何も入力せずにEnter
 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't be used if you're behind a proxy
 Use HTTPS protocol [No]: 何も入力せずにEnter
 On some networks all internet access must go through a HTTP proxy.
 Try setting it here if you can't conect to S3 directly
 HTTP Proxy server name: 何も入力せずにEnter

 New settings:
   Access Key: XXXXXXXXXXXXXXXXXXXX
   Secret Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   Encryption password:
   Path to GPG program: /usr/bin/gpg
   Use HTTPS protocol: False
   HTTP Proxy server name:
   HTTP Proxy server port: 0

 Test access with supplied credentials? [Y/n] n

 Save settings? [y/N] y
 Configuration saved to '/root/.s3cfg'
 #

Access Key(アクセスキー)およびSecret Key(シークレットキー)はユーザー作成を行ったコントロールパネルから確認します。

設定アイコンをクリックし、「表示」を選択します。

※コントロールパネルへのログインパスワードを入力します。

Access Key(アクセスキー)およびSecret Key(シークレットキー)が表示されます。

作成された、~/.s3cfgのエンドポイントをAmazon S3からオブジェクトストレージに編集します。

 # cd
 # vi .s3cfg
 host_baseおよびhost_bucketを次の通り編集します。
 host_base = ds.jp-east.idcfcloud.com
 host_bucket = %(bucket)s.ds.jp-east.idcfcloud.com

s3cmdを使ってオブジェクトをリストしてみます。エラーが出力されなければ設定が正常に完了しています。(この時点ではオブジェクトが存在しないため、何も表示されません。)

# s3cmd ls 
#

3) バケットの作成

s3cmdを使ってバケットを作成します。

バケット名は、オブジェクトストレージ全体でユニークなものである必要があります。既に使用中、または使用されたことがあるバケット名と同じ名前のバケットは作成できません。バケット名の詳細な命名規則はサービス仕様・機能ページをご参照ください。

 # s3cmd mb s3://バケット名/
 Bucket 's3://バケット名/' created

fluentd(td-agent)の設定変更

fluentdの設定を変更し、fluentd経由でオブジェクトストレージにオブジェクトを書き込めるようにします。

1) td-agent.confのバックアップ

念のため、編集前のtd-agent.confをバックアップしておきます。

 # cd /etc/td-agent
 # cp td-agent.conf td-agent.conf.org

2) td-agent.confの編集

一旦、td-agent.confの内容をクリアします。

 # cat /dev/null > td-agent.conf

td-agent.confを次の内容に書き換え、保存します。

 # cd /etc/td-agent
 # vi td-agent.conf

aws_key_id = オブジェクトストレージ コントロールパネルで確認したアクセスキー

aws_sec_key = オブジェクトストレージ コントロールパネルで確認したシークレットキー

s3_bucket = 作成したバケット名

 ## File input
 ## read apache logs continuously and tags td.apache.access
 <source>
   type tail
   format apache
   path /var/log/httpd/access_log
   tag apache.access
   pos_file /tmp/td-agent/apache.pos
 </source>

 <match apache.access>
   type s3

   aws_key_id XXXXXXXXXXXXXXXXXXXX
   aws_sec_key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   s3_bucket バケット名
   s3_endpoint ds.jp-east.idcfcloud.com
   check_apikey_on_start false
   s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
   path logs/
   buffer_path /var/log/fluent/idcf
   flush_interval 60s
   time_slice_format %Y%m%d-%H
 </match>

3) fluentdで使用するディレクトリの作成

次のコマンドで、/var/log/fluentの作成、オーナーの変更を行います。

 # mkdir /var/log/fluent
 # chown td-agent:td-agent /var/log/fluent

次のコマンドで、/tmp/td-agentの作成およびオーナーの作成を行います。

 # mkdir /tmp/td-agent
 # chown td-agent:td-agent /tmp/td-agent/

4) Apacheログディレクトリのグループおよびパーミション変更

次のコマンドで、/var/log/httpdのグループおよびパーミションを変更し、Apacheログをtd-agentユーザーで参照可能にします。

 # chown root:td-agent /var/log/httpd
 # chmod 750 /var/log/httpd/

※Apacheのバージョンアップ、再インストールを実施すると、/var/log/httpdのパーミッションはデフォルトに戻るため注意してください。

5) fluentdの起動

次のコマンドで、fluentdを起動します。

 # service td-agent start

ブラウザからWebサーバーへアクセス

ローカルマシンのブラウザからWebサーバーへアクセスし、アクセスログを発生させます。

1) アクセスするグローバルIPを確認

セルフクラウドのポータルへアクセスします。

マイリソース > ネットワーク からグローバルIPを確認します。

2) ブラウザからグローバルIPへアクセス

ブラウザから、上記で確認したグローバルIPにアクセスします。

次の通り、Apacheのデフォルト画面が表示されれば、正常にアクセスできています。

これでオブジェクトストレージにApacheのアクセスログが転送されているはずです。確認してみましょう。

オブジェクトストレージへの出力を確認

s3cmdコマンドでアクセスログがオブジェクトストレージに保存されているかを確認します。

1) オブジェクトのリストを表示

次のコマンドで、オブジェクトストレージに保存されたかを確認します。

下記のように圧縮されたログファイルが出力されていれば成功です。

 # s3cmd ls s3://バケット名/logs/
 2013-12-25 04:44       160   s3://バケット名/logs/20131225-04_0.gz

2) アクセスログのリストア

次のコマンドで、オブジェクトストレージに保存されたアクセスログを、仮想マシンにリストアしてみます。

 # cd /tmp
 # s3cmd get s3://バケット名/logs/20131225-04_0.gz
 # zcat 20131225-04_0.gz

備考)td-agent.conf

今回使用したtd-agent.confのパラメータについてのコメントです。今回の設定以外にもfluentdはさまざまさ設定を柔軟に行うことが可能です。詳細については、こちらをご参照ください。

 ## File input
 ## read apache logs continuously and tags td.apache.access
 <source>
   type tail  >> ログの参照にtailインプットプラグインを使用
   format apache  >> ログ形式としてapacheテンプレートを使用
   path /var/log/httpd/access_log  >> Apacheアクセスログの出力ファイル
   tag apache.access  >> ログにapache.accessのタグを添付
   pos_file /tmp/td-agent/apache.pos >> ログをどこまで送り終ったかを記録するファイル
 </source>

 <match apache.access>  >> タグがapache.accessとマッチした場合に、次の処理が実行
   type s3  >> s3アウトプットプラグインを使用

   aws_key_id XXXXXXXXXXXXXXXXXXXX  >> オブジェクトストレージを使用するためのアクセスキー
   aws_sec_key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX >> オブジェクトストレージを使用するためのシークレットキー
   s3_bucket バケット名 >> ログを保存するバケット名
   s3_endpoint ds.jp-east.idcfcloud.com >> オブジェクトストレージのエンドポイント
   check_apikey_on_start false  >> fluentd起動時にアクセスチェックを行う機能を無効化(オブジェクトストレージでは必須)
   s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension} >> オブジェクトストレージに保存される時のファイルフォーマット
   path logs/ >> オブジェクトストレージに保存される時のパス
   buffer_path /var/log/fluent/idcf >> 一時キャッシュ用ファイルのパス
   flush_interval 60s >> オブジェクトストレージにログを保存する間隔
   time_slice_format %Y%m%d-%H >> オブジェクトストレージに保存されるログのタイムスタンプフォーマット
 </match>

次回はs3cmdを使ったオブジェクトストレージのログ保存方法をご紹介します。ご期待ください。

<関連記事>

Copyright © IDC Frontier Inc.