Apache のアクセスログを S3 に保存する

ApacheApache HTTP Server)を複数台のサーバで運用しており、ログを1箇所に集約したかったので S3 に保存するようにしました。

作業環境

S3 のバケット作成

まずはアクセスログを保存する S3 のバケットを作成しましょう。

今回は

  • enomotodev-apache-log

という名前でバケットを作成します。

IAM ロールの作成

先ほど作成した S3 のバケットへの読み込み・書き込み権限をもった IAM ポリシーを作成します。

fluent-plugin-s3 の README に IAM ポリシーのサンプルがあるので、こちらを参考にします。

  • Name: apache-log-to-s3-policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": "arn:aws:s3:::enomotodev-apache-log"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::enomotodev-apache-log/*"
    }
  ]
}

IAM ポリシーが作成できたら次の設定で IAM ロールを作成します

  • Select type of trusted entity: AWS service
  • Choose the service that will use this role: EC2
  • Attach permissions policies: apache-log-to-s3-policy
  • Name: apache-log-to-s3-role

EC2 作成

今作成した IAM ロールをアタッチした EC2 を作成します。

今回は t2.micro を選択しましたが、基本的にはどれを選んでも問題ないと思います。

Apache のインストール

EC2 が起動したら接続して yum でサクッと apache をインストールし、起動と、自動起動設定もしておきましょう。

$ sudo yum install httpd
$ sudo systemctl start httpd
$ sudo systemctl enable httpd

ブラウザでも EC2 の IP を開いて apache の画面が確認できたら OK です!

td-agent のインストール

Amazon Linux 2 での td-agent のインストール方法は公式のドキュメントに記載されているので、そのままコピペして実行します。

$ curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh

インストールできたかどうかバージョンを表示して確認してみます。

$ td-agent --version
td-agent 1.3.3

問題なくインストールできたようです。

ログの送信確認

まずは td-agent から apacheアクセスログが参照できるようにパーミッションを変更します。

$ sudo chmod +x /var/log/httpd
$ sudo chmod +r /var/log/httpd/access_log

パーミッションを変更したら td-agent の設定を変更します。

デフォルトの設定を削除し、次のように記載します。

  • /etc/td-agent/td-agent.conf
<source>
  @type tail
  path /var/log/httpd/access_log
  pos_file /var/log/td-agent/httpd.access_log.pos
  <parse>
    @type apache2
  </parse>
  tag s3.apache.access
</source>

<match s3.*.*>
  @type s3

  s3_bucket enomotodev-apache-log
  path logs/

  <buffer>
    @type file
    path /var/log/td-agent/s3
    flush_mode interval
    flush_interval 30s
  </buffer>

  time_slice_format %Y%m%d%H
</match>

td-agent の設定を変更できたら起動させます。(ついでに自動起動の設定も)

$ sudo systemctl start td-agent
$ sudo systemctl enable td-agent

ブラウザから何度かアクセスすると S3 にログファイルが作成されるのが確認できると思います。

まとめ

td-agent をワンラーナーでインストールでき、設定ファイルもそれほど難しくないので比較的簡単にログを S3 に保存することができました。

今回は apacheアクセスログでしたが、同じようにエラーログや、nginx、アプリケーションのログなども同じ手法で S3 に保存できます。

これからコンテナ化を予定しているサイトはまずはログを S3 などにも保存するようにして、サーバをステートフルな状態からステートレスにするところから始めてみてはいかがでしょうか。

参考

データ・ドリブン・マーケティング―――最低限知っておくべき15の指標

データ・ドリブン・マーケティング―――最低限知っておくべき15の指標

Practical Developers ――機械学習時代のソフトウェア開発[ゲームアプリ/インフラ/エッジ編] WEB+DB PRESS plus

Practical Developers ――機械学習時代のソフトウェア開発[ゲームアプリ/インフラ/エッジ編] WEB+DB PRESS plus