この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、ゲームソリューショングループのsoraです。
今回は、EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみたことについて書いていきます。
構成
EC2にKinesis Agentをインストールして、Kinesis Data Firehoseを経由して、S3にログファイルを送信する構成です。
Kinesis Data FirehoseとS3の作成
Kinesis Data FirehoseとS3を作成します。(S3の作成は本記事では割愛します。)
Kinesis Data Firehoseについて、ソースはDirect PUT、送信先はS3として作成したS3を指定します。
EC2の準備
Webサーバの実装
EC2は以下ブログ記事内で作成したものに、アクセスログを出力するように修正したものを使用します。
GoでWebサーバを構築していますが、ApacheやNginxをインストールしたWebサーバでも問題ありません。
Kinesis Data Firehoseへログファイルを送信するため、EC2のIAMロールにはKinesis Data Firehoseへの権限を付与してください。
※間違えやすいポイントとして、IAMポリシーのActionについて、"kinesis"ではなく"firehose"が必要です。
本記事の主題とはずれますが、Goで構築したWebサーバではvar/log/golang-access.log
にアクセスログを出力するようなコードにしています。
http_kinesis.go
package main
import (
"html/template"
"log"
"net/http"
"os"
"time"
)
func frontHandler(w http.ResponseWriter, r *http.Request) {
// HTMLファイルのパース処理
resp, err := template.ParseFiles("front.html")
if err != nil {
log.Printf("template error: %v", err)
}
// 値の埋め込み+エラー処理
if err := resp.Execute(w, nil); err != nil {
log.Printf("failed to execute template: %v", err)
}
}
func accessLogHandler(next http.Handler, logger *log.Logger) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
logger.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
})
}
func main() {
// ログファイルのオープン
logFile, err := os.OpenFile("../../var/log/golang-access.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatalf("failed to open log file: %v", err)
}
defer logFile.Close()
// ログ出力先をファイルに設定
logger := log.New(logFile, "", log.LstdFlags)
http.HandleFunc("/front", frontHandler)
// アクセスログを出力するようにミドルウェアを追加
http.ListenAndServe(":8080", accessLogHandler(http.DefaultServeMux, logger))
// リクエスト状態の開始
log.Fatal(http.ListenAndServe(":8080", nil))
}
Kinesis Agentのインストールと設定
EC2にSSHでアクセスして、以下コマンドを実行します。
# Kinesisエージェントのインストール
$ sudo yum install –y aws-kinesis-agent
# Kinesisエージェントの設定ファイルの修正
$ sudo vi /etc/aws-kinesis/agent.json
/etc/aws-kinesis/agent.json
{
"cloudwatch.emitMetrics": false,
"firehose.endpoint": "firehose.ap-northeast-1.amazonaws.com",
"flows": [
{
"filePattern": "<Kinesis Data Firehoseに送るログファイル(今回は/var/log/golang*.log)>",
"deliveryStream": "<Kinesis Data Firehoseのストリーム名>"
}
]
}
設定ができたため、エージェントを起動します。
sudo service aws-kinesis-agent start
実行結果
EC2を起動してWebページにアクセスした後に、Kinesis Data Firehoseの配信ストリームのメトリクスを確認します。(何度か実行しているため、見づらくてすみません)
※もしKinesis Data Firehoseに正常にログを渡せていなければ、EC2にてvar/log/aws-kinesis-agent
にあるログを確認してみると良いです。
S3バケットも確認します。
配置されているオブジェクトをダウンロードして中身を確認してみます。(以下は一部抜粋したものです。)
2023/05/08 03:57:22 GET /front 686.065µs
2023/05/08 03:57:23 GET /favicon.ico 10.823µs
2023/05/08 03:57:24 GET /front 95.378µs
2023/05/08 03:57:25 GET /front 118.908µs
2023/05/08 03:57:25 GET /front 114.536µs
2023/05/08 03:57:25 GET /front 147.352µs
2023/05/08 03:57:26 GET /front 99.988µs
2023/05/08 03:57:26 GET /front 102.057µs
2023/05/08 04:06:30 GET /front 144.725µs
アクセスログがS3に配置できていることが確認できました。
参考ページ
Kinesis エージェントを使用した Kinesis Data Firehose への書き込み
最後に
今回は、EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみたことを記事にしました。
どなたかの参考になると幸いです。