EC2のログをS3に転送する(fluentd)

AWS
この記事は約9分で読めます。
スポンサーリンク

クラウド環境では可能な限りサーバーにデータを格納しないことが望ましい。
簡単に言えば、サーバーは「使い捨て」の前提で構築した方がバックアップやアプリ更新など運用面が楽になります。

EC2のログを外部に保存する場合はCloudWatch Logsに転送することが多いと思います。
CloudWatch Logsに転送すると管理コンソール上でログが確認できるのでサーバーにログインするという作業が不要になります。

ただ、コスト面を考えるとEC2からS3にログを格納する方が有利な場面が多いです。
ログをS3に転送する場合はfluentdを使用して転送する方式がよく採用されます。

ログ格納イメージ

他のAWSサービスからログをS3に格納する場合と同じような形態にします。
S3バケット直下にEC2のNameタグの名称を作成し、その下にログを格納していきます。
オブジェクトが増えすぎると大変なので日付でツリー構造にします。
格納されるファイルは「xxx.gz」になります。ファイル名は連番で割り振られていきます。
Nameタグの代わりにOSのホスト名を使っている例もあるんですが、私としてはNameタグを使うほうがいいと思ってます。

<S3 bucket>
  ├ <EC2 1>
  │   ├ <Log Name1>
  │   │  └ YYYY
  │   │      └ MM
  │   │          └ DD
  │   │             └ XXX.gz
  │   └ <Log Name2>
  │       └ YYYY
  │           └ MM
  │               └ DD
  │                  └ XXX.gz
  │
  ├ <EC2 1>
       ├ <Log Name1>
       │  └ YYYY
       │      └ MM
       │          └ DD
       │             └ XXX.gz
       └ <Log Name2>
           └ YYYY
               └ MM
                   └ DD
                      └ XXX.gz

EC2インスタンスのロール(ポリシー)

S3にログを保存するため、EC2のロールとしてS3へのアクセス権限が必要となります。
また、EC2の情報を取得するための権限も必要となります。
例えば、こんな感じ。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:Describe*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": "arn:aws:s3:::<bucket name>"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::<bucket bname>/*"
    }
  ]
}

fluentdのインストール

エージェントのインストールは以下コマンドで実施します。OSごとにインストールコマンドが変わりますので気を付けましょう。
Install by RPM Package (Red Hat Linux)

sudo curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent4.sh | sh

次にプラグインをインストールします。
「fluent-plugin-forest」は無くても大丈夫と思いますが、とりあえずインストールしてます。

fluent-plugin-s3
fluent-plugin-forest
fluent-plugin-ec2-metadata

sudo /usr/sbin/td-agent-gem install fluent-plugin-s3
sudo /usr/sbin/td-agent-gem install fluent-plugin-forest
sudo /usr/sbin/td-agent-gem install fluent-plugin-ec2-metadata

fluentdのエージェントはデフォルトでは「td-agent」ユーザーアカウント権限で実行されます。

$ ps aux | grep td-agent
td-agent 3580 0.0 3.9 229796 38808 ? Sl 09:44 0:00 /opt/td-agent/bin/ruby /opt/td-agent/bin/fluentd –log /var/log/td-agent/td-agent.log –daemon /var/run/td-agent/td-agent.pid
td-agent 3583 3.9 4.7 237900 46724 ? Sl 09:44 0:00 /opt/td-agent/bin/ruby -Eascii-8bit:ascii-8bit /opt/td-agent/bin/fluentd –log /var/log/td-agent/td-agent.log –daemon /var/run/td-agent/td-agent.pid –under-supervisor
ec2-user 3591 0.0 0.0 119424 944 pts/0 S+ 09:44 0:00 grep –color=auto td-agent
$

これを変更する場合は「/lib/systemd/system/td-agent.service」を修正します。
[Service」の項目があるので、これを「root」に変更します。

[Service]
User=root
Group=root

ログ転送設定

設定ファイルは「/etc/td-agent/td-agent.conf」になります。
<source>が取得するログの設定になります。
ログファイルを追加する場は「path」「pos_file」「tag」を変更します。
「path」は転送するログのフルパスを指定します。
60分ごとにS3にファイルを転送します。転送間隔を変更する場合は「timekey」の設定を変更します。

# read messages logs
<source>
  @type tail
  <parse>
    @type none
  </parse>
  path /var/log/messages
  pos_file /var/log/td-agent/tmp/messages.pos
  tag log.messages
</source>

# read secure logs
<source>
  @type tail
  <parse>
    @type none
  </parse>
  path /var/log/secure
  pos_file /var/log/td-agent/tmp/secure.pos
  tag log.secure
</source>

#EC2 metadata

<match log.**>
  @type ec2_metadata

  output_tag s3output.${tagset_name}.${tag}

  <record>
    hostname      ${tagset_name}
    instance_id   ${instance_id}
    instance_type ${instance_type}
    az            ${availability_zone}
    private_ip    ${private_ip}
    vpc_id        ${vpc_id}
    ami_id        ${image_id}
    account_id    ${account_id}
  </record>
</match>

# send to S3
<match s3output.**>
  @type s3
  s3_bucket <bucket name>
  s3_region <region name>

  path ${tag[1]}/${tag[3]}
  time_slice_format %Y/%m/%d
  s3_object_key_format %{path}/%{time_slice}/%{index}.%{file_extension}

  <format>
    @type single_value
  </format>
  <buffer tag,time>
    @type file
    path /var/log/td-agent/s3/${tag}
    timekey 60m
    timekey_wait 30
    timekey_use_utc false
    timekey_zone Asia/Tokyo
  </buffer>
</match>

エージェント起動

設定が終わったらエージェントを起動してS3にログが転送されるか確認します。
60分間隔だと確認まで時間が必要になるのでテストする場合は「timekey」の設定を短くした方がいいでしょう。

sudo systemctl daemon-reload
sudo systemctl enable td-agent
sudo systemctl restart td-agent

rootユーザーでプロセスが起動し、ログがS3に転送されていることを確認してください。

$ ps aux | grep td-agent
root 3638 0.0 3.9 229796 38724 ? Sl 09:46 0:00 /opt/td-agent/bin/ruby /opt/td-agent/bin/fluentd –log /var/log/td-agent/td-agent.log –daemon /var/run/td-agent/td-agent.pid
root 3641 6.9 4.7 237900 46760 ? Sl 09:46 0:00 /opt/td-agent/bin/ruby -Eascii-8bit:ascii-8bit /opt/td-agent/bin/fluentd –log /var/log/td-agent/td-agent.log –daemon /var/run/td-agent/td-agent.pid –under-supervisor
ec2-user 3649 0.0 0.0 119424 964 pts/0 S+ 09:46 0:00 grep –color=auto td-agent
$

コメント

タイトルとURLをコピーしました