Amazon MSKをCloudFormationで管理する場合、スタック更新時の制約や依存関係を把握しておくことが重要です。特にMSKリソース(`AWS::MSK::Cluster`など)は、複数のプロパティを一度に変更できない場合があります。
本書では、CloudFormationを使ったMSK運用で遭遇しやすいケースとエラーについて触れます。
前提条件
本記事で触れている内容は、以下の構成を前提としています。
-
ブローカータイプ:標準ブローカー(kafka.m5.large など)
-
クラスタタイプ:プロビジョンドクラスタ
-
メタデータ管理:Apache Zookeeper モード
あくまで参考資料となります。環境によって最適解は変わるため、必要に応じて検討してください。
CloudFormationでのリソース変更
CloudFormationは、テンプレート(コード)を更新すると、差分検出に基づいて必要なリソース更新を自動実行します。一般的なAWSリソースでは、依存関係がなければ複数フィールドをまとめて変更しても問題なく適用されます。
一方で、MSK `AWS::MSK::Cluster`では、同時に変更できないパラメータが存在します。1回のスタック更新で複数項目をまとめて書いても、MSK側で順序依存や不可一致が発生して失敗するケースがあります。
そのため、運用上は1度に全項目を更新せず、複数回に分割した変更(段階的適用)が必要となることがあります。
(補足)マネジメントコンソールでの変更
マネジメントコンソール上でももちろん変更できますが、下記のようなメニューとなります。
それぞれ構成を変更すると、MSKクラスター側に変更が完了するまで他の構成は変更できません。
それぞれ構成を変更すると、MSKクラスター側に変更が完了するまで他の構成は変更できません。
複数の設定を同時に変更する
例えば次のような変更を同時に行おうとすると、クラスター更新が失敗するケースがあります。
- `BrokerNodeGroupInfo` の `InstanceType` 変更 (ブローカーのスケールアップ)
- `NumberOfBrokerNodes` の増減 (ブローカーのスケールアウト)
- `EBSVolumeInfo` の `VolumeSize` 変更 (ストレージサイズの変更)
変更セット適用時のエラーと原因
CloudFormationの変更セット実行時に、以下のようなエラーメッセージが発生することがあります。
Error: You can’t update multiple attributes of the cluster in same request. Use a different request for each update.
このエラーは、MSKクラスターの同じリクエスト内に複数の変更を含めた場合に発生します。この場合、プロパティを分割して複数回の変更セット作成/適用する運用が必要です。
今回の例以外にもクラスタ更新が失敗するケースは多数存在します。必ず事前に検証環境で検証を実施してください。
また、複数の変更を1つずつ実施すると、想定以上の時間がかかることがあります。特にブローカー再起動が伴う場合は、ダウンタイムやパフォーマンス影響を見積もり、変更内容に応じたスケジュールを確保してください。
運用フロー例
ここまでの内容を踏まえて、変更したい内容次第ではありますが下記のような運用フローとなります。
- 変更は極力1つの要素ずつ行う
例: まず`KafkaVersion`を更新して安定確認してから、次に`NumberOfBrokerNodes`を変更する - 変更計画とスケジュールを明示する
複数回に分ける必要がある場合、各変更に必要な時間・リードタイム(検証、変更セット作成、適用、監視)を見積もる - ブローカー再起動が伴う変更は、業務影響が少ない時間帯に実施する
- 検証/テスト環境で事前に再現確認
本番環境で行う前に、同様の変更をステージング環境で実施して失敗パターンを確認 - クラスタ設定変更は段階的に公開
設定変更後は時間を置いて安定性を確認し、問題なければ次の変更を適用
まとめ
ご紹介した通り、MSKのCloudFormation運用では、複数プロパティを同時に変更するとスタック更新ができない場合があります。
分割して段階的に変更するなどを検討しつつ、ログやステータスを確認しながら進めることが推奨されます。




