td-agent2をAmazon Linuxで独自ビルドする

2014.10.21

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

ども、大瀧です。
皆さん、Treasure Data Servicefluentdを活用するためのクライアント・エージェントである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を待ちましょう!

脚注

  1. 具体的な違いはこちらを参照ください。