Carpe Diem

備忘録

CloudWatch LogsのログをS3へ【エクスポート編】

概要

CloudWatch LogsはAWSでは一番簡単に用意できる検索可能なログ基盤だと思います。
一方で

  • 詳細な検索がしにくい(クエリやUI的に)
  • ログが大量に増えると料金も嵩んでくる
  • Terraformや操作ミス(保持期間の誤設定など)で間違って消してしまうリスク

といった問題もあるので、そういった場合の対策としてS3やLambdaに渡してデータを保存・変換させたりする手法が一般的です。

CloudWatch Logsではロググループを指定して簡単にS3へエクスポートできる機能も提供されているので、それを実行してみます。

手順

S3バケットの用意

バケット作成

デフォルト設定でサクッと作っちゃいます。
権限周りは後で設定するので既存のバケットでももちろんOKです。

f:id:quoll00:20181213111217p:plain

バケットポリシーの設定

CloudWatch LogsからS3へエクスポートするための権限をバケットポリシーで設定します。
これがないとCloudWatch Logsからエクスポートする際に権限が足りずエラーになります。

東京リージョンap-northeast-1にあるtest-bucketというバケット名だとして、以下のポリシーをアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-1.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::test-bucket"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-1.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::test-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

S3の「アクセス権限→バケットポリシー」で設定します。

f:id:quoll00:20181213131222p:plain

CloudWatch Logsからエクスポート

ロググループの指定

CloudWatch LogsでS3にエクスポートしたいロググループを指定し、アクションからエクスポートをクリックします。

f:id:quoll00:20181213105213p:plain

エクスポート期間の設定

どの期間のログをエクスポートするか指定します。
カレンダーでサクッと指定できます。
今回は1ヶ月分にしました。

f:id:quoll00:20181213105328p:plain

実行

実行を押すと「エクスポート中」という表示がされます。

f:id:quoll00:20181213105411p:plain

注意としてエクスポートは1度に1回しかできません。並行して複数エクスポートということはできません。

確認

S3バケットをみるとこのようにテストファイルとエクスポートファイルがあります。

f:id:quoll00:20181213110304p:plain

ストリーム毎にディレクトリが切られて保存されます。

f:id:quoll00:20181213110142p:plain

保存形式はデフォルトで.gzになってます。ファイルサイズは32MB毎のようですね。

f:id:quoll00:20181213110212p:plain

まとめ

簡単にCloudWatch LogsからS3へエクスポートすることができました。
次回はKinesis Firehoseを使ってリアルタイムにS3へ流す仕組みを作ってみます。

ソース