Java WebアプリでFirehoseを使用したログ収集

はじめに

今回、なぜ、このような構成を構築してみようかと思ったか等、前提条件も含め以下に記載してみます。

  • EC2を使用し、Java Webアプリを稼働させたい
  • Java Webアプリのログを一か所に集約すること
  • EC2を増台した際の構築手順の簡素化
  • ログ出力方法はlogbackを使用した方法を採用したい

タイトルにある構成を採用してみたという経緯があります。firehoseとS3の構築については、以下をご参照ください。今回はログを格納する先はS3としています。

引用元:Kinesis Firehoseを使ってCloudWatch Logをs3へ出力してみた

まずはアプリ構築

シンプルなアプリを作成します。ベースとなるWebアプリ部分は割愛させていただきますが、構成としてはMavenを使用したアプリとなります。ログ出力はKinesis Logback Appenderを使用し、firehoseと連携を行います。

引用元:LOGBack Appender for Amazon Kinesis

ライブラリの追加のため、pom.xmlに下記を追記します。

        <dependency>
            <groupId>com.gu</groupId>
            <artifactId>kinesis-logback-appender</artifactId>
            <version>2.0.1</version>
        </dependency>

logbackの設定ファイルのlogback.xmlにfirehoseとの連携情報を追記します。

    <appender name="logback_appender_name" class="com.gu.logback.appender.kinesis.FirehoseAppender">
        <region>ap-northeast-1</region>
        <streamName>firehose_stream_name</streamName>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%m</pattern>
        </layout>
    </appender>
  • class:追加したライブラリのAppenderを指定
  • region:使用しているリージョンを指定
  • streamName:Firehoseで作成したストリーム名を指定

これでWebアプリの実装は完了となります。ただしこれだけではfirehoseとの連携はできませんので、今回はEC2のインスタンスプロファイルを対象にポリシー設定の追加を行うことでfirehoseとの連携ができるようにします。

EC2のポリシー設定を追加

なぜ、ポリシー追加にしたかというと、EC2上にアクセスキー、シークレットキーを記載したファイルを管理したくない、EC2を増台した際の構築手順を簡単にしたいという点より、ポリシー追加という選択をしました。

以下のポリシーを追加し、EC2インスタンスに設定されているIAMロールに作成したポリシーをアタッチします。

{
    "Version": "2021-01-01",
    "Statement": [
        {
            "Action": [
                "firehose:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:firehose:ap-northeast-1:9999999999999999999:deliverystream/firehose_stream_name",
            ]
        }
    ]
}

これで、Webアプリからfirehoseを使用してS3にログ収集を行うまでの構築が完了したことになります。

実際に動かしてみる

実際にEC2上でWebアプリを起動してログがS3に収集されていることを確認します。

ログが問題なく出力されていることが確認できました。ただし、1点注意するポイントとしては、S3のバケットに対して作成されているフォルダ階層に日付を指定した際に、時刻の基準がUTCとなってしまうことです。

firehoseの構築時にS3設定で以下のように設定した場合となります。

今回はS3を収集先に設定するとしましたが、サードパーティーとの連携も可能となっています。今回の構成ではlogbackを利用したログ出力から収集する内容を記載させていただきました。はじめに記載した4つポイントを考慮した構成を容易に構築することができました。