たそらぼ

日頃思ったこととかメモとか。

CloudWatch Logsのサブスクリプションフィルタの上限数問題と対応策

記事執筆現在、CloudWatch Logsのサブスクリプションフィルタ数には上限がありますが、どこに書いてあるか分かりにくかったのでメモです。

サブスクリプションフィルタについて

CloudWatch Logsに流れ込んでくるログデータを、フィルタリングして、リアルタイムに別のAWSサービスに転送することができる機能です。ロググループ単位で作成することができ、すごく便利な機能なのですが、一度にロググループにつけることができる数に上限があります。

1 ロググループあたり 1つまで

CloudWatch Logsの制限については、公式ドキュメントの以下に記載があります。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html

1 ロググループあたり 1。このクォータは変更できません。

まじか、もっとつけさせてくれ。。。

対応策

サブスクリプションフィルタの転送先をKinesis streamにして、複数コンシューマで読み取ることができます。
docs.aws.amazon.com

f:id:tasotasoso:20200426072942p:plain:w500
kinesis streamをはさむ構成

データ部分は圧縮される

サブスクリプションフィルタで送信されるデータは、データ容量削減のため圧縮されます。Kinesis streamに流す場合、Kinesis レコードの Data 属性が、Base64エンコードされ、かつ、gzip 形式で圧縮された状態になっています。そのため、ログを使う場合は、Base64デコードして、さらに、gzip解凍する必要があります。

  • Node.jsで解凍する方法

ja.coder.work

bbh.bz

読み取りの競合が激しい場合

kinesis streamはデータの読み取りスループットが最大2MB/secですが、この構成だとデータの読み取り時に競合が起きてしまうため、頻繁に読み出しを行う場合は、拡張ファンアウトを作成すると良さそうです。
docs.aws.amazon.com

価格面

Kinesis streamはそこそこお金がかかります。1シャード置いておくだけでも1500~2000円/月くらい。例えば、単にログを共有したいくらいであれば、バッチ処理にはなりますが、エクスポート機能を使うと安く済みます。
tasotasoso.hatenablog.com

ちなみに、Lambdaだと、エクスポートした後に続けて処理をしようとするとstep functionsなどで頑張らないといけませんが、最近はFargateもできたので、コンテナで行うと良いかもしれません。これは記事があまりなかった気がするので、時間があれば実験してみます。