Amazon MSK で構築する Apache Kafka ストリーミング基盤 - クラスタ設計と運用
Apache Kafka のマネージドクラスタを設計し、MSK Serverless との使い分けと MSK Connect によるデータ連携パターンを紹介します。
MSK の特徴と Kinesis との使い分け
MSK は Apache Kafka のマネージドサービスで、ブローカーのプロビジョニング、パッチ適用、障害復旧を AWS が管理します。Kafka のプロトコルと完全互換のため、既存の Kafka プロデューサー、コンシューマー、Kafka Streams アプリケーション、Connect コネクタをそのまま使用できます。Kinesis Data Streams との使い分けは、既存の Kafka エコシステムとの互換性が必要な場合は MSK、AWS ネイティブな統合とシンプルさを優先する場合は Kinesis を選択します。Kinesis はシャード単位の従量課金でスモールスタートに適し、MSK はブローカーインスタンスの時間課金で大規模ストリーミングのコスト効率が高くなります。
クラスタ設計と MSK Serverless
プロビジョンドクラスタではブローカーのインスタンスタイプ (kafka.m5.large など)、ブローカー数、ストレージ容量を指定します。本番環境では最低 3 ブローカー (各 AZ に 1 台) を推奨し、レプリケーションファクター 3、min.insync.replicas 2 の設定でデータの耐久性を確保します。MSK Serverless は 2022 年に GA となったモードで、クラスタのプロビジョニングが完全に不要です。トピックの作成とデータの送受信だけに集中でき、スループットはパーティション単位で自動スケールします。トラフィックパターンが予測困難な場合や、運用チームのリソースが限られる場合に最適です。ただし、Kafka の設定パラメータのカスタマイズはプロビジョンドクラスタの方が柔軟です。
MSK Connect によるデータ連携
MSK Connect は Kafka Connect のコネクタをマネージドに実行するサービスです。 S3 Sink Connector でトピックのデータを S3 に自動的に書き出し、 Redshift や Athena で分析できます。 DynamoDB Sink Connector でリアルタイムにテーブルを更新し、 Debezium Source Connector で RDS のテーブル変更をキャプチャして Kafka トピックに流すことも可能です。コネクタのスケーリングは自動または手動で設定でき、ワーカー数を増減してスループットを調整します。コネクタプラグインは S3 にアップロードした JAR ファイルから作成するため、 Confluent Hub や OSS コミュニティのコネクタを自由に利用できます。 ストリーミングの分析手法を深く理解するには、専門書籍 (Amazon)が役立ちます。
MSK の料金
プロビジョンドクラスタの料金はブローカーインスタンスの時間課金とストレージで構成されます。kafka.m5.large は 1 時間あたり約 0.21 ドル (月額約 151 ドル) で、最小 3 ブローカー構成で月額約 453 ドルです。ストレージは 1 GB あたり月額約 0.10 ドルです。MSK Serverless はクラスタ時間 (約 0.75 ドル/時) とパーティション時間で課金され、トラフィックが断続的な環境で有利です。Kinesis Data Streams (シャード時間あたり約 0.015 ドル) と比較すると、MSK は Kafka エコシステムの互換性が必要な場合に選択し、AWS ネイティブの統合を重視する場合は Kinesis を選択します。
高可用性とデータ耐久性の設計
本番の Kafka 基盤では、ブローカー障害でデータを失わない設計が不可欠です。複数のアベイラビリティゾーンにブローカーを分散配置し、各トピックのデータを複数のブローカーに複製します。書き込みを成功とみなす前に、最小限いくつのレプリカへ反映されているかを定める設定により、一部のブローカーが落ちてもデータの整合性を保てます。ゾーンをまたいで複製を配置すれば、ゾーン全体の障害にも耐えられます。複製数と書き込み確認のしきい値を適切に組み合わせることが、耐久性と可用性、性能のバランスを取る勘どころになります。
認証と暗号化のセキュリティ
MSK は複数の認証・暗号化の方式を備えています。クライアントとブローカー間の通信は TLS で暗号化し、盗聴を防ぎます。認証は、ユーザー名とパスワードによる方式のほか、AWS の IAM を使う方式を選べます。IAM 認証では、トピック単位の読み書き権限を IAM ポリシーで制御でき、AWS のロールベースの仕組みに統合できます。保存データも暗号化し、鍵を管理します。誰がどのトピックに書き込み、読み取れるかを最小権限で設計することで、ストリーミング基盤を流れるデータを安全に保てます。要件に応じて認証方式を選定します。
Tiered Storage によるコスト最適化
Kafka はデータを一定期間保持しますが、保持期間を長くするほどブローカーのストレージを圧迫し、コストが増えます。Tiered Storage を使うと、新しいデータは高速なブローカーのストレージに、古いデータは安価な階層に自動で移されます。これにより、長期間のデータ保持を低コストで実現でき、過去に遡った再処理も可能になります。ブローカーのストレージを増設し続けずに済むため、容量計画も立てやすくなります。アクセス頻度の高い直近データと、まれに参照する過去データを階層で分けることが、保持と費用の両立につながります。
監視とスケーリング
Kafka クラスタの健全性は、複数の指標で継続的に監視します。CloudWatch のメトリクスでブローカーの負荷、ディスク使用量、コンシューマーの遅延を把握し、異常を検知します。より詳細な Kafka 固有の指標が必要なら、Prometheus 互換の監視を有効にして収集します。負荷が増えてきたら、ブローカーを追加して処理能力を広げる、ストレージを拡張する、といったスケーリングを行います。ディスクの空き容量は特に重要で、枯渇するとクラスタが停止するため、しきい値を設けて自動拡張や早期のアラートで未然に防ぎます。
まとめ
MSK は Apache Kafka の運用管理を AWS に委託しつつ、Kafka エコシステムの互換性を維持するサービスです。MSK Serverless でクラスター管理を完全に不要にし、MSK Connect で Kafka Connect コネクタをマネージドに実行します。Tiered Storage でコールドデータを S3 に自動階層化し、ブローカーのストレージコストを削減します。