td-agent2をAWS Elastic Beanstalkにデプロイする

2015.04.16

ども、大瀧です。
Fluentdディストリビューションのtd-agent2が先日、Amazon Linuxに対応しました。ただ、Amazon Linuxのバージョン規則(releasever)の制約で管理者がバージョンを固定している場合および既定でバージョン固定になるElastic Beanstalkの場合でエラーになっていました。一昨日、バージョン固定の2015.03のリポジトリが整備されたため、晴れてBeanstalkで動くようになりました! *1感謝です!というわけで試した設定をご紹介します。

  • OS : OS X Yosemite
  • EB CLI : バージョン3.2.2
  • サポートするEBコンテナ : コンテナバージョンv1.3以上(Dockerベースのコンテナは本日現在で未リリース)

.ebextensionsの設定

Elastic Beanstalkでは、アプリケーションファイル以外のシステム設定を変更する仕組みがあり、アプリケーションバンドルのルート以下に.ebextentionsというディレクトリを作成し、その中に*.configというYAMLもしくはJSON形式ファイルで記述します。複数ファイルの場合はASCII順に実行されるため、ファイル名の先頭を数字から始めるのが慣例です。今回は、td-agentの設定ファイル(/etc/td-agent/td-agent.conf)の配置とtd-agent2のパッケージインストールを行うので以下2つのファイルを作成します。

  • 0-td-agent-gen-config.configファイルのcontent以下は通常のtd-agent.confの内容にYAMLのソフトインデントを加えたものなので、実際に使用したいtd-agent.confの内容に読み替えてください。
  • 1-td-agent-install.configファイルは、インストールスクリプト内でsudoを実行しているので、Beanstalkからrootユーザーで実行できるよう、先にsudoの設定を変更しています。fluentdプラグインの追加など行う場合は、コマンド実行を追加して対応できます。

.ebextensions/0-td-agent-gen-config.config

files:
  "/etc/td-agent/td-agent.conf":
    owner: root
    group: root
    content: |
      ####
      ## Output descriptions:
      ##

      # Treasure Data (http://www.treasure-data.com/) provides cloud based data
      # analytics platform, which easily stores and processes data from td-agent.
      # FREE plan is also provided.
      # @see http://docs.fluentd.org/articles/http-to-td
      #
      # This section matches events whose tag is td.DATABASE.TABLE
      <match td.*.*>
        type tdlog
        apikey YOUR_API_KEY_IS_HERE

        auto_create_table
        buffer_type file
        buffer_path /var/log/td-agent/buffer/td
      </match>
        :(以下略)

.ebextensions/1-td-agent-install.config

# errors get logged to /var/log/cfn-init.log. See Also /var/log/eb-tools.log
commands:
    01-command:
        command: echo 'Defaults:root    !requiretty' >> /etc/sudoers

    02-command:
        command: curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

    03-command:
        command: /etc/init.d/td-agent restart

事前準備はこれだけです!シンプルですね!

動作確認

では、動かしてみましょう。サンプルのRubyのBeanstalkアプリケーションバンドルに今回のファイルを追加したものがTreasureDataさんのGitHubで公開されているので、手っ取り早く試したい方はどうぞ。

$ git clone https://github.com/treasure-data/elastic-beanstalk-td-agent.git
$ cd elastic-beanstalk-td-agent
$ tree -a -I .git
.
├── .ebextensions
│   ├── 0-td-agent-gen-config.config
│   └── 1-td-agent-install.config
├── Gemfile
├── README.md
├── config.ru
└── helloworld.rb

1 directory, 6 files
$

続いて、Elastic Beanstalkの構成を進めます。今回はEB CLI3を利用します。ローカルマシンにインストールしていない場合は、事前にpip install awsebcliでインストールし、AWS APIにアクセスするための設定を済ませておきましょう。eb initコマンドでBeanstalkの初期構成とApplication作成が実行されます。

$ eb init

Enter Application Name
(default is "elastic-beanstalk-td-agent"):
Application elastic-beanstalk-td-agent has been created.

It appears you are using Ruby. Is this correct?
(y/n): y

Select a platform version.
1) Ruby 2.2 (Puma)
2) Ruby 2.1 (Puma)
3) Ruby 2.0 (Puma)
4) Ruby 2.2 (Passenger Standalone)
5) Ruby 2.1 (Passenger Standalone)
6) Ruby 2.0 (Passenger Standalone)
7) Ruby 1.9.3
(default is 1):
Do you want to set up SSH for your instances?
(y/n): y

Select a keypair.
1) XXXXXXXX
2) [ Create new KeyPair ]
(default is 2): 1
$

続いて、eb createでEnvironment作成およびスタック構築、初期リビジョンのデプロイまで一気に進みます。

$ eb create
Enter Environment Name
(default is elastic-beanstalk-td-a):
Enter DNS CNAME prefix
(default is elastic-beanstalk-td-a):
Creating application version archive "4605".
Uploading elastic-beanstalk-td-agent/4605.zip to S3. This may take a while.
Upload Complete.
Environment details for: elastic-beanstalk-td-a
  Application name: elastic-beanstalk-td-agent
  Region: ap-northeast-1
  Deployed Version: 4605
  Environment ID: e-XXXXXXXXXX
  Platform: 64bit Amazon Linux 2015.03 v1.3.0 running Ruby 2.2 (Puma)
  Tier: WebServer-Standard
  CNAME: elastic-beanstalk-td-a.elasticbeanstalk.com
  Updated: 2015-04-15 12:26:10.917000+00:00
Printing Status:
INFO: createEnvironment is starting.
INFO: Using elasticbeanstalk-ap-northeast-1-XXXXXXXXXXXX as Amazon S3 storage bucket for environment data.
INFO: Created security group named: sg-XXXXXXXX
INFO: Created load balancer named: awseb-e-e-AWSEBLoa-XXXXXXXXXXXX
INFO: Created security group named: awseb-e-eijimzmxnt-stack-AWSEBSecurityGroup-XXXXXXXXXXXX
INFO: Created Auto Scaling launch configuration named: awseb-e-XXXXXXXXXX-stack-AWSEBAutoScalingLaunchConfiguration-XXXXXXXXXX
INFO: Waiting for EC2 instances to launch. This may take a few minutes.
INFO: Created Auto Scaling group named: awseb-e-eijimzmxnt-stack-AWSEBAutoScalingGroup-XXXXXXXXXXXX
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:scalingPolicy:a348c982-f77a-4369-9f2d-4fc4cca6a867:autoScalingGroupName/awseb-e-XXXXXXXXXXXX-stack-AWSEBAutoScalingGroup-XXXXXXXXXXXX:policyName/awseb-e-eijimzmxnt-stack-AWSEBAutoScalingScaleUpPolicy-XXXXXXXXXXXX
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:scalingPolicy:33178e1a-70a2-4621-8aef-3112de4f8b7c:autoScalingGroupName/awseb-e-XXXXXXXXXX-stack-AWSEBAutoScalingGroup-XXXXXXXXXXXX:policyName/awseb-e-XXXXXXXXX-stack-AWSEBAutoScalingScaleDownPolicy-XXXXXXXXXXXX
INFO: Created CloudWatch alarm named: awseb-e-XXXXXXXXXX-stack-AWSEBCloudwatchAlarmHigh-XXXXXXXXXXXX
INFO: Created CloudWatch alarm named: awseb-e-XXXXXXXXXXXX-stack-AWSEBCloudwatchAlarmLow-XXXXXXXXXXXX
INFO: Added EC2 instance 'i-XXXXXXXX' to Auto Scaling Group 'awseb-e-XXXXXXXXXX-stack-AWSEBAutoScalingGroup-XXXXXXXXXXXX'.
INFO: Application available at elastic-beanstalk-td-a.elasticbeanstalk.com.
INFO: Successfully launched environment: elastic-beanstalk-td-a
$

これで完了です!SSHで作成されたBeanstalkのインスタンスに接続し、td-agentがインストールされているか確認してみます。

[ec2-user@ip-10-0-0-XX ~]$ rpm -q td-agent
td-agent-2.2.0-0.x86_64
[ec2-user@ip-10-0-0-XX ~]$ ps ax | grep td-agent
 1718 ?        Sl     0:00 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --daemon /var/run/td-agent/td-agent.pid
 1721 ?        Sl     0:03 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --daemon /var/run/td-agent/td-agent.pid
27013 pts/0    D+     0:00 grep td-agent
[ec2-user@ip-10-0-0-XX ~]$

td-agentの最新版2.2.0がインストール済みで、サービスが起動していることがわかりますね!

まとめ

td-agentのインストール手順がシンプルなおかげで、Beanstalkへの導入も容易に出来る様子がわかりました。AWSの他のデプロイサービスでも手順を整理したいところですね。td-agentをガシガシ活用していきましょう!

脚注

  1. S3+CloudFrontの設定でお手伝いしましたw