GitHub EnterpriseをAWSで使おう – fluentd S3アウトプットプラグインを利用したログのアーカイブ

2016.12.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、中山です。

GitHub Enterprise(以下GHE) on AWSシリーズの第8弾です。以前のエントリではAmazon Kinesis Streams/Amazon Kinesis Firehoseを利用した方法をご紹介しましたが、今回はGHEのログをfluentdのS3アウトプットプラグインでアーカイブする方法をご紹介します。

GHEは基本的に社内でのみ利用される場合がほとんどだと思います。つまり外部ユーザが利用する機会がほぼ無いはずです。そういった場合、ログは念のため保存しておきたいがその分析や可視化までは不要だと考える方々は多いのではないでしょうか。Amazon Kinesisはフルマネージドでほぼリアルタイムでのストリーミングデータ処理に対応した大変便利なサービスですが、こういった用途には少し大仰な嫌いがあるかもしれません。「とりあえずGHEのログだけ保存したい」といった場合でしたら今回ご紹介するツールの導入を検討されると良いかと思います。

また、最近のAWS関連サービスのアップデートを見ていると、S3がデータ分析のハブ(データレイク)として際立ってきている印象があります。今回はご紹介しませんが、Amazon Athenaの登場及びAmazon QuickSightのAthenaサポートなどなど興味深いアップデートが続いています。つまり分析/可視化用途としてもとりあえずS3にログを置いておくというのは選択肢としてありだと思います。

今回動作検証した主要なソフトウェア/OSのバージョンは以下の通りです。バージョンによって設定方法が変更される可能性があります。その点ご了承ください。

  • GHE: 2.8.4
  • Amazon Linux: 2016.09.1 (HVM), SSD Volume Type - ami-9be6f38c
  • fluentd: 0.12.29
  • fluent-plugin-s3: 0.7.1

構成

今回は以下のような構成を作成します。

image3

かなりシンプルな構成になっています。GHEからフォワードされたログをfluentdがインストールされたEC2でS3にリアルタイムで転送しているだけです。

なお、 /etc/td-agent/td-agent.conf の設定内容は社内でfluentdマスターとして名高い以下のエントリを参照しています。

やってみる

GHEとVPCなどのネットワーク周りの設定、及びEC2構築までは以前のエントリと同じです。その部分については本エントリでは割愛させていただきます。ただし、以前はAmazon Kinesisを利用していたためEC2インスタンスに関連付けるIAM Roleにそれらサービス用の権限を付与していました。今回はS3にログを転送するだけなので以下のような権限をアタッチするだけでOKです(参考)。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::<_YOUR_S3_BUCKET_NAME_>"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:CreateBucket"
      ],
      "Resource": [
        "arn:aws:s3:::<_YOUR_S3_BUCKET_NAME_>/*"
      ]
    }
  ]
}

今回も各種セットアップにはCLIを利用して進めていきます。といってもfluentdをセットアップするだけですが。。。

1. fluentdのセットアップ

以下のコマンドを実行してください。

# SSHログイン
$ ssh -i path/to/key ec2-user@<_YOUR_EC2_PUBLIC_IP_>
<snip>
# fluentdのインストール
[ec2-user@ip-172-31-3-179 ~]$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
<snip>
# 設定ファイルの作成
[ec2-user@ip-172-31-3-179 td-agent]$ cat <<'EOT' > td-agent.conf
> <source>
>   @type syslog
>   port 514
>   bind 0.0.0.0
>   tag ghe
> </source>
> <match ghe.**>
>   type s3
>   s3_region ap-northeast-1
>   s3_bucket knakayama-test-bucket1
>   s3_object_key_format %{time_slice}/ghe_%{index}.%{file_extension}
>   buffer_path /var/log/td-agent/s3/ghe
>   time_slice_format year=%Y/month=%m/day=%d/hour=%H/minute=%M
>   time_slice_wait 10s
>   utc
>   buffer_chunk_limit 64m
>   format json
>   include_time_key true
>   time_key log_time
> </match>
> EOT
# UDP:514でListenさせるためにtd-agent実行ユーザとグループをrootに変更
[ec2-user@ip-172-31-3-179 ~]$ sudo sed -E -i \
  -e 's/(TD_AGENT_USER=)td-agent/\1root/' \
  -e 's/(TD_AGENT_GROUP=)td-agent/\1root/' \
  /etc/init.d/td-agent
# td-agentの起動
[ec2-user@ip-172-31-3-179 td-agent]$ sudo service td-agent start
td-agent td-agent:                                         [  OK  ]

2. 動作確認

上記設定後以下のようにS3へログが出力されていれば成功です。

# ログが出力されていることを確認
$ aws s3 ls s3://<_YOUR_S3_BUCKET_NAME_> --recursive
2016-12-24 16:21:29       4516 year=2016/month=12/day=24/hour=07/minute=20/ghe_0.gz
2016-12-24 16:22:29       8696 year=2016/month=12/day=24/hour=07/minute=21/ghe_0.gz
2016-12-24 16:23:29       3139 year=2016/month=12/day=24/hour=07/minute=22/ghe_0.gz
2016-12-24 16:24:40       2789 year=2016/month=12/day=24/hour=07/minute=23/ghe_0.gz
2016-12-24 16:25:40       1726 year=2016/month=12/day=24/hour=07/minute=24/ghe_0.gz
2016-12-24 16:26:40       1540 year=2016/month=12/day=24/hour=07/minute=25/ghe_0.gz
# 中身を確認
$ aws s3 cp s3://<_YOUR_S3_BUCKET_NAME_>/year=2016/month=12/day=24/hour=07/minute=25/ghe_0.gz - | gunzip
{"host":"******************************","ident":"enterprise_manage_unicorn","message":"[2016-12-24T07:25:00.040950 #5652]  INFO -- : 127.0.0.1 - - [24/Dec/2016 07:25:00] \"GET / HTTP/1.0\" 302 - 0.0007","log_time":"2016-12-24T07:25:00Z"}
{"host":"******************************","ident":"github_production","message":"07:24:57 +0000 [metrics resque.queued]: {:queue=>\"dgit_repairs\", :class=>\"github-jobs-dgit_gist_maintenance_scheduler\"} 2978.53018830188ms","log_time":"2016-12-24T07:25:00Z"}
{"host":"******************************","ident":"github_production","message":"07:24:59 +0000 [metrics resque.performed]: {:queue=>\"dgit_repairs\", :class=>\"github-jobs-dgit_gist_maintenance_scheduler\"} 24.099961999999998ms","log_time":"2016-12-24T07:25:00Z"}
{"host":"******************************","ident":"github_production","message":"07:24:57 +0000 [metrics resque.queued]: {:queue=>\"dgit_repairs\", :class=>\"github-jobs-dgit_maintenance_scheduler\"} 3068.218654876587ms","log_time":"2016-12-24T07:25:00Z"}
<snip>

まとめ

いかがだったでしょうか。

fluent-plugin-s3を利用したGHEのログアーカイブ方法についてご紹介しました。fluentdはかなりポピュラーなソフトウェアですし、S3へのアウトプットは鉄板構成だと思います。そのためあまり新規性のあるエントリではなかったかもしれません。。。とは言え、GHEに絞った形での情報はあまりなかったようなので、もし似たような構成を検討されている方がいましたら参考にしていただければと思います。

本エントリがみなさんの参考になれば幸いに思います。