AWS S3
今回はS3。
AWSの複数あるストレージサービスの一つです。
S3はファイルをアップロード、ダウンロードできるWebサービスです。
Webサーバとしても動作します。
特徴は、
容量制限がなく(5GB/file)、
非常に高い耐久性(99.999999999%)、
低価格です。
AWSは他に以下の様なストレージサービスを提供しています。
- EBS
- Glacier
- Storage Gateway
- EFS
EBSはEC2のディスクとしてアタッチするサービス。
Glacierはアーカイブストレージサービス。
Storage Gatewayはオンプレミスのストレージに接続するサービス。
EFSはNASサービス。
といったようにそれぞれ機能が違うので目的に応じたサービスをチョイスしましょう。
EC2でWebAP構築
↓
RDSでWebAP-DB構築
↓
AMIでEC2のイメージ化、複製
↓
ELBで冗長化
↓
ElastiCacheでセッション管理
↓
S3にアクセスログ保存 (今回はここ)
↓
(できれば)SQSでWebAP連携
S3は汎用的なストレージサービスであるため、本当に様々な用途があります。
今回はログの集約用途に利用します。
Webサーバやアプリケーションサーバを冗長化するとその分ログが各OSのファイルシステムに分散されてしまい、いざログを調査したい時に手間です。
またトラブル対応の調査する時にこのメッセージって過去にもあるんだろうか、など過去のログから比較をしたいけどそこまで古いログないや、ってことも多々あります。
ログの置き場所や保持世代数って運用設計でよく悩みます。
そんな時はS3に飛ばすことで、ログデータの集約、蓄積を実現できます。
今回はWebサーバのhttpdのアクセスログをFluentdでS3へ飛ばします。
それではいってみよう。
Simple Storage Service
- S3画面へ遷移
AWSのメニューからS3を選択します。
- バケットの作成
ファイル保存先のトップディレクトリ(FQDN)となるバケットを作成します。
[バケットの作成]ボタンを押下します。
- バケット名とリージョンの選択
各項目を入力して、[作成]ボタンを押下します。
バケット名:任意の名前を入力します。FQDNに含まれます。
リージョン:バケットを作成するリージョンを選択します。
- フォルダ作成
作成されたバケットが一覧に表示されます。
バケットのリンクを選択します。
バケットの中に入りました。
作成直後は何もデータが無いため、[バケット「<バケット名>」は空です。]と表示されます。とりあえず今回はアクセスログを置くので、
置き場となるフォルダを作成します。
[フォルダの作成]ボタンを押下します。
名前を入力します。
- Fluentd設定
Fluentdのインストールは以下の記事を参考にしてください。sfujimoto.hatenablog.com設定は以下になります。
input pluginはtailでaccess_logを監視します。
output pluginはs3で対象となるAWSのキー情報とバケット名、パスを指定します。以下、サンプル
# cat /etc/td-agent/td-agent.conf <source> type tail format apache path /var/log/httpd/access_log tag td.apache.access </source> <match td.apache.access> type s3 aws_key_id ************** aws_sec_key *********************** s3_bucket <bucket name> s3_region ap-northeast-1 path <folder name>/ buffer_path /var/log/td-agent/buffer # デバッグ用(デフォルトは1h) flush_interval 1s </match>
今回は試験用でflush_intervalを1秒毎にしています。
デフォルト設定では1時間単位にまとまったgzファイルが生成されます。
# ファイル容量が8MBにならない限りは。
- 動作確認
とりあえず、httpdにアクセスして、access_logに書き込みます。S3のManagementConsoleから作成したフォルダの中を確認します。
httpdにアクセスした数だけgzファイルが存在することでしょう。中を覗いてみましょう。
アップロードしたファイルのデフォルトアクセス権はAWSアカウントにしかないため、
アクセス権の設定を行います。
被付与者に「全員」を選択し、「開く/ダウンロード」を選択して、
「保存」ボタンを押下します。オブジェクトの「リンク」からURLを確認します。
gzファイルの中を確認してみると、
アクセスログの情報がJSON形式に変換されて格納されています。# curl -s https://s3-ap-northeast-1.amazonaws.com/<bucket name>/<folder name>/2015062113_3.gz |gunzip 2015-06-21T13:46:34Z td.apache.access {"host":"127.0.0.1","user":"-","method":"GET","path":"/","code":"200","size":"16","referer":"-","agent":"curl/7.40.0"}
これで集約を実現できました。
ただこの方法では単純な読み出しや解析が不便なので、
ログ集約が目的ならばElasticSearch+Kibanaで可視化する方が有用です笑次回はちょっと逸れてCloudFormationを試してみたいと思います。