AWS のログ出力していますか?トラブルシューティングやログの分析のために、Athenaなどのサービスを使って、ログを分析することもあると思います。

今回はCloudwatch logs にあるログをS3 にエクスポートして、Athena で分析できるようにしてみます。ログの分析方法に関しては、以前ブログを書いていますので、よかったら見てみてください。記事の内容はCloudfront ログの分析ですが、参考になりますと幸いです!

http://blog.dev-tansanken.com/cloudfront\_log\_athena/

なぜCloudwatch logs からS3 にエクスポートするのか

今回S3 にエクスポートしようと思ったきっかけが、個人的にAthena の方が使いやすいということもあったのですが、全てのログをCloudwatch logs に出力するのではなく、S3 に出力して、そのまま圧縮できたらなという思惑がありました。

Cloudwatch logs insight のスキャンのデータ量によるコスト

また、Cloudwatch logs はこのブログにも記載されているようにCloudwatch logs のスキャンするときの容量は圧縮されてないデータ量になるので、この点でもログが多くなればなるほど、費用がかさみそうだと考えました。もちろん保持期間を失効しないにしている前提もあるかもしれません。

https://dev.classmethod.jp/articles/cloudwatch-logs-insights-scan-volume-cost

分析に使わない時は圧縮してコスト削減が可能になる?

Cloudwatch logs 自体もAWS 側で自動でかなり圧縮されるみたいですが、普段使わない場合は更に圧縮することも考えたくなりました。なので、S3 でGlacier でアーカイブ保存をしてあげることで更に費用を削減できる可能性があります。S3 のGlacier については次回以降のブログにて紹介できればと思っています。

ということで、Cloudwatch logs をS3 にエクスポートしてみましょう!手順はとても簡単です。

Cloudwatch logs をS3 にエクスポート手順

Cloudwatch に移動

ログを一つ選択した状態でアクション > データをAmazon S3 にエクスポート

エクスポートしたいログの期間を指定してバケットを選択

S3 のバケットの設定を変更

このままS3 にエクスポートするとエラーが発生します。

バケットポリシーの設定で以下のポリシーを追加してあげてください。

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

そしてlog のエクスポートを再実行すると、エクスポートが実行されます。
権限絞る必要がある場合は、ポリシーをもう少し限定的にすることはできるかもしれませんので、試してみてください!

S3 での出力を確認

定期的に実行するニーズがある場合

定期的にCloudwatch logs をS3 に転送したいニーズもあるかもしれません。その場合は、下記のような構成をとることによって、定期的にエクスポートすることが可能になります。Eventbridge でcron の設定をして、Cloudwatch logs から S3 に対してログをエクスポートするような構成になります。

場合によっては、S3 => S3 Glacier のライフサイクルを設定すると更によいこともあるかもしれません。

まとめ

ログの戦略って後回しがちにされることもありますが、ログの分析やコスト面での戦略を考えていくことでよりよい環境が作れるのではないでしょうか。ということでぜひ皆さんも考えてみてください。

参考文献

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/S3Export.html

https://zenn.dev/fy0323/articles/0c2b5b556d5a0a