Amazon Data Firehoseの設計入門|aws firehoseでLinuxのログをS3へリアルタイム収集するマルチAZ構成パターン

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > AWS(Amazon Linux) > Amazon Data Firehoseの設計入門|aws firehoseでLinuxのログをS3へリアルタイム収集するマルチAZ構成パターン
Linuxサーバーのアクセスログやシステムログを「とりあえずS3に蓄積しておきたい」けれど、cronでrsyncやaws s3 cpを定期実行するのは転送漏れのリスクがある。かといって専用のEC2インスタンスをログ集積用に立てるのは運用コストがかかる。そんな悩みを解消するのが Amazon Data Firehose(旧称:Amazon Kinesis Data Firehose)です。

Amazon Data Firehoseは、ストリーミングデータをS3・Amazon Redshift・OpenSearch Serviceなどへリアルタイムに配信するフルマネージドサービスです。スケーリング・冗長性・障害復旧をAWSが管理するため、インフラ運用なしにログ収集基盤を構築できます。

この記事では、LinuxサーバーからS3へログを収集するケースを主軸に、デリバリーストリームのバッファリング設計・圧縮形式の選択・S3プレフィックスのパーティション設計・マルチAZ冗長性の考え方まで、設計レベルで解説します。

動作確認環境: AWS CLI v2(2026年9月時点)

この記事のポイント

・Amazon Data FirehoseはAZ障害を意識せず使える設計(マルチAZ組み込み)
・バッファリング間隔(60秒~15分)の設定がコストと遅延のトレードオフになる
・S3プレフィックスをHive形式に設計するとAthenaのスキャンコストを削減できる
・CloudWatch Logsサブスクリプションフィルターとの組み合わせが最もシンプルな構成


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Amazon Data Firehoseとは何か(マルチAZ冗長性が組み込みで提供されている仕組み)

Amazon Data Firehoseは2023年11月に「Amazon Kinesis Data Firehose」から改称されました。名前が変わっただけで機能・ARN・CLIサブコマンド名(firehose)は変わっておらず、既存の構成はそのまま動作します。

設計上の最大の利点は、マルチAZ冗長性が組み込みで提供されている点です。Firehoseのデリバリーストリームは内部で複数のアベイラビリティゾーン(AZ)にデータを複製します。ALBやRDSのようにマルチAZ設定を明示的に有効化する必要はなく、ストリームを作成した時点でAZ障害への耐性が確保されます。

「EC2インスタンスを複数AZに配置してcronでS3転送する」構成との比較で考えると、その差は明確です。EC2が置かれているAZで障害が起きると転送が止まります。Firehoseは送信側のEC2やサーバーが止まらない限り、受信・配信の経路はAZ障害の影響を受けません。

デリバリーストリームの存在確認はawsコマンドで行います。

# デリバリーストリームの一覧確認 aws firehose list-delivery-streams --region ap-northeast-1 # 出力例 { "DeliveryStreamNames": [ "linux-accesslog-to-s3", "syslog-to-s3" ], "HasMoreDeliveryStreams": false }

デリバリーストリームの設計(バッファリング・圧縮・暗号化の選択基準)

デリバリーストリームはFirehoseの主な設定単位です。ここでの設計判断がコスト・遅延・S3オブジェクト数に直結します。

1. バッファリング間隔とバッファサイズの設計

FirehoseはS3にデータを書き込む前にバッファに溜めます。バッファが満たされると即時フラッシュし、満たされなければ設定した間隔でフラッシュします。

・バッファサイズ: 1MB~128MB(デフォルト5MB)
・バッファ間隔: 60秒~900秒(デフォルト300秒)

設計の考え方は次のとおりです。

・S3オブジェクト数を減らしてPUT料金を抑えたい → 間隔を長く・サイズを大きく設定する
・ログの取り込み遅延を最小化したい → 間隔を60秒に設定する
・急激なスパイク(ピーク時に大量データが届く)がある → バッファサイズを大きくしてオブジェクト細分化を防ぐ

本番のLinuxサーバーログを収集する場合、多くの現場では間隔60秒・サイズ5MBから始めて、CloudWatchメトリクスの DeliveryToS3.DataFreshness を見ながら調整するのが無難です。

# デリバリーストリームのバッファリング設定を確認 aws firehose describe-delivery-stream \ --delivery-stream-name linux-accesslog-to-s3 \ --query "DeliveryStreamDescription.Destinations[0].ExtendedS3DestinationDescription.BufferingHints" # 出力例 { "SizeInMBs": 5, "IntervalInSeconds": 60 }

2. 圧縮形式の選択(GZIPとSnappy)

Firehoseは以下の圧縮形式をサポートしています。

・GZIP: 圧縮率が高く、Amazon AthenaがそのままS3から読み込める。S3ストレージコスト削減に有効
・Snappy: 展開が高速で、SparkやHadoopとの親和性が高い
・UNCOMPRESSED(無圧縮): デバッグ用。本番では推奨しない

S3に溜めたログをAmazon AthenaでSQL検索するユースケースなら、GZIPを選ぶのが定石です。GZIPはAthenaに組み込みサポートがあり、追加設定なしで圧縮ファイルのままクエリを実行できます。

3. KMSによる暗号化設計

Firehoseは転送データの暗号化をAWS KMSと連携して行います。AWS管理キー(aws/firehose)を使う場合はKMSのコストがかかりません。カスタマー管理キー(CMK)を使う場合はKMSのAPI呼び出しコストが発生しますが、キーポリシーで細かなアクセス制御が可能です。

ログに個人情報や機密情報が含まれる環境では、CMKを使いキーポリシーでFirehoseのIAMロールだけに復号権限を付与するのがベストプラクティスです。

LinuxサーバーからFirehoseへのデータ送信設計パターン

データをFirehoseに送る方法は主に3パターンあります。既存の監視基盤と送信量に応じて選びます。

1. CloudWatch Logsサブスクリプションフィルターパターン(推奨)

最もシンプルな構成で、CloudWatch Logsを既に使っている場合に向いています。

CloudWatch LogsのロググループにFirehoseへのサブスクリプションフィルターを設定すると、ログイベントがリアルタイムにFirehoseへ転送されます。Linuxサーバー側はCloudWatch Agentを入れるだけで、Firehoseのエンドポイントを直接意識する必要がありません。

# CloudWatch LogsからFirehoseへのサブスクリプションフィルター作成 aws logs put-subscription-filter \ --log-group-name "/var/log/nginx/access.log" \ --filter-name "to-firehose-accesslog" \ --filter-pattern "" \ --destination-arn "arn:aws:firehose:ap-northeast-1:123456789012:deliverystream/linux-accesslog-to-s3" # サブスクリプションフィルターの確認 aws logs describe-subscription-filters \ --log-group-name "/var/log/nginx/access.log"

サブスクリプションフィルターを使うにはFirehoseのIAMロールにCloudWatch LogsからのAssumeRoleを許可するトラストポリシーを設定する必要があります。logs.amazonaws.com をプリンシパルに含めてください。

2. Direct PUTパターン(Fluent Bit連携)

CloudWatchを経由せず、LinuxサーバーからFirehoseに直接データを送るパターンです。CloudWatchのログ取り込みコストを省ける反面、エージェントの設定・管理コストが上がります。

AWS公式のFluent Bitプラグイン(kinesis_firehose出力プラグイン)を使うと、設定ファイルだけでFirehoseへの直接送信を設定できます。

# /etc/fluent-bit/fluent-bit.conf の出力設定例 [OUTPUT] Name kinesis_firehose Match * region ap-northeast-1 delivery_stream linux-accesslog-to-s3 time_key timestamp time_key_format %Y-%m-%dT%H:%M:%S

3. Kinesis Data StreamsをSourceにするパターン

先にKinesis Data Streamsでログを収集し、FirehoseをData Streamsのコンシューマーとして使うパターンです。次のような場合に採用します。

・複数のコンシューマー(Firehose・Lambda・独自アプリ)が同じストリームを並列読み込みしたい場合
・書き込み側が高スループットで、FirehoseのDirect PUT上限(PutRecordBatch: 500件/500KB/秒)を超えそうな場合

ただしKinesis Data Streamsのシャードコストが追加で発生します。単純にS3へログを蓄積するだけならCloudWatch LogsサブスクリプションフィルターかDirect PUTで十分です。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Amazon LinuxとAWSを実務レベルで学べる無料マニュアルをご用意しています。AWSの設計を現場で自在に扱えるエンジニアになるために、まずは無料マニュアルをお受け取りください。

>> 無料マニュアルを受け取る

S3の保存先設計(プレフィックスのパーティション設計とLifecycleポリシー)

Firehoseの保存先S3バケットの設計は、後からAthenaでクエリするときのコストと、ログの長期保存コストに直結します。

1. 日時ベースのS3プレフィックス設計

デフォルトのプレフィックスは以下の形式です。

# デフォルトプレフィックス(FirehoseがAWS側で自動設定) s3://my-log-bucket/YYYY/MM/DD/HH/ # Athena最適化プレフィックス(Hive形式・カスタム設定) s3://my-log-bucket/logs/year=!{timestamp:yyyy}/month=!{timestamp:MM}/day=!{timestamp:dd}/

Athenaで PARTITIONED BY を使うと、クエリ対象のS3オブジェクト数を絞り込めます。Hive形式のパーティションプレフィックスを設定しておくと、「先週の特定時間帯のアクセスログだけをスキャンする」クエリでスキャン量・クエリコストが大幅に削減されます。

Firehoseのプレフィックスは !{timestamp:yyyy} のような動的変数が使えます。設定はデリバリーストリームの作成時か更新時に指定します。

# 現在のS3プレフィックス設定を確認 aws firehose describe-delivery-stream \ --delivery-stream-name linux-accesslog-to-s3 \ --query "DeliveryStreamDescription.Destinations[0].ExtendedS3DestinationDescription.Prefix" # 出力例 "logs/year=!{timestamp:yyyy}/month=!{timestamp:MM}/day=!{timestamp:dd}/"

2. Lifecycleポリシーの設計

ログデータはアクセス頻度が時間経過とともに下がります。S3のLifecycleポリシーで段階的にストレージクラスを移行すると、長期保存コストを抑えられます。

・0日目: S3 Standard(最初の30日間は高頻度アクセス想定)
・30日後: S3 Standard-IA(アクセス頻度が下がる時期)
・90日後: S3 Glacier Instant Retrieval(監査目的の長期保存)
・365日後: 削除(法令・社内ポリシーに応じて設定)

Firehoseで送り込んだデータは自動的にこのLifecycleルールの対象になるため、一度設定すれば以後は自動管理されます。

エラーハンドリングとCloudWatchモニタリングの設計

Firehoseは配信に失敗したデータを別のS3プレフィックス(エラー出力先)に書き出す機能を持っています。このエラープレフィックスを設定しておかないと、配信エラーが静かに消えてしまいます。

# エラー出力プレフィックスを確認 aws firehose describe-delivery-stream \ --delivery-stream-name linux-accesslog-to-s3 \ --query "DeliveryStreamDescription.Destinations[0].ExtendedS3DestinationDescription.ErrorOutputPrefix" # 出力例(設定済みの場合) "errors/year=!{timestamp:yyyy}/month=!{timestamp:MM}/!{firehose:error-output-type}/"

CloudWatchで監視すべき主要メトリクスは次の2つです。

・DeliveryToS3.Success: S3への配信成功数。急激な低下は障害の兆候
・DeliveryToS3.DataFreshness: データがFirehoseに届いてからS3に書き込まれるまでの時間(秒)。バッファ設計の見直し指標

IAMロールの設計も重要です。FirehoseがS3に書き込むためのIAMロールには、対象バケットへの s3:PutObject のみを付与します。s3:* のような過剰な権限を与えると、設定ミスで別バケットのデータを上書きするリスクが生じます。

# Firehose用IAMポリシーの最小権限例 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:PutObject"], "Resource": "arn:aws:s3:::my-log-bucket/*" }, { "Effect": "Allow", "Action": ["s3:GetBucketLocation", "s3:ListBucket"], "Resource": "arn:aws:s3:::my-log-bucket" } ] }

「ThrottlingException: Rate exceeded」が出た場合

Direct PUTで高スループット(1,000件/秒超)を送ると ThrottlingException が発生することがあります。

・Fluent Bitの場合: Retry_Limit を設定してリトライを有効化する
・AWSコンソールでの対処: Service Quotasから「PutRecordBatch throttled records」の上限引き上げをリクエストする

CloudWatch Logsサブスクリプションフィルターを使う構成では、AWSサービス間のスロットリングはAWSが自動でリトライするため、この問題は発生しにくいです。高スループット環境ではDirect PUTよりCloudWatch Logsサブスクリプションフィルターのほうが安定した選択肢になります。

本記事のまとめ

Amazon Data FirehoseのS3デリバリーストリーム設計のポイントをまとめます。

設計項目 推奨設定・判断基準
マルチAZ冗長性 組み込み済み。明示的な設定は不要
バッファリング間隔 遅延許容→300秒、最小化→60秒から開始して実測調整
バッファサイズ 5MB(デフォルト)から開始。スパイク環境は大きめに設定
圧縮形式 Athena連携ならGZIP、Spark/Hadoopとの連携ならSnappy
S3プレフィックス Hive形式(year=/month=/day=)でAthenaのスキャンコストを削減
データ送信パターン CloudWatch Logs既存環境→サブスクリプションフィルター、直接送信→Fluent Bit
エラー出力 ErrorOutputPrefixを必ず設定してサイレントエラーを防ぐ
IAMロール s3:PutObjectのみを対象バケットに限定する最小権限設計
Amazon Data Firehoseのマルチ AZ冗長性は設計コストゼロで得られます。実際の設計の主眼は「バッファリング設定でコストと遅延のバランスを取ること」と「S3プレフィックスをAthenaの検索効率に合わせること」の2点です。送信パターンは既存の監視基盤(CloudWatch Logsがあるかどうか)で選ぶとシンプルに決まります。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Amazon LinuxとAWSを実務レベルで学べる無料マニュアルをご用意しています。AWSの設計を現場で自在に扱えるエンジニアになるために、まずは無料マニュアルをお受け取りください。

>> 無料マニュアルを受け取る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。