AWS Lambda のログ出力先を S3 や Data Firehose とした場合もログ取り込み料金が大きく下がらない理由を調べてみた
こんにちは、製造ビジネステクノロジー部の若槻です。
昨年のアップデートで、AWS Lambda のログ出力先に S3 や Data Firehose を選択可能となりました。
また同アップデートで AWS Lambda のログは CloudWatch Logs の Vended Logs 扱いとなりました。
Vended Logs では AWS サービスがネイティブに出力されるログが利用量に応じた階層料金となります。2018年に発表され、初めは VPC Flow logs のみのサポートでした。
それが前述の通り Lambda が対象となり、また昨年秋には WAF ログも対象になるなど順次対象が増えていっています。
少し前の記事ですが、Vended Logs の対象サービス一覧は下記にまとめられています。
ここで Vended Logs のデータ取り込み料金を見てみると、月 10TB までの場合は S3 や Data Firehose を選択した場合でも CloudWatch Logs 低頻度アクセスログクラスと同じ料金となっています。さらに月 50TB 以上になると CloudWatch Logs 標準ログクラスとも同じ料金となっています。

Amazon CloudWatch Pricing | Free Tier Available より
出力先に S3 や Data Firehose を選択した場合は CloudWatch を利用する場合に比べて料金がもっと大きく下げられると考えていたのでこれは予想外でした。
そこで今回は、AWS Lambda のログ出力先を S3 や Data Firehose とした場合もログ取り込み料金が大きく下がらない理由を調べてみました。
はじめに結論
結論としては、Lambda の出力先に S3 や Data Firehose を選択した場合でも、実態としては CloudWatch Logs グループとサブスクリプションフィルターを介してログ転送が行われるからです。
確認してみた
まずは実際に Lambda のログ出力先に S3 を設定してみます。ロググループは新規作成とします。S3 バケットと IAM ロールはドキュメントの手順に従いあらかじめ作成したものを使用します。

するとロググループが作成されましたが、ログクラスが Delivery となっています。

Delivery ログクラスについては下記ドキュメントに記述がありました。
これら 2 つのログクラスに加えて、
Deliveryログクラスが存在します。このDeliveryログクラスは、AWS Lambda ログを Amazon S3 または Amazon Data Firehose に保存するために配信する場合にのみ使用してください。Delivery クラスのロググループ内のログイベントは、CloudWatch Logs に 1 日間のみ保存されます。このログクラスでは、CloudWatch Logs Insights クエリなどの豊富な CloudWatch Logs 機能は提供されません。(日本語訳)
そして Delivery ログクラスに出力されたログはサブスクリプションフィルターを用いて S3 や Data Firehose に送信されるそうです。
実際に確認してみると、確かに作成されています。サブスクリプションフィルターは明示的に作成しなかったため、マネジメントコンソールからロググループを新規作成時に合わせて自動で作成されたようです。
$ aws logs describe-subscription-filters --log-group-name 20260124-lambda-log-to-s3-test
{
"subscriptionFilters": [
{
"filterName": "lambda-logs-delivery",
"logGroupName": "20260124-lambda-log-to-s3-test",
"filterPattern": "",
"destinationArn": "arn:aws:s3:::20260124-wakatsuki",
"roleArn": "arn:aws:iam::XXXXXXXXXXXX:role/CWLtoS3Role",
"distribution": "ByLogStream",
"applyOnTransformedLogs": false,
"creationTime": 1769231378560
}
]
}
S3 バケットを見ると初回のテストログが出力されていました。

ここでロググループに戻って気が付いたのが、いくつかの機能がグレーアウトして制限されていることです。

これ、低頻度アクセスログクラスと同様の機能の制限のされ方なんですよね。
なので Delivery ログクラスは内実としては低頻度アクセスログクラスとほぼ同等の機能制限がされており、そのことが S3 や Data Firehose をログ送信先とした場合でも料金が Cloud Logs 低頻度アクセスログクラスと同じ料金水準となる理由のようです。
またログ転送のフローは下記のようになることも分かりました。
Lambda
↓
ロググループ(Delivery ログクラス)
↓
サブスクリプションフィルター
↓
S3 or Data Firehose
その他
ちなみに今回はマネジメントコンソールから S3 へのログ送信を設定すると「Delivery ログクラスのロググループ」と「サブスクリプションフィルター」の2つが自動で作成されましたが、あらかじめ手動で作成して指定しすることも可能です。
Delivery ログクラスのロググループの作成コマンドは下記となります。
aws logs create-log-group \
--log-group-name my-logs \
--log-group-class DELIVERY
例えば AWS CDK で Lambda のログ送信先を S3 または Data Firehose とする実装を行いたい場合は、Lambda のロググループを「Delivery ログクラスのロググループ」とし、加えて「サブスクリプションフィルター」を作成すれば出来そうです。
ただし aws-cdk-lib.aws_logs module の L2 コンストラクトクラスではログクラスは 標準と低頻度アクセスの2つしかサポートされていないので、L1 を使うなどの工夫が必要そうです。
おわりに
AWS Lambda のログ出力先を S3 や Data Firehose とした場合もログ取り込み料金が大きく下がらない理由を調べてみました。
下記のアップデートを見た当初は「S3 へのログ送信に サブスクリプションフィルターが不要になるのか」と思っていましたが、実際には Delivery ログクラスのロググループとサブスクリプションフィルターを介してログ転送が行われることが分かりました。なので料金も CloudWatch Logs 低頻度アクセスログクラスと同じ料金水準となるわけですね。
以上







