Kafka クォータは、マルチテナント Kafka クラスターに不可欠です。 これらは、クラスタ リソースを過剰に消費する動作の悪いアプリケーションによって Kafka クラスタのパフォーマンスが悪影響を受けるのを防ぎます。 さらに、中央のストリーミング データ プラットフォームをマルチテナント プラットフォームとして運用し、複数のビジネスラインにわたる下流および上流のアプリケーションで使用できるようにします。 Kafka は XNUMX 種類のクォータをサポートします。 ネットワーク帯域幅割り当て および リクエストレートクォータ。 ネットワーク帯域幅クォータは、クライアント アプリケーションが Kafka クラスター内の各ブローカーとの間で生成および消費できるデータ量 (XNUMX 秒あたりのバイト数で測定) などのバイトレートのしきい値を定義します。 リクエストレートクォータは、個々のブローカーがクライアントアプリケーションリクエストの処理に費やす時間の割合を制限します。 構成に応じて、Kafka クォータを特定のユーザー、特定のクライアント ID、またはその両方に設定できます。
In 第1部 この XNUMX 部構成のシリーズでは、Kafka クォータを強制する方法の概念について説明しました。 ApacheKafkaのAmazonマネージドストリーミング (Amazon MSK) クラスターの使用中 AWS IDおよびアクセス管理 (IAM) アクセス制御。
この投稿では、IAM アクセス制御を使用しながら MSK クラスターで Kafka クォータを設定し、サンプル クライアント アプリケーションでテストする手順を段階的に説明します。
ソリューションの概要
最初に紹介した次の図は、 第1部、Kafka クライアント アプリケーション (ProducerApp-1
, ConsumerApp-1
, ConsumerApp-2
) アクセス Topic-B
MSK クラスターでは、書き込みおよび読み取り IAM ロールを引き受けることによって実行されます。 各プロデューサーおよびコンシューマー クライアント アプリケーションには、生成または消費できるデータ量 (バイト/秒) を決定するクォータがあります。 の ProducerApp-1
クォータにより、ブローカーごとに最大 1024 バイト/秒を生成できます。 同様に、 ConsumerApp-1
および ConsumerApp-2
クォータにより、ブローカーごとにそれぞれ 5120 バイト/秒と 1024 バイト/秒を消費できます。 以下は、アーキテクチャ図に示されているフローの簡単な説明です。
- P1 –
ProducerApp-1
(ProducerApp-1-Role
IAM ロール)は、Topic-B-Write-Role
メッセージの送信先となる IAM ロールTopic-B
- P2 - とともに
Topic-B-Write-Role
IAM の役割が引き受けられ、ProducerApp-1
にメッセージを送信し始めるTopic-B
- C1 –
ConsumerApp-1
(ConsumerApp-1-Role
IAM ロール) とConsumerApp-2
(ConsumerApp-2-Role
IAM ロール) を想定しますTopic-B-Read-Role
メッセージを読み取る IAM ロールTopic-B
- C2 - とともに
Topic-B-Read-Role
IAM の役割が引き受けられ、ConsumerApp-1
およびConsumerApp-2
~からのメッセージの消費を開始するTopic-B
この投稿では、 AWSコマンドラインインターフェイス (AWS CLI)、 AWS CloudFormation テンプレートと、 AWSマネジメントコンソール AWS リソースのプロビジョニングと変更には、プロビジョニングされたリソースが AWS アカウントに請求されます。
大まかな手順は次のとおりです。
- IAM アクセス制御を使用して MSK クラスターをプロビジョニングし、 アマゾン エラスティック コンピューティング クラウド クライアント アプリケーション用の (Amazon EC2) インスタンス。
- 創造する
Topic-B
MSK クラスター上。 - クライアント アプリケーションがアクセスするための IAM ロールを作成する
Topic-B
. - クォータを設定せずにプロデューサー アプリケーションとコンシューマ アプリケーションを実行します。
- クライアント アプリケーションの生成クォータと消費クォータを構成します。
- クォータを設定した後、アプリケーションを再実行します。
前提条件
読むことをお勧めします 第1部 続きを読む前に、このシリーズの続きをご覧ください。 開始するには、次のものが必要です。
- この投稿ではデモ アカウントと呼ばれる AWS アカウント (そのアカウント ID は
1111 1111 1111
- デモアカウントで AWS リソースを作成、削除、変更する権限
IAM アクセス制御と EC2 インスタンスを使用して MSK クラスターをプロビジョニングする
この手順には、デモ アカウントの VPC で IAM アクセス制御を備えた MSK クラスターをプロビジョニングすることが含まれます。 さらに、2 つの ECXNUMX インスタンスを作成して、MSK クラスターとホストのプロデューサーおよびコンシューマー クライアント アプリケーションの構成を変更します。
CloudFormation スタックをデプロイする
- クローン GitHubリポジトリ CloudFormation テンプレート ファイルとサンプル クライアント アプリケーションをダウンロードするには:
- AWS CloudFormationコンソールで、 スタック ナビゲーションペインに表示されます。
- 選択する スタックを作成.
- テンプレートを準備する選択 テンプレートの準備ができました.
- テンプレートソース選択 テンプレートファイルをアップロードする.
- アップロード
cfn-msk-stack-1.yaml
からのファイルamazon-msk-kafka-quotas/cfn-templates
ディレクトリを選択し、 Next. - スタック名、 入る
MSKStack
. - パラメータをデフォルトのままにして選択します Next.
- 一番下までスクロールします スタックオプションを構成する ページを選択して選択します Next 続行します。
- 一番下までスクロールします レビュー ページでチェックボックスをオンにします CloudFormation が IAM リソースを作成する可能性があることを認めます、選択して 送信.
スタックが完了するまでに約 30 分かかります。 スタックが正常に作成されると、次のリソースが作成されます。
- XNUMX つのプライベート サブネットと XNUMX つのパブリック サブネットを持つ VPC
- IAM アクセス制御が有効になっている XNUMX つのブローカーを備えた MSK クラスター
- という EC2 インスタンス
MSKAdminInstance
MSK クラスター設定の変更および AWS リソースの作成および変更用 - EC2 インスタンス
ProducerApp-1
,ConsumerApp-1
,ConsumerApp-2
、クライアント アプリケーションごとに XNUMX つ - アーキテクチャ図に示すように、クライアント アプリケーションをホストする EC2 インスタンスごとに個別の IAM ロール
- スタックから 出力 タブで、次の点に注意してください
MSKClusterArn
の値です。
MSK クラスターでトピックを作成する
作成するには Topic-B
MSK クラスターで次の手順を実行します。
- Amazon EC2 コンソールで、実行中の EC2 インスタンスのリストに移動します。
- 現在地に最も近い
MSKAdminInstance
EC2インスタンスを選択してください お問合せ. - ソフトウェア設定ページで、下図のように セッションマネージャ タブを選択 お問合せ.
- ブラウザで開いた新しいタブで次のコマンドを実行します。
- MSK クラスター ブローカーの IAM エンドポイントを指すように環境変数を設定します。
- の値に注目してください
BOOTSTRAP_BROKERS_IAM
. - 次の Kafka CLI コマンドを実行して、
Topic-B
MSK クラスター上:
MSK クラスターは IAM アクセス制御を使用してプロビジョニングされているため、オプション --command-config
ポイント config_iam.properties
、によって作成された、IAM アクセス制御に必要なプロパティが含まれています。 MSKStack
CloudFormation スタック。
Kafka CLI コマンドを実行すると、次の警告が表示される場合がありますが、無視しても問題ありません。
- それを確認するには
Topic-B
が作成されている場合は、すべてのトピックをリストします。
クライアント アプリケーションがトピック B にアクセスするための IAM ロールを作成する
このステップでは、 Topic-B-Write-Role
および Topic-B-Read-Role
アーキテクチャ図に示すように。 Topic-B-Write-Role
での書き込み操作を有効にします Topic-B
、と仮定することができます。 ProducerApp-1
。 同様の方法で、 ConsumerApp-1
および ConsumerApp-2
想定できる Topic-B-Read-Role
読み取り操作を実行するには Topic-B
。 読み取り操作を実行するには Topic-B
, ConsumerApp-1
および ConsumerApp-2
作成中に指定されたコンシューマ グループにも属している必要があります。 MSKStack
後続のステップでスタックを更新します。
次の手順でロールを作成します。
- AWS CloudFormationコンソールで、 スタック ナビゲーションペインに表示されます。
- 選択
MSKStack
選択して アップデイト. - テンプレートを準備するをクリックし、「現在のテンプレートを置換」を選択します。
- テンプレートソース選択 テンプレートファイルをアップロードする.
- アップロード
cfn-msk-stack-2.yaml
からのファイルamazon-msk-kafka-quotas/cfn-templates
ディレクトリを選択し、 Next. - 次の追加のスタック パラメーターを指定します。
-
- トピック B ARN、 入力します
Topic-B
RNA。
- トピック B ARN、 入力します
ARN は次のようにフォーマットする必要があります。 arn:aws:kafka:region:account-id:topic/msk-cluster-name/msk-cluster-uuid/Topic-B
。 前にメモした MSK クラスター ARN のクラスター名とクラスター UUID を使用し、AWS リージョンを指定します。 詳細については、を参照してください。 Amazon MSK の IAM アクセス制御.
-
- ConsumerApp-1 コンシューマ グループ名、 入る
ConsumerApp-1
消費者グループARN。
- ConsumerApp-1 コンシューマ グループ名、 入る
次のようにフォーマットする必要があります arn:aws:kafka:region:account-id:group/msk-cluster-name/msk-cluster-uuid/consumer-group-name
-
- ConsumerApp-2 コンシューマ グループ名、 入る
ConsumerApp-2
消費者グループARN。
- ConsumerApp-2 コンシューマ グループ名、 入る
以前の ARN と同様の形式を使用します。
- 選択する Next 続行します。
- 一番下までスクロールします スタックの構成 オプションページを選択してください Next 続行します。
- 一番下までスクロールします レビュー ページでチェックボックスをオンにします CloudFormation が IAM リソースを作成する可能性があることを認めます、選択して スタックを更新する.
スタックが更新されるまでに約 3 分かかります。 スタックが正常に更新されると、次のリソースが作成されます。
- トピック-B-書き込み-ロール – 書き込み操作を実行する権限を持つ IAM ロール
Topic-B
。 その信頼ポリシーにより、ProducerApp-1-Role
それを引き受ける IAM ロール。 - トピック B 読み取りロール – 読み取り操作を実行する権限を持つ IAM ロール
Topic-B
。 その信頼ポリシーにより、ConsumerApp-1-Role
およびConsumerApp-2-Role
それを引き受ける IAM ロール。 さらに、ConsumerApp-1
およびConsumerApp-2
スタックを更新して読み取り操作を実行するときに指定したコンシューマ グループにも属している必要があります。Topic-B
.
- スタックから 出力 タブで、次の点に注意してください
TopicBReadRoleARN
およびTopicBWriteRoleARN
値。
クォータを設定せずにプロデューサー アプリケーションとコンシューマ アプリケーションを実行する
ここで、私たちは走ります ProducerApp-1
, ConsumerApp-1
, ConsumerApp-2
ノルマを設定せずに。 前の手順で必要となるのは、 BOOTSTRAP_BROKERS_IAM
値、 Topic-B-Write-Role
ARN、および Topic-B-Read-Role
アーン。 クライアント アプリケーションのソース コードとそのパッケージ バージョンは、次の場所にあります。 GitHubリポジトリ.
ConsumerApp-1 アプリケーションを実行する
実行するには ConsumerApp-1
アプリケーションを作成するには、次の手順を実行します。
- Amazon EC2 コンソールで、
ConsumerApp-1
EC2インスタンスを選択してください お問合せ. - ソフトウェア設定ページで、下図のように セッションマネージャ タブを選択 お問合せ.
- ブラウザで開いた新しいタブで次のコマンドを実行します。
- 実行する
ConsumerApp-1
メッセージの消費を開始するアプリケーションTopic-B
:
見つけることができます ソースコード 参考までに GitHub にあります。 コマンドラインパラメータの詳細は次のとおりです。
- –ブートストラップサーバー – MSK クラスター ブートストラップ ブローカー IAM エンドポイント。
- –assume-role-arn –
Topic-B-Read-Role
IAM ロール ARN。 この役割を引き受けると、ConsumerApp-1
トピックからのメッセージを読み取ります。 - -地域 – 使用している地域。
- –トピック名 – 出典元のトピック名
ConsumerApp-1
メッセージを読み上げます。 デフォルトはTopic-B
. - –消費者グループ – の消費者グループ名
ConsumerApp-1
、スタックの更新中に指定されたとおりです。 - –ロールセッション名 –
ConsumerApp-1
を前提としていますTopic-B-Read-Role
AWSセキュリティトークンサービス (AWS STS) SDK。ConsumerApp-1
を呼び出すときに、このロール セッション名が使用されます。assumeRole
機能。 - -クライアントID – のクライアント ID
ConsumerApp-1
. - –print-consumer-quota-metrics – クライアントメトリクスを端末に出力するかどうかを示すフラグ
ConsumerApp-1
. - –cw ディメンション名 – アマゾンクラウドウォッチ クライアント調整メトリクスを公開するために使用されるディメンション名
ConsumerApp-1
. - –cw ディメンション値 – クライアントスロットリングメトリクスを公開するために使用される CloudWatch ディメンション値
ConsumerApp-1
. - –cw-名前空間 – 名前空間
ConsumerApp-1
スロットルを監視するために CloudWatch メトリクスを公開します。
- 残りのパラメータに問題がない場合は、次のコマンドを使用して変更します。
--assume-role-arn
および--region
あなたの環境に従って:
fetch-throttle-time-avg
および fetch-throttle-time-max
クライアント メトリックには 0.0 が表示され、スロットリングが発生していないことを示します。 ConsumerApp-1
。 消費クォータを設定していないことに注意してください。 ConsumerApp-1
まだ。 しばらく実行させてください。
ConsumerApp-2 アプリケーションを実行する
実行するには ConsumerApp-2
アプリケーションを作成するには、次の手順を実行します。
- Amazon EC2 コンソールで、
ConsumerApp-2
EC2インスタンスを選択してください お問合せ. - ソフトウェア設定ページで、下図のように セッションマネージャ タブを選択 お問合せ.
- ブラウザで開いた新しいタブで次のコマンドを実行します。
- 実行する
ConsumerApp-2
メッセージの消費を開始するアプリケーションTopic-B
:
このコードには、次のようなコマンド ライン パラメーターの詳細が含まれています。 ConsumerApp-1
前述したとおりですが、次の点を除きます。
- –消費者グループ – の消費者グループ名
ConsumerApp-2
、スタックの更新中に指定されたとおりです。 - –ロールセッション名 –
ConsumerApp-2
を前提としていますTopic-B-Read-Role
AWS STS SDK を使用します。ConsumerApp-2
を呼び出すときに、このロール セッション名が使用されます。assumeRole
機能。 - -クライアントID – のクライアント ID
ConsumerApp-2
.
- 残りのパラメータに問題がない場合は、次のコマンドを使用して変更します。
--assume-role-arn
および--region
あなたの環境に従って:
fetch-throttle-time-avg
および fetch-throttle-time-max
クライアント メトリックには 0.0 が表示され、スロットリングが発生していないことを示します。 ConsumerApp-2
。 消費クォータを設定していないことに注意してください。 ConsumerApp-2
まだ。 しばらく実行させてください。
ProducerApp-1 アプリケーションを実行する
実行するには ProducerApp-1
アプリケーションを作成するには、次の手順を実行します。
- Amazon EC2 コンソールで、
ProducerApp-1
EC2インスタンスを選択してください お問合せ. - ソフトウェア設定ページで、下図のように セッションマネージャ タブを選択 お問合せ.
- ブラウザで開いた新しいタブで次のコマンドを実行します。
- 実行する
ProducerApp-1
メッセージの送信を開始するアプリケーションTopic-B
:
見つけることができます ソースコード 参考までに GitHub にあります。 コマンドラインパラメータの詳細は次のとおりです。
- –ブートストラップサーバー – MSK クラスター ブートストラップ ブローカー IAM エンドポイント。
- –assume-role-arn –
Topic-B-Write-Role
IAM ロール ARN。 この役割を引き受けると、ProducerApp-1
トピックにメッセージを書き込みます。 - –トピック名 –
ProducerApp-1
はこのトピックにメッセージを送信します。 デフォルトはTopic-B
. - -地域 – 使用している AWS リージョン。
- –メッセージ数 – メッセージの数
ProducerApp-1
アプリケーションはトピックに送信します。 - –ロールセッション名 –
ProducerApp-1
を前提としていますTopic-B-Write-Role
AWS STS SDK を使用します。ProducerApp-1
を呼び出すときに、このロール セッション名が使用されます。assumeRole
機能。 - -クライアントID – のクライアント ID
ProducerApp-1
. - –プロデューサータイプ –
ProducerApp-1
どちらでも実行できます 同期して or 非同期的に。 オプションは sync or 非同期. - –print-production-quota-metrics – クライアントメトリクスを端末に出力するかどうかを示すフラグ プロデューサーアプリ-1.
- –cw ディメンション名 – クライアントスロットリングメトリクスを公開するために使用される CloudWatch ディメンション名 プロデューサーアプリ-1.
- –cw ディメンション値 – クライアントスロットリングメトリクスを公開するために使用される CloudWatch ディメンション値 プロデューサーアプリ-1.
- –cw-名前空間 – 名前空間 プロデューサーアプリ-1 スロットルを監視するために CloudWatch メトリクスを公開します。
- 残りのパラメータに問題がない場合は、次のコマンドを使用して変更します。
--assume-role-arn
および--region
あなたの環境に従って。 同期 Kafka プロデューサーを実行するには、次のオプションを使用します。--producer-type sync
:
または、 --producer-type async
非同期プロデューサーを実行します。 詳細については、を参照してください。 非同期送信.
produce-throttle-time-avg
および produce-throttle-time-max
クライアント メトリックには 0.0 が表示され、スロットリングが発生していないことを示します。 ProducerApp-1
。 農産物の割り当てを設定していないことに注意してください。 ProducerApp-1
まだ。 それを確認します ConsumerApp-1
および ConsumerApp-2
メッセージを消費し、それらが調整されていないことに気付くことができます。 を押して、コンシューマおよびプロデューサーのクライアント アプリケーションを停止します。 Ctrlキー+ C それぞれのブラウザタブで。
クライアント アプリケーションの生産および消費クォータを設定する
クォータなしでプロデューサー アプリケーションとコンシューマ アプリケーションを実行したので、クォータを設定して再実行します。
Video Cloud Studioで セッションマネージャー の端末 MSKAdminInstance
前述のように EC2 インスタンスを作成し、次のコマンドを実行して MSK クラスター内のブローカーの XNUMX つのデフォルト構成を見つけます。 MSK クラスターは、デフォルトの Kafka クォータ構成でプロビジョニングされます。
次のスクリーンショットは、 Broker-1
のデフォルト値 quota.consumer.default
および quota.producer.default
.
ProducerApp-1 クォータ構成
このセクションのすべてのコマンドのプレースホルダーを、アカウントに対応する値に置き換えます。
前に説明したアーキテクチャ図に従って、 ProducerApp-1
クォータを 1024 バイト/秒に生成します。 のために <ProducerApp-1 Client Id>
および <ProducerApp-1 Role Session>
、実行中に使用したのと同じ値を使用していることを確認してください。 ProducerApp-1
以前 (producerapp-1-client-id
および producerapp-1-role-session
、 それぞれ):
その ProducerApp-1
次のコマンドを使用してクォータを作成します。
削除できます ProducerApp-1
次のコマンドを使用してクォータを生成しますが、 コマンドを実行しないでください 次にクォータをテストするので。
ConsumerApp-1 クォータ構成
このセクションのすべてのコマンドのプレースホルダーを、アカウントに対応する値に置き換えます。
5120 バイト/秒の消費クォータを設定しましょう。 ConsumerApp-1
。 のために <ConsumerApp-1 Client Id>
および <ConsumerApp-1 Role Session>
、実行中に使用したのと同じ値を使用していることを確認してください。 ConsumerApp-1
以前 (consumerapp-1-client-id
および consumerapp-1-role-session
、 それぞれ):
kafka-configs.sh --bootstrap-server $BOOTSTRAP_BROKERS_IAM --command-config config_iam.properties --alter --add-config 'consumer_byte_rate=5120' --entity-type clients --entity-name <ConsumerApp-1 Client Id> --entity-type users --entity-name arn:aws:sts::<AWS Account Id>:assumed-role/MSKStack-TopicBReadRole-xxxxxxxxxxx/<ConsumerApp-1 Role Session>
その ConsumerApp-1
次のコマンドを使用してクォータを消費します。
削除できます ConsumerApp-1
次のコマンドを使用してクォータを消費しますが、 コマンドを実行しないでください 次にクォータをテストするので。
ConsumerApp-2 クォータ構成
このセクションのすべてのコマンドのプレースホルダーを、アカウントに対応する値に置き換えます。
1024 バイト/秒の消費クォータを設定しましょう。 ConsumerApp-2
。 のために <ConsumerApp-2 Client Id>
および <ConsumerApp-2 Role Session>
、実行中に使用したのと同じ値を使用していることを確認してください。 ConsumerApp-2
以前 (consumerapp-2-client-id
および consumerapp-2-role-session
、 それぞれ):
その ConsumerApp-2
次のコマンドを使用してクォータを消費します。
屈折計と同様に、この類の検証は官能評価と並行して行うべきです。一般的に、抽出が進むにつれて高温になる抽出方法は、抽出が成功する確率が低い傾向にあります。
ConsumerApp-1
を削除できます。 ConsumerApp-2
と同じコマンドを使用してクォータを消費します ConsumerApp-2
クライアントとユーザーの詳細。
クォータを設定した後、プロデューサー アプリケーションとコンシューマー アプリケーションを再実行します。
アプリケーションを再実行して、クォータの効果を確認してみましょう。
再実行ProducerApp-1
再実行 ProducerApp-1
in シンクロナス 前に使用したのと同じコマンドを使用してモードに切り替えます。 次のスクリーンショットは、次の場合を示しています。 ProducerApp-1
いずれかのブローカーでノルマに達すると、 produce-throttle-time-avg
および produce-throttle-time-max client
メトリック値は 0.0 を超えます。 0.0 を超える値は、 ProducerApp-1
スロットルされています。 許可する ProducerApp-1
数秒間実行してから、次のコマンドを使用して停止します。 Ctrlキー+ C.
再実行して、生産クォータの効果をテストすることもできます。 ProducerApp-1
再び 非同期 モード(--producer-type async
)。 同期実行と同様に、次のスクリーンショットは、 ProducerApp-1
いずれかのブローカーでノルマに達すると、 produce-throttle-time-avg
および produce-throttle-time-max
クライアント メトリック値は 0.0 を超えます。 0.0 を超える値は、 ProducerApp-1
スロットルされています。 非同期を許可する ProducerApp-1
しばらく走ること。
最終的には TimeoutException
知らせる org.apache.kafka.common.errors.TimeoutException: Expiring xxxxx record(s) for Topic-B-2:xxxxxxx ms has passed since batch creation
使用する場合 非同期 プロデューサがクォータのためにブローカーが受け入れることができる速度を超える速度でメッセージを送信すると、メッセージは最初にクライアント アプリケーションのメモリのキューに入れられます。 メッセージの送信速度がメッセージの受信速度を超え続けると、クライアントは最終的にバッファ領域を使い果たし、次のメッセージが発生します。 Producer.send()
ブロックされる電話。 Producer.send()
最終的には投げます TimeoutException
タイムアウト遅延がブローカーがプロデューサー アプリケーションに追いつくのに十分でない場合。 停止 ProducerApp-1
使用して、 Ctrlキー+ C.
ConsumerApp-1 を再実行します
再実行 ConsumerApp-1
前に使用したのと同じコマンドを使用します。 次のスクリーンショットは、次の場合を示しています。 ConsumerApp-1
割り当てに達すると、 fetch-throttle-time-avg
および fetch-throttle-time-max client
メトリック値は 0.0 を超えます。 0.0 を超える値は、 ConsumerApp-1
スロットルされています。
次を許可します。 ConsumerApp-1
数秒間実行してから、次のコマンドを使用して停止します。 Ctrlキー+ C.
ConsumerApp-2 を再実行します
再実行 ConsumerApp-2
前に使用したのと同じコマンドを使用します。 同様に、 ConsumerApp-2
割り当てに達すると、 fetch-throttle-time-avg
および fetch-throttle-time-max client
メトリクス値が上になります 0.0。 上記の値 0.0 を示す ConsumerApp-2
スロットルされています。 許可する ConsumerApp-2
数秒間実行してから、 を押して停止します。 Ctrlキー+ C.
Amazon CloudWatch のクライアント クォータ メトリクス
In 第1部では、クライアント メトリックは、Kafka クラスターに接続するクライアントによって公開されるメトリックであると説明しました。 CloudWatch でクライアントのメトリクスを調べてみましょう。
- CloudWatch コンソールで、 すべての指標.
- カスタム名前空間、クライアント アプリケーションの実行時に指定した名前空間を選択します。
- ディメンション名を選択し、
produce-throttle-time-max
,produce-throttle-time-avg
,fetch-throttle-time-max
,fetch-throttle-time-avg metrics
すべてのアプリケーションに。
これらのメトリクスは、次のスロットル動作を示します。 ProducerApp-1
, ConsumerApp-1
, ConsumerApp-2
アプリケーションは前のセクションのクォータ構成でテストされました。 次のスクリーンショットは、 ProducerApp-1
, ConsumerApp-1
, ConsumerApp-2
ネットワーク帯域幅の割り当てに基づきます。 ProducerApp-1
, ConsumerApp-1
, ConsumerApp-2
アプリケーションは、それぞれのクライアントメトリクスを CloudWatch にフィードします。 見つけることができます ソースコード 参考までに GitHub にあります。
セキュアクライアント ID とロールセッション名
アプリケーションのを使用して Kafka クォータを構成する方法について説明しました。 クライアントID と認証 user 主要。 IAM 認証が有効になっている MSK クラスター上の Kafka トピックにアクセスするための IAM ロールをクライアント アプリケーションが引き受ける場合、その認証は user プリンシパルは次の形式で表されます (詳細については、「 IAM識別子):
arn:aws:sts::111111111111:assumed-role/Topic-B-Write-Role/producerapp-1-role-session
含まれています ロールセッション名 (この場合、 producerapp-1-role-session
) AWS STS SDK を通じて IAM ロールを引き受ける際にクライアント アプリケーションで使用されます。 クライアントアプリケーション ソースコード ご参照ください。 の クライアントID 論理名の文字列です (たとえば、 producerapp-1-client-id
) は、アプリケーション チームによってアプリケーション コード内で構成されます。 したがって、アプリケーションは、 クライアントID および ロールセッション名 他のアプリケーションの、同じ IAM ロールを引き受ける権限があるかどうか。
アーキテクチャ図に示すように、 ConsumerApp-1
および ConsumerApp-2
は、それぞれクォータが割り当てられた XNUMX つの別個のクライアント アプリケーションです。 どちらも同じ IAM ロールを引き受ける権限を持っているため (Topic-B-Read-Role
)デモアカウントでは、からのメッセージを消費することができます。 Topic-B
。 したがって、MSK クラスター ブローカーはそれらを次の基準に基づいて区別します。 クライアントID および users (それぞれの ロールセッション名 値)。 もし ConsumerApp-2
どういうわけか入手します ConsumerApp-1
ロールセッション名 および クライアントID、なりすますことができます ConsumerApp-1
指定することにより ConsumerApp-1
ロールセッション名 および クライアントID アプリケーションコード内で。
仮定しましょう ConsumerApp-1
使用されます consumerapp-1-client-id
および consumerapp-1-role-session
そのよう クライアントID および ロールセッション名、それぞれ。 したがって、 ConsumerApp-1's
認証された user プリンシパルは次のようになります。 Topic-B-Read-Role
IAM の役割:
arn:aws:sts::<AWS Account Id>:assumed-role/Topic-B-Read-Role/consumerapp-1-role-session
同様に、 ConsumerApp-2
使用されます consumerapp-2-client-id
および consumerapp-2-role-session
そのよう クライアントID および ロールセッション名、それぞれ。 したがって、 ConsumerApp-2's
認証された user プリンシパルは次のようになります。 Topic-B-Read-Role
IAM の役割:
arn:aws:sts::<AWS Account Id>:assumed-role/Topic-B-Read-Role/consumerapp-2-role-session
If ConsumerApp-2
取得する ConsumerApp-1's
クライアントID および ロールセッション名 アプリケーション コードでそれらを指定すると、MSK クラスター ブローカーはそれを次のように扱います。 ConsumerApp-1
そしてそれを見てください クライアントID as consumerapp-1-client-id
、そして認証された user プリンシパルは次のとおりです。
arn:aws:sts::<AWS Account Id>:assumed-role/Topic-B-Read-Role/consumerapp-1-role-session
これにより、 ConsumerApp-2
元のクォータ割り当てに従って 5120 秒あたり 1024 バイトではなく、XNUMX 秒あたり XNUMX バイトの最大速度で MSK クラスターからのデータを消費します。 その結果、 ConsumerApp-1's
次の場合、スループットに悪影響が生じます。 ConsumerApp-2
同時に実行されます。
強化されたアーキテクチャ
紹介してもらえます AWSシークレットマネージャー および AWSキー管理サービス (AWS KMS) アプリケーションを保護するためのアーキテクチャ クライアントID および ロールセッション名。 より強力なガバナンスを提供するには、アプリケーションのクライアント ID とロール セッション名を暗号化されたシークレットとして Secrets Manager に保存する必要があります。 暗号化されたシークレットと KMS カスタマー管理キー (CMK) に関連付けられた IAM リソース ポリシーにより、アプリケーションはそれぞれのクライアント ID とロール セッション名のみにアクセスして復号化できます。 このようにして、アプリケーションは相互にクライアント ID およびロール セッション名にアクセスしたり、相互に偽装したりすることができなくなります。 次の図は、強化されたアーキテクチャを示しています。
更新されたフローには次の段階があります。
- P1 –
ProducerApp-1
それを取得しますclient-id
およびrole-session-name
Secrets Manager からのシークレット - P2 –
ProducerApp-1
シークレットを構成しますclient-id
asCLIENT_ID_CONFIG
アプリケーションコード内で次のように仮定しますTopic-B-Write-Role
(ProducerApp-1-Role
IAM ロール) シークレットを渡すことによってrole-session-name
AWS STS SDK へassumeRole
関数呼び出し - P3 - とともに
Topic-B-Write-Role
IAM の役割が引き受けられ、ProducerApp-1
にメッセージを送信し始めるTopic-B
- C1 –
ConsumerApp-1
およびConsumerApp-2
それぞれを取得しますclient-id
およびrole-session-name
Secrets Manager からのシークレット - C2 –
ConsumerApp-1
およびConsumerApp-2
それぞれのシークレットを設定するclient-id
asCLIENT_ID_CONFIG
アプリケーションコード内で次のように仮定しますTopic-B-Write-Role
(ビアConsumerApp-1-Role
およびConsumerApp-2-Role
それぞれ IAM ロール) シークレットを渡すことによってrole-session-name
AWS STS SDK 内assumeRole
関数呼び出し - C3 - とともに
Topic-B-Read-Role
IAM の役割が引き受けられ、ConsumerApp-1
およびConsumerApp-2
~からのメッセージの消費を開始するTopic-B
のドキュメントを参照してください。 AWSシークレットマネージャー および AWS KMS アーキテクチャにどのように適合するかをより深く理解するために。
リソースをクリーンアップする
CloudFormation コンソールに移動し、 MSKStack
スタック。 この投稿中に作成されたすべてのリソースは削除されます。
まとめ
この投稿では、Amazon MSK クォータを構成する詳細な手順について説明し、サンプル クライアント アプリケーションを通じてその効果を実証しました。 さらに、クライアント メトリックを使用してクライアント アプリケーションが調整されているかどうかを判断する方法についても説明しました。 また、プレーンテキストのクライアント ID とロール セッション名に関する潜在的な問題も強調しました。 ゼロトラストアーキテクチャを確保するために、改訂されたアーキテクチャ図に従って、Secrets Manager と AWS KMS を使用して Amazon MSK で Kafka クォータを実装することをお勧めします。
改訂されたアーキテクチャを含め、この投稿に関するフィードバックや質問がありましたら、喜んでお知らせいたします。 この投稿を楽しんで読んでいただければ幸いです。
著者について
ヴィカス・バジャイ アマゾン ウェブ サービスの金融サービスのソリューション アーキテクトのシニア マネージャーです。 金融サービスとデジタル ネイティブ ビジネスでの XNUMX 年以上の経験を活かし、製品設計、テクノロジー ロードマップ、アプリケーション アーキテクチャについて顧客にアドバイスを行っています。
- SEO を活用したコンテンツと PR 配信。 今日増幅されます。
- EVMファイナンス。 分散型金融のための統一インターフェイス。 こちらからアクセスしてください。
- クォンタムメディアグループ。 IR/PR増幅。 こちらからアクセスしてください。
- プラトアイストリーム。 Web3 データ インテリジェンス。 知識増幅。 こちらからアクセスしてください。
- 情報源: https://aws.amazon.com/blogs/big-data/multi-tenancy-apache-kafka-clusters-in-amazon-msk-with-iam-access-control-and-kafka-quotas-part-2/
- :持っている
- :は
- :not
- :どこ
- $UP
- 1
- 10
- 11
- 30
- 7
- 70
- 8
- 9
- a
- できる
- 私たちについて
- 上記の.
- 同意
- 受諾
- アクセス
- 認める
- 越えて
- 加えます
- 添加
- NEW
- さらに
- 後
- 再び
- すべて
- 配分
- 割り当て
- 許す
- ことができます
- また
- Amazon
- Amazon EC2
- Amazon Webサービス
- an
- および
- 別の
- どれか
- アパッチ
- アパッチカフカ
- 現れる
- 申し込み
- 約
- 建築
- です
- AS
- 関連する
- 想定される
- At
- 認証された
- 認証
- 利用できます
- AWS
- AWS CloudFormation
- 帯域幅
- ベース
- BE
- なぜなら
- き
- さ
- より良いです
- ブロックされた
- ブートストラップ
- 両言語で
- ボトム
- ボックス
- ブローカー
- ブローカー
- ブラウザ
- バッファ
- ビジネス
- ビジネス
- 焙煎が極度に未発達や過発達のコーヒーにて、クロロゲン酸の味わいへの影響は強くなり、金属を思わせる味わいと乾いたマウスフィールを感じさせます。
- by
- コール
- 呼ばれます
- 呼び出し
- 缶
- 場合
- CAT
- レスリング
- 原因
- CD
- 中央の
- 変化する
- 変更
- チェック
- 選択する
- class
- クライアント
- クライアント
- クラスタ
- コード
- コマンドと
- コンプリート
- 計算
- コンセプト
- 設定された
- 接続する
- その結果
- 領事
- 消費する
- consumer
- 含まれています
- 続ける
- 続ける
- 連続
- コントロール
- カバー
- 作ります
- 作成した
- 作成
- 電流プローブ
- 顧客
- Customers
- データ
- 数十年
- 解読する
- デフォルト
- 遅らせる
- デモ
- 実証
- によっては
- 説明する
- 記載された
- 設計
- 詳細な
- 細部
- 決定する
- 決定する
- 次元
- 議論する
- ディスプレイ
- 見分けます
- ドキュメント
- ダウンロード
- 原因
- 間に
- 各
- 前
- echo
- 効果
- どちら
- enable
- 使用可能
- 可能
- では使用できません
- エンドポイント
- 強制します
- 強化された
- 確保
- 入力します
- 環境
- エラー
- エーテル(ETH)
- 最終的に
- 調べる
- 例
- 超えます
- 除く
- 体験
- 説明
- 説明
- export
- 露出した
- フィードバック
- 少数の
- フィギュア
- File
- ファイナンシャル
- 金融業務
- もう完成させ、ワークスペースに掲示しましたか?
- 名
- フィット
- フロー
- フォロー中
- 次
- 形式でアーカイブしたプロジェクトを保存します.
- 4
- から
- function
- さらに
- 取得する
- Gitの
- GitHubの
- ガバナンス
- 大きい
- グループ
- グループの
- ハッピー
- 持ってる
- he
- 聞く
- ハイレベル
- 強調表示された
- 希望
- host
- ホスト
- 認定条件
- How To
- HTML
- HTTP
- HTTPS
- IAM
- ID
- アイデンティティ
- イド
- if
- 説明する
- 画像
- 影響を受けた
- 実装
- 実装
- in
- 含めて
- 示す
- を示し
- 示します
- 個人
- 情報
- インテグラル
- に
- 紹介する
- 導入
- ISN
- 問題
- IT
- ITS
- Java
- JPG
- カフカ
- キー
- 既知の
- LIMIT
- LINE
- ライン
- リスト
- 論理的な
- make
- マネージド
- 管理
- マネージャー
- 五月..
- 測定された
- メモリ
- メッセージ
- メトリック
- 分
- モード
- 修正する
- モニター
- 他には?
- MS
- ずっと
- の試合に
- しなければなりません
- 名
- 名
- ナビゲート
- ナビゲーション
- 必要
- マイナスに
- ネットワーク
- 新作
- 次の
- いいえ
- 注意
- 知らせ..
- 数
- 取得する
- 発生する
- of
- on
- ONE
- の
- 開きます
- 運営
- 業務執行統括
- オプション
- オプション
- or
- 注文
- オリジナル
- その他
- でる
- が
- パッケージ化された
- ページ
- ペイン
- パラメーター
- パラメータ
- 部
- 渡された
- 通過
- path
- 割合
- 実行する
- パフォーマンス
- 許可
- 平文
- プラットフォーム
- プラトン
- プラトンデータインテリジェンス
- プラトデータ
- ポイント
- ポイント
- ポリシー
- 方針
- ポスト
- 潜在的な
- を押す
- 防ぐ
- 前
- 前に
- 校長
- プライベート
- 処理
- 作り出す
- プロデューサー
- プロダクト
- 製品設計
- プロパティ
- 提供します
- 提供
- 公共
- パブリッシュ
- 質問
- レート
- むしろ
- 達します
- 読む
- リーディング
- 推奨する
- 推奨される
- 言及
- 地域
- 覚えています
- 削除します
- replace
- 倉庫
- で表さ
- 要求
- リクエスト
- の提出が必要です
- リソースを追加する。
- リソース
- それらの
- それぞれ
- REST
- ロードマップ
- 職種
- 役割
- ラン
- ランニング
- s
- 同じ
- 満足
- に満足
- スクリーンショット
- SDDK
- 二番
- 秒
- 秘密
- セクション
- 安全に
- セキュリティ
- セキュリティトークン
- 送信
- 送信
- シニア
- 別
- シリーズ
- サービス
- セッション
- セッションに
- 設定
- 設定
- すべき
- 示す
- 作品
- 同様の
- 同様に
- から
- ソリューション
- ソース
- ソースコード
- スペース
- 特定の
- 指定の
- スタック
- ステージ
- start
- 開始
- 手順
- ステップ
- Force Stop
- 保存され
- ストリーミング
- 文字列
- 強い
- サブネット
- それに続きます
- 首尾よく
- そのような
- 十分な
- 供給
- サポート
- 取る
- チーム
- テクノロジー
- template
- テンプレート
- ターミナル
- test
- テスト
- テスト
- より
- それ
- ソース
- アプリ環境に合わせて
- それら
- その後
- したがって、
- 彼ら
- この
- 三
- 介して
- スループット
- 時間
- 〜へ
- トークン
- トピック
- トピック
- 治療する
- 信頼
- 2
- type
- 理解する
- アップデイト
- 更新しました
- 更新
- つかいます
- 中古
- ユーザー
- users
- 使用されます
- 値
- 価値観
- 確認する
- 、
- 詳しく見る
- ました
- 仕方..
- we
- ウェブ
- Webサービス
- WELL
- いつ
- かどうか
- which
- while
- 意志
- 無し
- ワーキング
- 書きます
- まだ
- 貴社
- あなたの
- ゼファーネット