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


# #ぬわああああん疲れたもおおおおん！
```