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サブスクリプションフィルターとの組み合わせが最もシンプルな構成
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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"
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}/
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}/"
・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のみを対象バケットに限定する最小権限設計 |
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Amazon LinuxとAWSを実務レベルで学べる無料マニュアルをご用意しています。AWSの設計を現場で自在に扱えるエンジニアになるために、まずは無料マニュアルをお受け取りください。
>> 無料マニュアルを受け取る3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:Amazon RDS Proxyでデータベース接続を設計する方法|Lambda・ECSとRDSの接続数問題を解消するマルチAZ構成パターン
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます