EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみた

2023.05.08

こんにちは、ゲームソリューショングループの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にログファイルを送信してみたことを記事にしました。
どなたかの参考になると幸いです。