Help us understand the problem. What is going on with this article?

EC2 Amazon Linux 2にDockerを入れてtd-agentを動かす

全然理想形では無いのだが、fluentd公式Dockerイメージを起動してみたらAlpine Linuxで、fluentdプラグイン入れるのにもはぁはぁしてしまったりして、やっぱり地道にできるところからやってみたのであった

まずは土台

EC2でAmazon Linux 2を1台立てる

割愛
ちなみに今回使用したAMI

# cat /etc/image-id

image_name="amzn2-ami-hvm"
image_version="2"
image_arch="x86_64"
image_file="INCOMPLETE-amzn2-ami-hvm-2.0.20191024.3-x86_64.xfs.gpt"
image_stamp="0c64-ace2"
image_date="20191030215819"
recipe_name="amzn2 ami"
recipe_id="2428dc59-f379-186b-2da3-7300-200a-9c34-a139571b"

土台のAmazon Linux 2の初期設定(おもに日本語と日本時間の設定)

# sudo su

# #最初から入ってるアプリケーションを念のためアップデート
# yum update -y

# #今のタイムゾーン設定ファイルlocaltimeを念のためバックアップ
# cp /etc/localtime /etc/localtime.org

# #タイムゾーン設定ファイルlocaltimeをJapanファイルへのリンクに置き換えちゃう
# ln -sf /usr/share/zoneinfo/Japan /etc/localtime

# #システム時刻設定ファイルを念のためバックアップ
# mv /etc/sysconfig/clock /etc/sysconfig/clock.bk

# #システム時刻設定ファイルを日本用に書き換えちゃう
# echo -e 'ZONE='Asia/Tokyo'\nUTC=true' > /etc/sysconfig/clock

# #今の地域設定ファイルを念のためバックアップ
# mv /etc/sysconfig/i18n /etc/sysconfig/i18n.bk

# #地域設定ファイルを日本用に書き換えちゃう
# echo 'LANG=ja_JP.UTF-8' > /etc/sysconfig/i18n

Docker

Docker自体のインストールと設定

# #dockerをインストール
# #(yumには無かった)
# amazon-linux-extras install -y docker

# #dockerを早速起動
# service docker start

# #dockerの起動状態を確認
# service docker status

# #今後はOSを起動したら自動でdockerも起動するよう設定
# chkconfig docker on

# #dockerのバージョンを念のため確認(18.09.X以降ならOK)
# docker --version
Docker version 18.09.9-ce, build 039a7df

さっそくDockerイメージをゲットしてぶちこんで行くぞー!

# #dockerイメージ:AmazonLinux最新版をダウンロード
# docker pull amazonlinux:latest

# #作業ディレクトリを作成
# #(名前は何でもいいけど、一応、後で作るdockerイメージの名前と合わせておく)
# mkdir custom-td-agent

# #そのディレクトリに移動
# cd custom-td-agent

イメージからコンテナを起動して好みの●●に仕立てていくぜ

# #さっきDLしたdockerイメージ amazonlinux:latest を使ってdockerコンテナを起動するゾ
# #ちなみに、すぐdockerの中に入って設定作業のためのコマンドを色々打ちたいので、
# #今回コンテナ君に実行させるプログラムは bash だ
# #(なお、/bin/bash などの対話コマンドを実行する際は -it オプションをつけないといけない)
# docker run -it --name custom-td-agent amazonlinux:latest /bin/bash

# # ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ここからDockerコンテナ内のbash ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

# #dockerイメージ amazonlinux:latest に入っていないコマンドをインストール
# yum install -y which sudo vim

# #dockerコンテナの中では↓をやらないと全角日本語入力が文字化けする
# export LANG=C.UTF-8
# export LANGUAGE=en_US:

# #ここからしばらく、EC2のAmazonLinuxと同様に初期設定
# #(もしかしたらsudoいらんかもしれんがまぁいい)
# sudo yum update -y
# sudo cp /etc/localtime /etc/localtime.org
# sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
# sudo mv /etc/sysconfig/i18n /etc/sysconfig/i18n.bk
# sudo echo 'LANG=ja_JP.UTF-8' > /etc/sysconfig/i18n
# sudo mv /etc/sysconfig/clock /etc/sysconfig/clock.bk
# sudo echo -e 'ZONE='Asia/Tokyo'\nUTC=true' > /etc/sysconfig/clock

# #td-agentやtwitterプラグインなどに必要なライブラリをインストール
# #(今回はtd-agentでツイートを抽出してElastic Searchにぶち込んだりしてるので色々入れている)
# sudo yum install -y git openssl openssl-devel libcurl libcurl-devel gcc-c++

# #td-agentをyumでインストールできるよう、リポジトリの設定をしておく
# sudo echo -e '[treasuredata]\nname=TreasureData\nbaseurl=http://packages.treasuredata.com/3/redhat/7/$basearch\ngpgcheck=1\ngpgkey=https://packages.treasuredata.com/GPG-KEY-td-agent' > /etc/yum.repos.d/td.repo

# #満を持して td-agent をインストール
# sudo yum install -y td-agent

# #td-agent君のために、limits.conf を編集してファイル同時操作数のリミットを解除しておく
# vim /etc/security/limits.conf

+++++++++ ↓を limits.conf の末尾に追記 +++++++++
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
+++++++++++++++++++++++++++++++++++++++++++++++

# #編集終わったらvimを抜ける

# #ここで一回コンテナを終了するゾ
# #(コンテナ君には bash を実行させてるわけなので、exitすなわちコンテナ終了)
# exit

# # ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ここまでDockerコンテナ内のbash ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

まだまだ行くぞー!

Dockerを抜けた所さんで、もとのEC2 Amazon Linux 2上で作業続行だ

# #さっき終了したコンテナのIDを調べる
# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED     
XXXXXXXXXXXX        yyyyyyyyyyyy        "/bin/bash"         5 hours ago  

# #ここで一回、コンテナからイメージを作成しておく
# #イメージの名前は amazonlinux:custom-td-agent とでもしておこう
# docker container commit XXXXXXXXXXXX amazonlinux:custom-td-agent

# #保存されてるイメージの一覧を確認
# docker image ls

# #さっそくそのイメージを使ってコンテナを起動
# #-d --tmpfs /tmp --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --stop-signal SIGRTMIN+3
# #↑は、dockerの中のsystemctlコマンド(ひいてはserviceコマンド)を実行するのに必要な権限などを付与するおまじない
# #これやらないと、dockerの中でserviceコマンドを使ってtd-agentを起動できない
# #(ちなみに↑のように細々した指定をせず -d --privileged だけでもイケるが、過剰な特権を与えてしまうので良くないとのことだ)
# #なお /sbin/init は実質 systemd(Linux起動処理)だゾ
# docker container run -d --tmpfs /tmp --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --stop-signal SIGRTMIN+3 yyyyyyyyyyyy /sbin/init

ふたたびコンテナの中へ…

# # ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ここからDockerコンテナ内のbash ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

# #td-agentの設定作業の続きをやるゾ
# #↓必要なfluentdプラグインのインストール
# #(プラグイン自体の説明は割愛)
# /usr/sbin/td-agent-gem install eventmachine
# /usr/sbin/td-agent-gem install fluent-plugin-twitter
# /usr/sbin/td-agent-gem install fluent-plugin-record-reformer
# /usr/sbin/td-agent-gem install fluent-plugin-elasticsearch

# #td-agentの設定ファイルを編集
# vim /etc/td-agent/td-agent.conf
td-agent.conf
#!/bin/bash
<source>
  @type twitter
  consumer_key        *************************
  consumer_secret     *************************************************
  access_token        *****************-********************************
  access_token_secret ***********************************************
  tag                 source.tweet
  timeline            tracking
  keyword 'hogehoge,ほげほげ,今日のわんこ,天空のつるぎ'
  output_format       flat
</source>

<match source.*>
  @type copy
  <store>
    @type rewrite_tag_filter
    #capitalize_regex_backreference yes
    remove_tag_prefix source
    <rule>
      key     text
      pattern ^RT\s.*$
      tag trush
    </rule>
    <rule>
      key     user_screen_name
      pattern ^.+[bB][oO][tT]$
      tag trush
    </rule>
    <rule>
      key     user_name
      pattern ^.+[bB][oO][tT]$
      tag trush
    </rule>
    <rule>
      key     text
      pattern ^.*$
      tag ${tag}
    </rule>
  </store>
</match>


<filter tweet>
  @type record_transformer
  enable_ruby true
  <record>
    text_reformed ${record["text"].gsub(/http:[^\s]+/, '').gsub(/https:[^\s]+/, '').gsub(/@[^\s]+/, '').gsub(/\#[^\s]+/, '')}
    tag ${tag}
  </record>
</filter>

<match trush>
  @type null
</match>


<match tweet>
  @type copy
  <store>
    @type elasticsearch
    host 10.0.0.111
    port 9200   #セキュリティグループで通信許可を忘れずに
    index_name my-twitter
    type_name tracking
    include_tag_key true
    tag_key tagname
    time_key created_at
    include_timestamp true
    <instance_profile_credentials>
    </instance_profile_credentials>
  </store>
</match>
# #編集終わったらvim抜ける

# #いよいよtd-agent起動
# service td-agent start

# #コンテナ内のAmazonLinux起動時にtd-agentを自動起動するよう設定
# chkconfig td-agent on

# #td-agentにエラーがないか確認
# tail -f /var/log/td-agent/td-agent.log

# #Ctrl-P を押して、続けて Ctrl-Q を押そう
# #コンテナを止めずに抜けることができる
# #(exitしたらコンテナも止まっちゃうゾ)

# # ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ここまでDockerコンテナ内のbash ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

仕上げ

# #コンテナ死んでないか一応確認
# docker container ls

# #ひとまず完成ってことで、イメージを作成しておく
# docker container commit XXXXXXXXXXXX amazonlinux:custom-td-agent

# #作成されたイメージを確認
# docker image ls


# #ぬわああああん疲れたもおおおおん!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away