猫キック

IT関連について投稿

【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により、オブジェクトの暗号化を実施するようにします。


f:id:nekodoublekick:20210625230405p:plain



設定


0. 事前準備

  • KMSコンソールを開き、対称のCMK作成。Kinesis用とS3暗号化用で準備.
    • Firehose用のCMK /demo/firehose/defaultkey
    • S3用のCMK /demo/s3/defaultkey


  • S3コンソールを開き、S3バケット作成.
    • バージョニングを有効. SSE-KMSを指定してS3用のCMK/demo/s3/defaultkeyでオブジェクトを暗号化.



1. Kinesis Data Firehose設定

Kinesisコンソールを開き、以下の通りに実施。必要最低限の設定以外は、全てデフォルトで。

  • Delivery stream nameでストリーム名を入力。SourceDirect PUT or other sourcesを指定して、Server-side encryption for source records in the delivery streamを以下のように設定して、Next.

f:id:nekodoublekick:20210625230050p:plain


  • Process recordsではストリームデータの変換が可能。今回は設定しない為、Next.


f:id:nekodoublekick:20210625230123p:plain

  • S3 compressionGZIPを選択。S3 compression and encryption でCMK/demo/s3/defaultkeyを利用してオブジェクトを出力する設定を入力して、Next.

f:id:nekodoublekick:20210625230207p:plain

  • 確認画面.設定内容に誤りがないかを確認して、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 サブスクリプションフィルタ作成

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




確認

  • Firehoseストリームを選択して、Monitoring欄にメトリクスが出力される。データのインカミングとS3へのデリバリーのステータスを確認。
  • ロググループ/aws/kinesisfirehose/[Firehose Stream Name]から、エラー関連のログが出力されないこと。
  • S3バケットを確認。ログが配信されていること。



問題点

当たり前ですが、1つのストリームに複数のCWLグループを選択した場合、S3への出力は、CWLグループごとに出力するわけではなくストリーム単位で出力されます。つまり、複数のCWLを選択したら、出力されるログからはOSログやAWSサービスログが混在した形で出力されます。 他にもログアーカイブの方法としてはLambdaを利用した方法があるため、そちらについても、実施しようと思います。



参考