AWS Kinesisを利用することで、ログ集約サーバをサーバレス化します。
もくじ
事前準備
- EC2インスタンスを作成しておく
① IAM ロールの作成
EC2にIAMロールを作成して割り当てます。
- このロールを使用するサービスを選択:EC2
- ポリシー:AmazonKinesisFirehoseFullAccess
- ロール名:EC2-Kinesis-Full-Role
② Kinesis 配信ストリームの作成
【サービス】から【Kinesis】を選択し、【配信ストリームの作成】をクリックします。
- Delivery Stream name: EC2-Send-Log-S3(任意)
- Source: Direct PU or other sources
【Next】をクリックします。
Select a destination
バケットの作成
【Create new】を押して上記画像を参考にバケットを作成します。
Permissions
③ EC2対応
Apacheのインストール
# yum -y install httpd # systemctl enable httpd # systemctl start httpd
ログフォーマット設定 LTSV形式に変更
$ vi /etc/httpd/conf/httpd.conf ... LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common + LogFormat "time:%t\tforwardedfor:%{X-Forwarded-For}i\thost:%h\treq:%r\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tua:%{User-Agent}i\treqtime_microsec:%D\tcache:%{X-Cache}o\truntime:%{X-Runtime}o\tvhost:%{Host}i" ltsv <IfModule logio_module> # You need to enable mod_logio.c to use %I and %O LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> CustomLog "logs/access_log" combined + CustomLog logs/access_log_ltsv ltsv ...
Athenaで検索するのでLTSV形式にしています。
設定の反映
# systemctl restart httpd
パーミッション重要!
# chmod 755 /var/log/httpd # chmod 644 /var/log/httpd/access_log
Kinesis-Agentがログを読めないといけません。
Kinesis Agentのインストール
$ sudo yum install –y https://s3.amazonaws.com/streaming-data-agent/aws-kinesis-agent-latest.amzn1.noarch.rpm
設定ファイル編集
$ sudo vi /etc/aws-kinesis/agent.json { "cloudwatch.emitMetrics": true, "kinesis.endpoint": "", "firehose.endpoint": "", "flows": [ { "filePattern": "/tmp/app.log*", "kinesisStream": "yourkinesisstream", "partitionKeyOption": "RANDOM" }, { "filePattern": "/tmp/app.log*", "deliveryStream": "yourdeliverystream" } ] } ↓変更 { "cloudwatch.emitMetrics": false, "firehose.endpoint": "https://firehose.ap-northeast-1.amazonaws.com", "flows": [ { "filePattern": "/var/log/httpd/access_log_ltsv", "deliveryStream": "EC2-Send-Log-S3" } ] }
- “filePattern”: “<ログのパス>”
- “deliveryStream”: “<Kinesis デリバリーストリーム>”
- “firehose.endpoint”: “<Firehorseエンドピント>”
# systemctl restart aws-kinesis-agent # systemctl enable aws-kinesis-agent
④ WEBにアクセスしてログ送信
http://<EC2 IPアドレス>/
Kinesis-Agentのログを見る
# tail -f /var/log/aws-kinesis-agent/aws-kinesis-agent.log 2019-10-11 05:26:40.551+0000 ip-172-31-20-252.ap-northeast-1.compute.internal (Agent.MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.Agent [INFO] Agent: Progress: 735 records parsed (148449 bytes), and 735 records sent successfully to destinations. Uptime: 450046ms 2019-10-11 05:27:10.545+0000 ip-172-31-20-252.ap-northeast-1.compute.internal (FileTailer[fh:EC2-Send-Log-S3:/var/log/httpd/access_log].MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.tailing.FileTailer [INFO] FileTailer[fh:EC2-Send-Log-S3:/var/log/httpd/access_log]: Tailer Progress: Tailer has parsed 735 records (148449 bytes), transformed 0 records, skipped 0 records, and has successfully sent 735 records to destination. 2019-10-11 05:27:10.551+0000 ip-172-31-20-252.ap-northeast-1.compute.internal (Agent.MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.Agent [INFO] Agent: Progress: 735 records parsed (148449 bytes), and 735 records sent successfully to destinations. Uptime: 480046ms 2019-10-11 05:27:40.545+0000 ip-172-31-20-252.ap-northeast-1.compute.internal (FileTailer[fh:EC2-Send-Log-S3:/var/log/httpd/access_log].MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.tailing.FileTailer [INFO] FileTailer[fh:EC2-Send-Log-S3:/var/log/httpd/access_log]: Tailer Progress: Tailer has parsed 735 records (148449 bytes), transformed 0 records, skipped 0 records, and has successfully sent 735 records to destination. 2019-10-11 05:27:40.551+0000 ip-172-31-20-252.ap-northeast-1.compute.internal (Agent.MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.Agent [INFO] Agent: Progress: 735 records parsed (148449 bytes), and 735 records sent successfully to destinations. Uptime: 510046ms
Agent: Progress: 735 records parsed (148449 bytes), and 735 records sent successfully to destinations.
送信に成功した旨のログがでています。
デフォルトだと300秒経つか、5MBを越えるとS3に送信する仕様になっています。
⑤ S3のバケットを確認
ログの転送を確認できたらおっけ。
⑥ 複数サーバからの集約確認
複数サーバからKinesisのデリバリーストリームに送って、ログ集約できるかのテストを行います。
きちんとKinesisで集約されてS3にアップロードされています。
Kinesis Firehoseを利用することでログ集約サーバをサーバレス化できました。