AWSの部屋

AWS学習者向けのブログです

CloudWatch のログを Kinesis Data Firehose 経由で S3 に保存する

はじめに

CloudWatch でログを収集することができますが、収集したログを S3 に自動転送したいことがあるかと思います。そんな時は Kinesis Data Firehose が役に立つということで、実際に自分で手を動かして試してみました。

使用するサービス

  • Amazon CloudWatch・・・AWS リソースと AWS で実行するアプリケーションのモニタリングサービス
  • Amazon Simple Storage Service (Amazon S3)・・・AWSが提供するオブジェクトストレージサービス
  • Amazon Kinesis Data Firehose・・・ユーザからの入力やアクセスログなどで生成されたデータソースを、指定したAWSのサービスにストリーミングデータとして転送するサービス

アーキテクチャ

手順

  1. S3
    1. バケットを作成
  2. Kinesis
    1. IAMロールを作成
    2. 配信ストリームを作成
  3. CloudWatch
    1. IAMロールを作成
    2. ロググループ作成
    3. ログストリーム作成
    4. サブスクリプションフィルタ設定
  4. 動作確認
    1. AWS CLI で CloudWatch にログを出力
    2. S3 のバケットを確認

1. S3

1. バケットを作成

以下のようにバケットを作成します。設定はすべてデフォルトでOKです。

2. Kinesis

1. IAMロールを作成

Kinesis Data Firehose に S3バケットへデータを出力する権限を与えます。今回は以下のようなロールを作成しました。

2. 配信ストリームを作成

以下のように値を設定して配信ストリームを作成します。

項目
Source Direct PUT
Destination Amazon S3
Delivery stream name 配信ストリーム名
S3 bucket s3://<作成したバケット名>

このように配信ストリームが作成されました。

3. CloudWatch

1. IAMロールを作成

CloudWatch に Kinesis Data Firehose へデータを出力する権限を与えます。今回は以下のようなロールを作成しました。(CloudWatchのロールに関しては作り方が少しトリッキーなため、こちらをご参照ください)

2. ロググループを作成

以下のようにロググループを作成します。

3. ログストリームを作成

作成したロググループにログストリームを作成します。

以下のようにログストリームを作成しました。

4. サブスクリプションフィルタを作成

作成したロググループにサブスクリプションフィルタを作成します。

以下のように値を設定します。

項目
Destination account 現在のアカウント
Kinesis Firehose delivery stream 作成した配信ストリーム名
既存のロールを選択 CloudWatch用に作成したIAMロール
ログの形式 その他
サブスクリプションフィルター名 サブスクリプションフィルターの名前
テストするログデータを選択 作成したログストリーム名

4. 動作確認

1. AWS CLI で CloudWatch にログを出力

AWS CLI で 以下のようにしてログを出力します。

aws logs put-log-events --log-group-name log-to-kinesis --log-stream-name log-stream-to-kinesis --log-events timestamp=1653457849182,message="test"
2. S3 のバケットを確認

作成したバケットに以下のようなデータが格納されていることを確認します。

データは圧縮されているので、ダウンロードして解凍するとログが格納されていることが確認できます。

{"messageType":"CONTROL_MESSAGE","owner":"CloudwatchLogs","logGroup":"","logStream":"","subscriptionFilters":[],"logEvents":[{"id":"","timestamp":1653552879998,"message":"CWL CONTROL MESSAGE: Checking health of destination Firehose."}]}{"messageType":"DATA_MESSAGE","owner":"370560102364","logGroup":"log-to-kinesis","logStream":"log-stream-to-kinesis","subscriptionFilters":["log-to-kinesis-filter"],"logEvents":[{"id":"36873342191118257728364867749675187185934849327962587136","timestamp":1653457849182,"message":"test"}]}

さいごに

Kinesis Data Firehose は扱うのが難しいイメージでしたが、設定自体は非常に簡単でしたね。今回試したことはログ収集の初歩的なことだと思うので、次はもう一歩踏み込んだ形のログ収集にチャレンジしてみようと思います。