はじめに
CloudWatch でログを収集することができますが、収集したログを S3 に自動転送したいことがあるかと思います。そんな時は Kinesis Data Firehose が役に立つということで、実際に自分で手を動かして試してみました。
使用するサービス
- Amazon CloudWatch・・・AWS リソースと AWS で実行するアプリケーションのモニタリングサービス
- Amazon Simple Storage Service (Amazon S3)・・・AWSが提供するオブジェクトストレージサービス
- Amazon Kinesis Data Firehose・・・ユーザからの入力やアクセスログなどで生成されたデータソースを、指定したAWSのサービスにストリーミングデータとして転送するサービス
アーキテクチャ
手順
- S3
- バケットを作成
- Kinesis
- IAMロールを作成
- 配信ストリームを作成
- CloudWatch
- IAMロールを作成
- ロググループ作成
- ログストリーム作成
- サブスクリプションフィルタ設定
- 動作確認
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 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 は扱うのが難しいイメージでしたが、設定自体は非常に簡単でしたね。今回試したことはログ収集の初歩的なことだと思うので、次はもう一歩踏み込んだ形のログ収集にチャレンジしてみようと思います。