【AWS】 CWL + Kinesis Data Firehose + S3 でログエクスポート
私です。
CWL → S3 へログのアーカイブパターンはいくつかありますが、この前、Kinesis Data Firehose 経由でログアーカイブするパターンを設定したため、自身の備忘録も含め、まとめたいと思います。
ログアーカイブについて
AWSにおけるログアーカイブとは、S3/S3 Glacierといったストレージサービスを利用して、ログを保管することです。
ログといっても種類は複数(OS、ミドルウェア、バックエンド、AWSサービス、別プロバイダの実行ログ...)存在します。このようなログは、システムに寄りますが、監査や調査・分析等さまざまな用途で利用されます。
例えば、AWSサービス上で稼働するシステムの場合 1. 監査やログ解析など分析や長期保存が目的の場合はS3へ出力。 2. 障害検知やログ監視が目的の場合はCWLへ出力。 といったように用途に応じて、ログの出力先を適切なサービスに出力する必要があります。
上記2.のログも、コスト面や長期保存や分析を理由に、CWLからS3へ出力しログを保管する必要があるため、その出力をKinesis Data Firehose を利用して実現しようと思います。
アーキテクチャ
全体の構成は以下の図の通り。CWLではロググループ内で サブスクリプションフィルタ を設定してサブスクリプションフィルタ経由で、Kinesis Data Firehoseへ出力します。配信ストリーム側のサーバサイド暗号化(SSE)を利用することで、ストリーム内でデータを暗号化された形で保護します。S3に出力時、データを復号化して出力。S3ではデータ保護の為、SSE-KMSにより、オブジェクトの暗号化を実施するようにします。
設定
0. 事前準備
- KMSコンソールを開き、対称のCMK作成。Kinesis用とS3暗号化用で準備.
- Firehose用のCMK
/demo/firehose/defaultkey
- S3用のCMK
/demo/s3/defaultkey
- Firehose用のCMK
- S3コンソールを開き、S3バケット作成.
- バージョニングを有効. SSE-KMSを指定してS3用のCMK
/demo/s3/defaultkey
でオブジェクトを暗号化.
- バージョニングを有効. SSE-KMSを指定してS3用のCMK
1. Kinesis Data Firehose設定
Kinesisコンソールを開き、以下の通りに実施。必要最低限の設定以外は、全てデフォルトで。
- Delivery stream nameでストリーム名を入力。Sourceは
Direct PUT or other sources
を指定して、Server-side encryption for source records in the delivery streamを以下のように設定して、Next.
- Process recordsではストリームデータの変換が可能。今回は設定しない為、Next.
- Choose a destinationで、Amazon S3 を送信先に設定して、S3 destinationを以下のように設定して、Next.
- S3 compressionでGZIPを選択。S3 compression and encryption でCMK
/demo/s3/defaultkey
を利用してオブジェクトを出力する設定を入力して、Next.
確認画面.設定内容に誤りがないかを確認して、Next. ストリームが作成される。
Firehoseに関連づいたIAMロールを開きポリシーを確認。 S3オブジェクトへEncryptionの許可を設定するため、IAMポリシーにEncryptionアクションを許可。また、
/demo/firehose/defaultkey
で復号化したストリームデータを、復号化した後、暗号化をするためReEncryptアクションを許可する設定が必要。以下のようなポリシーを追加。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReEncryptS3Key", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*" ], "Resource": "arn:aws:kms:[region]:[account_id]:key/[/demo/s3/defaultkey key_id]" } ] }
2. CWL サブスクリプションフィルタ用のIAMロールを作成
CWLサービスがData Firehose ストリームへの配信を許可するためのIAMロールを設定する。
信頼エンティティをlogs.[region].amazonaws.com
として、以下のようなIAMロールを作成する。
{ "Version": "2008-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.ap-northeast-1.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
次にIAMポリシーを設定. [role_name]
には、このポリシーをアタッチするIAMロール名を指定する。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:*" ], "Resource": [ "arn:aws:firehose:[region]:[account_id]:*" ] }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::[account_id]:role/[role_name]" ] } ] }
3. CWL サブスクリプションフィルタ作成
サブスクリプションフィルタを作成
- CWL コンソールでCWLグループを指定。サブスクリプションフィルター欄からCreate Kinesis Firehose subscription filterを指定。
- Kinesis Firehose delivery stream に作成したFirehoseストリーム名を指定。
- Select an existing roleに 2. で作成したサブスクリプションフィルター用のIAMロールを指定。
- サブスクリプションフィルター名を指定してサブスクリプションフィルタを作成
確認
- Firehoseストリームを選択して、Monitoring欄にメトリクスが出力される。データのインカミングとS3へのデリバリーのステータスを確認。
- ロググループ
/aws/kinesisfirehose/[Firehose Stream Name]
から、エラー関連のログが出力されないこと。 - S3バケットを確認。ログが配信されていること。
問題点
当たり前ですが、1つのストリームに複数のCWLグループを選択した場合、S3への出力は、CWLグループごとに出力するわけではなくストリーム単位で出力されます。つまり、複数のCWLを選択したら、出力されるログからはOSログやAWSサービスログが混在した形で出力されます。 他にもログアーカイブの方法としてはLambdaを利用した方法があるため、そちらについても、実施しようと思います。