td-agent2をAmazon Linuxで独自ビルドする
ども、大瀧です。
皆さん、Treasure Data Serviceやfluentdを活用するためのクライアント・エージェントであるTreasure Agent(通称td-agent)を活用してますか?AWS環境でも、Amazon KinesisやAmazon DynamoDBとの連携などビッグデータに関わる処理では欠かせないツールになりつつあります。
ただ、Treasure Data社公式のtd-agentパッケージはサポートOSにAmazon Linuxが含まれておらず、独自にビルドして使用することが推奨されています。そこで本エントリーでは、その独自ビルドを検証した結果をシェアしたいと思います。Amazon Linuxでのサポートについて、詳しくは以下のQiitaエントリーを参照してください。
ビルド手順と注意点
td-agentは、現在バージョン1とバージョン2(td-agent2)の2バージョンがあります。これはビルド/パッケージ作成方法が異なるのみで、パッケージに同梱されるtd(Tresure Dataクライアント)およびfluentdに差異はありません *1。今回は、Current Stableであるtd-agent2のビルドを行います。td-agent2のビルド手順は、ソースリポジトリであるGitHubのtreasure-data/omnibus-td-agentリポジトリのREADMEにあります。今回の検証環境であるAmazon Linux 2014.09 HVMでは、事前に以下を調整する必要があります。
- Ruby 2.0だとbin/gem_downloaderの中で実行されるgem install --explainがエラーになるようなので、Ruby 2.1に入れ替える
- Development Toolsパッケージグループにfakerootパッケージが含まれないので、追加する
それ以外は、README通りです。ざっとビルド結果を追って行きます。まずは、Rubyの入れ替えから。
$ sudo yum remove -y ruby ruby20 $ sudo yum install -y ruby21 ruby21-devel
続いてDevelopment Toolsとfakerootパッケージ、それからRubyGemsでbundlerをあらかじめインストールします。
$ sudo yum groupinstall -y "Development Tools" $ sudo yum install -y fakeroot $ gem install bundler
これで準備完了です。後はGitHubのomnibus-td-agentリポジトリからgit cloneし、READMEの通りにビルドを実行します。bundle installの実行のうちridleyのインストールにかなり時間がかかり止まったように見えるのですが、気長に待ちましょう。
$ git clone https://github.com/treasure-data/omnibus-td-agent.git Cloning into 'omnibus-td-agent'... remote: Counting objects: 729, done. remote: Compressing objects: 100% (307/307), done. remote: Total 729 (delta 318), reused 729 (delta 318) Receiving objects: 100% (729/729), 251.66 KiB | 147.00 KiB/s, done. Resolving deltas: 100% (318/318), done. Checking connectivity... done. $ cd omnibus-td-agent/ $ bundle install --binstubs Fetching git://github.com/opscode/omnibus-software.git Fetching gem metadata from https://rubygems.org/....... Fetching additional metadata from https://rubygems.org/.. Resolving dependencies... Installing addressable 2.3.6 : Installing omnibus 4.0.0.rc.1 Using omnibus-software 4.0.0 from git://github.com/opscode/omnibus-software.git (at master) Using bundler 1.7.4 Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed. $ bin/gem_downloader core_gems.rb $ bin/gem_downloader plugin_gems.rb $ sudo mkdir -p /opt/td-agent /var/cache/omnibus $ sudo chown ec2-user {/opt/td-agent,/var/cache/omnibus}
td-agent2は、Chef社のRuby処理系向けパッケージツールOmnibusをベースにしているため、以下のomnibus buildコマンドでビルドします。多分bundle exec omnibus buildでも動くと思います。
$ bin/omnibus build td-agent2 Building td-agent 2.1.0... [NullFetcher: preparation] I | Fetching `preparation' (nothing to fetch) [NetFetcher: jemalloc] I | Downloading from `http://www.canonware.com/download/jemalloc/jemalloc-3.6.0.tar.bz2' [NetFetcher: zlib] I | Downloading from `http://downloads.sourceforge.net/project/libpng/zlib/1.2.6/zlib-1.2.6.tar.gz' [NullFetcher: libgcc] I | Fetching `libgcc' (nothing to fetch) [NetFetcher: ncurses] I | Downloading from `http://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz' : [Packager::RPM] I | Creating .rpm file [Compressor] I | No compressor defined for `rhel'. $
RPMパッケージファイルは./pkg/ディレクトリにあります。
$ ls pkg td-agent-2.1.0-0.x86_64.rpm td-agent-2.1.0-0.x86_64.rpm.metadata.json $
出来てますね!
【重要】バージョン2.1.0の時点ではインストールに失敗する
ビルドされたRPMパッケージファイルですが、実は本日現在の最新版であるバージョン2.1.0ではrpmコマンドによるインストール時に以下のエラーが発生し、インストールに失敗します。
$ sudo rpm -i pkg/td-agent-2.1.0-0.x86_64.rpm ファイル /opt (パッケージ td-agent-2.1.0-0.x86_64 から) は、パッケージ filesystem-2.4.30-3.8.amzn1.x86_64 からのファイルと競合しています。 $
これはRPMのバージョン4.8.0以降で発生する現象で、filesystemsパッケージに含まれるファイル/ディレクトリとの重複チェックが厳密に確認されるようになったことに起因するもののようです。今回は、/optが重複しています。これについて、かなり大雑把に/optを除外するPull Requestを作成し投げたところ、@repeatedlyさんがOmnibus本家にIssueを上げてOmnibus側での対応を期待しているところです。急ぎで使いたい方は、弊社リポジトリのブランチからgit cloneしてお使いください。
ちなみに、本不具合はAmazon LinuxだけでなくRHEL/CentOS 7でも起きうるものです。ご注意ください。
まとめ
というわけで、現状では問題が解決されたのちにリリースされるであろうtd-agentバージョン2.1.1を待ちましょう!