CloudWatch Logs を "自動で" S3 にエクスポートする方法。その 1 、Kinesis Data Firehose を使用する方法。

記事タイトルとURLをコピーする

こんにちは😺
技術課の山本です。

前回、AWS マネジメントコンソールを使って、CloudWatch Logs を手動で S3 にエクスポートするブログを書きました。

CloudWatch Logs を AWS マネジメントコンソールから手動で S3 バケットにエクスポートする - サーバーワークスエンジニアブログ

本記事では、CloudWatch Logs を自動で S3 にエクスポートする方法を紹介します。
AWS マネジメントコンソールを使用して作成していきます。
以下 2 つを紹介できればと思います。
本記事では 1 の Kinesis Data Firehose を使用する方法 をお伝えします。

  1. Kinesis Data Firehose を使用する方法
  2. EventBridge を使用する方法

EventBridge + Lambda ▶ S3 という構成も考えられるものの、シンプルさがなくなるので除外します。

また、前回の記事で以下のように記載しました。

結論としては、「何も考えずに長らく CloudWatch Logs に保管していたログを、S3 に保管して料金削減したい」という場合に良いのかなと感じました。

本記事で紹介する Kinesis Data Firehose を経由して、S3 に保管する方法では、Kinesis Data Firehose の料金もかかってくるため、料金削減にはならなそうです。 一方でリアルタイムに配信ができるので、リアルタイム分析用途には使えそうです。

1. Kinesis Data Firehose を使用する方法

イメージ:

CloudWatch Logs のサブスクリプションフィルター を使用して、Kinesis Data Firehose にストリーミング配信し、最終的に S3 に配信します。

サブスクリプションフィルターは、Kinesis データストリーム、Lambda、または Kinesis Data Firehose で使用できます。サブスクリプションフィルターを介して宛先サービスに送信されるログは、base64 でエンコードされ、gzip 形式で圧縮されます。

とあるため、gzip 形式で S3 に配信されます。

Kinesis Data Firehose のストリームを作成

まず、Kinesis Data Firehose のストリームを作成します。
CloudWatch Logs から配信する場合、「ソース」は「Direct PUT」を選択します。 「送信先」は「Amazon S3」です。
「配信ストリーム名」を適当に決めます。

変換・転換はなしとします。 圧縮率の高い parquet を選択する場合は Glue にデータベースが必要です。

配信先となる S3 バケットを選択します。(S3 バケットの作成方法は割愛)

Kinesis Data Firehose でのバッファサイズはそのままとします。

他は特に変えずに、Kinesis Data Firehose の配信ストリームを作成します。Kinesis Data Firehose 用の IAM ロールも自動作成になります。

作成できました。

CloudWatch Logs に付与する IAM ロールの作成

CloudWatch Logs に付与する IAM ロールを作成していきます。

カスタム信頼ポリシーは以下としてください。 ap-northeast-1 は使用するリージョンに、123456789012 は AWS アカウント番号に置き換えてください。参考」例 3: Amazon Kinesis Data Firehose を使用したサブスクリプションフィルター

{
  "Statement": {
    "Effect": "Allow",
    "Principal": { "Service": "logs.amazonaws.com" },
    "Action": "sts:AssumeRole",
    "Condition": { 
         "StringLike": { 
             "aws:SourceArn": "arn:aws:logs:ap-northeast-1:123456789012:*"
         } 
     }
  }
}

以下内容の カスタマー管理の IAM ポリシーを作成し、IAM ロールに付与してください。
CloudWatch Logs に付与する IAM ロール名Kinesis Data Firehose の配信ストリーム名 は置き換えください。
123456789012 は AWS アカウント番号に置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "firehose:ListDeliveryStreams",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole",
                "firehose:*"
            ],
            "Resource": [
                "arn:aws:iam::123456789012:role/CloudWatch Logs に付与する IAM ロール名",
                "arn:aws:firehose:ap-northeast-1:123456789012:deliverystream/Kinesis Data Firehose の配信ストリーム名"
            ]
        }
    ]
}

CloudWatch Logs のサブスクリプションフィルターを作成

送信先には、先に作成した Kinesis Data Firehose の配信ストリームを指定します。
アクセス許可には、先に作成した CloudWatch Logs に付与する IAM ロール を指定します。

サブスクリプションフィルター名 に任意の名前を入れます。

ストリーミングを開始」ボタンを押します。

確認

年・月・日・時間の単位でフォルダができていました。

中に gzip の圧縮ファイルがあります。拡張子はついてません。
私の端末は mac なので拡張子 gz をつけて Finder で解凍し、中を見ると、以下の様になっていました。

複数行のログが 1 行にまとめられています。
視認性は良くないですね。

元のログ:

料金面

2023/12/13 時点の料金です。 Kinesis Data Stream での取り込み料金が GB あたり 0.036USD (最初の 500 TB)で、取り込み料金だけでCloudWatch や S3 の保管料金よりも高いです。 コストだけを考えるなら、Kinesis Firehose 経由で S3 に送るよりも CloudWatch に保存している方が安そうですね。 S3 に保管されるデータは gzip に圧縮されているので、S3 側の保管料金は安くなりそうです。
Kinesis Data Firehose の保管料金:

料金 - Amazon Kinesis Data Firehose | AWS より

S3 の保管料金:

料金 - Amazon S3 |AWS より

CloudWatch の保管料金:

料金 - Amazon CloudWatch | AWS より

まとめ

Kinesis Data Firehose を使用し、CloudWatch Logs を自動で S3 にエクスポートする方法を検証してみました。
Kinesis Data Firehose を経由して、S3 に保管する方法では、Kinesis Data Firehose の料金もかかってくるため、料金削減にはならなそうです。 一方でリアルタイムに配信ができるので、リアルタイム分析用途には使えそうです。

余談

相変わらずトレランにはまっています。
「丹沢ケルベロス」という神奈川県のトレイルランニングコースを走ってきました。
「ケルベロス認証」以外で「ケルベロス」って聞いたのが久しぶりで、知ったときは笑ってしまいました。
距離 40km 、標高差 3500 m のタフなコースでした。
山頂からは相模湾が見えて、海なし県在住なので、感無量でした。

相模湾

初島

富士山

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、登山(たまに)