レート制限でインスタンスの安定性を改善する

When automated integrations or scripts send requests to Crowd in huge bursts, it can affect Crowd’s stability, leading to drops in performance or even downtime. With rate limiting, you can control how many external REST API requests automations and users can make and how often they can make them, making sure that your Crowd Data Center instance remains stable.

レート制限の仕組み

Here’s some details about how rate limiting works in Crowd.

リクエストの制限...

Rate limiting targets only external REST API requests, which means that requests made within Crowd aren’t limited in any way. When users move around the Crowd, configuring applications and directories, managing users, groups or memberships, and completing other actions, they won’t be affected by rate limiting, as we’re seeing this as a regular user experience that shouldn’t be limited.

次の例で詳しく説明します。

  1. When a user edits an application in Crowd, a number of requests are sent in the background — these requests ask Crowd for application configuration details, such as type, directories and groups assigned, administrators etc. Since this traffic is internal to Crowd, it won’t be limited.

  2. When the same user opens up the terminal on their laptop and sends a request (like the one below) to get the contents of a space, it will be rate limited because it’s made outside of Crowd.

curl -u user:password https://localhost:8095/rest/appmanagement/1/application/APP_ID
弊社で採用したレート制限技術について...

Out of the many available techniques for enforcing rate limits, we’ve chosen to use token bucket

トークン バケットを使用すると、リクエストに交換できるトークンの残数がユーザーに提示されます。仕組みの要約は次のとおりです。

  • ユーザーにはトークンが提供されます。これはリクエストに交換されます。1 つのトークンは 1 件のリクエストに相当します。

  • ユーザーは一定のタイミングで新しいトークンを取得するため、常に新しいリクエストを作成できます。これが、そのユーザーの許容要求数であり、10 個/1 分のように設定されます。

    • 定数レートまたは間隔は、時間間隔 (秒単位) を許容要求数で割ったものです。

  • トークンは、個人用のバケットが満杯になるまで追加されます。これが、そのユーザーの最大要求数であり、トークンの使用を自分の頻度に合わせて調整できます。たとえば、通常のレートで指定された、10 件/1 分ではなく、20 件/2 分とすることができます。

  • ユーザーが、自身が保有しているトークン数を超えるリクエストを送信しようとした場合、バケットからトークンを取得できたリクエストのみが成功します。残りのリクエストには 429 エラーのメッセージ (too many requests) が返されます。ユーザーは新しいトークンの取得後にこれらのリクエストを再試行できます。

Integration with other Atlassian products...

Crowd tastes best when used with our other products like Jira, Confluence, Bitbucket, or Bamboo. Technically, products like these are external to Crowd, so they should be limited. In this case, however, we’re treating them as belonging to the same user experience and don’t want to enforce any limits for requests coming from or to these products.

現在の状況は次のとおりです。

  • Server / Data Center: Not limited in any way.

  • Cloud: There’s a known issue that applies rate limits to requests coming from/to cloud products. We’re working hard to disable rate limits for cloud products and should make that happen soon. For now, you can use a workaround. For more info, see Removing rate limits for Atlassian cloud products.

Atlassian Marketplace のアプリ...

The general assumption is that Marketplace apps are installed on a Crowd instance, make internal requests from within Crowd, and shouldn’t be limited. But, as always, it depends on how an app works.

  • Internal: If an app in fact works internally, enhancing the user experience, it won’t be limited. An example of such app would be a special banner that’s displayed on top of Crowd UI. Let’s say this banner checks data about users and their memberships and visualize digested statistics. Traffic like that would be internal, not limited.

  • External: Apps whose requests are external to Crowd are limited. Let’s say we have an app that displays a wallboard on TV. It asks Crowd for details about applications, directories, groups, etc. and then reshuffles and displays them in its own way as the earlier mentioned wallboard. An app like that sends external requests and behaves just like a user sending requests over a terminal.

アプリによって異なりますが、ほとんどのものが制限対象外であると想定しています。

How rate limiting works in a cluster...

レート制限は Data Center で利用可能なため、ノードのクラスタがロード バランサの背後にある可能性が高くなります。各ユーザーには、各ノードに個別の制限があります (レート制限はクラスタではなくノードごとに適用されます)。

つまり、1 つのノードで許可されたリクエスト数を使用してレート制限されている場合、別のノードで新しいセッションを開始すると、論理的にはもう一度リクエストを送信できます。ユーザーがノードを切り替えることはできませんが、これが発生する可能性があることを念頭に置いてください。

Whatever limit you’ve chosen (e.g. 100 requests every 1 hour), the same limit will apply to each node, you don’t have to set it separately. This means that each user’s ability to send requests will still be limited, and Crowd will remain stable regardless of which node their requests are routed to.

管理者による制限の選択基準について

適切な制限の設定は多くの要因に依存するため、単純な回答を提供することはできません。ここではいくつかの提案をご案内させていただきます。

適切な制限を見つける

最初に、インスタンスが受信するトラフィックのサイズを理解します。アクセス ログを解析し、1 日に最大数の REST リクエストを作成したユーザーを見つけます。UI トラフィックはレート制限されないため、この数字はレート制限として必要な値よりも大きくなります。次に、これを基本値とし、以下の質問に基づいてさらに変更します。

  1. ユーザーの作業の中断は許可されますか? ユーザーによる連携機能がミッションクリティカルな場合、代わりにハードウェアをアップグレードすることをご検討ください。連携の重要性に応じて、制限も高く設定する必要があります。算出した数を 2 倍または 3 倍にすることをご検討ください。

  2. インスタンスですでに、REST トラフィックの量による問題が発生していますか? その場合、インスタンスで問題が発生しなかった日の基本値に近い制限を選択します。顕著な問題が発生していないのであれば、基本値に 50% を追加することをご検討ください。これにより、ユーザーの作業が中断されるのを防ぎながら、十分な容量を維持できます。

In general, the limit you choose should keep your instance safe, not control individual users. Rate limiting is more about protecting Crowd from integrations and scripts going haywire, rather than stopping users from getting their work done.

レート制限を有効化する方法

You need to be a Crowd System Administrator to turn on rate limiting.

o turn on rate limiting:

  1. In Crowd, go to Administration > Rate limiting.

  2. ステータスを [有効] に変更します。

  3. Select one of the options: Allow unlimited requests, Block all requests, or Limit requests. The first and second are all about allowlisting and blocklisting. For the last option, you’ll need to enter actual limits. Find more on the in the public documentation.

  4. 変更を [保存] します。

Make sure to add exemptions for users who really need those extra requests, especially if you’ve chosen allowlisting or blocklisting.

リクエストの制限 - 詳細

許可リストやブロックリストと同様に、グローバル設定や適用除外では、リクエスト制限のオプションを頻繁に使用することになるはずです。

このオプションと仕組みについて詳しく見てみましょう。

  1. 許可されているリクエスト数: 各ユーザーは、選択した期間に特定の件数のリクエストを許可されています。1 秒あたり 10 件のリクエスト、1 時間あたり 100 件のリクエストなどの任意のの設定を選択できます。

  2. Max requests (advanced): Allowed requests, if not sent frequently, can be accumulated up to a set maximum per user. This option allows users to make requests at a different frequency than their usual rate (for example, 20 every 2 minutes instead of 10 every 1 minute, as specified in their rate), or accumulate more requests over time and send them in a single burst. Too advanced? Just make it equal to Requests allowed, and forget about this field — nothing more will be accumulated.

例 1

許可されるリクエスト: 10 件/時間 | 最大リクエスト数: 100

  • ある開発者は 1 日を通じ、1 時間あたり 10 件のリクエストを定期的に送信します。1 回にまとめて 20 件のリクエストを送信しようとすると、そのうち 10 件のみが成功します。その後の 1 時間で新しいリクエストを作成できるようになったら、残りの 10 件を再試行できます。

  • 別の開発者は過去 10 時間にリクエストを送信していません。そのため、許可されているリクエスト数は最大リクエスト数である 100 に到達するまで蓄積され続けます。これにより、一度に 100 件のリクエストを送信でき、それらすべてが成功するようになります。利用可能なすべてのリクエストを使い果たしたら、1 時間待機することで 10 件のリクエストのみが許可されます。

  • 同じ開発者が 100 件のリクエストのうち 50 件のみを送信した場合、その開発者は直ちに追加で 50 件を送信するか、次の 1 時間で再度蓄積を開始することができます。

例 2

許可されるリクエスト: 1 件/秒 | 最大リクエスト数: 60

  • 開発者は、1 秒あたり 1 件のリクエストまたは 毎分 60 件のリクエスト を送信するように任意の頻度を選択できます。

  • 割り当てられた 60 件のリクエストを任意の頻度で使用できるので、それらすべてを一度に使用することも、非常に短い間隔で使用することもできます。このような場合、1 秒あたり 1 件のリクエストという通常のレートを超えることになります。

適切な制限を見つける

管理者による制限の選択基準について

適切な制限の設定は多くの要因に依存するため、単純な回答を提供することはできません。ここではいくつかの提案をご案内させていただきます。

適切な制限を見つける

最初に、インスタンスが受信するトラフィックのサイズを理解します。アクセス ログを解析し、1 日に最大数の REST リクエストを作成したユーザーを見つけます。UI トラフィックはレート制限されないため、この数字はレート制限として必要な値よりも大きくなります。次に、これを基本値とし、以下の質問に基づいてさらに変更します。

  1. ユーザーの作業の中断は許可されますか? ユーザーによる連携機能がミッションクリティカルな場合、代わりにハードウェアをアップグレードすることをご検討ください。連携の重要性に応じて、制限も高く設定する必要があります。算出した数を 2 倍または 3 倍にすることをご検討ください。

  2. インスタンスですでに、REST トラフィックの量による問題が発生していますか? その場合、インスタンスで問題が発生しなかった日の基本値に近い制限を選択します。顕著な問題が発生していないのであれば、基本値に 50% を追加することをご検討ください。これにより、ユーザーの作業が中断されるのを防ぎながら、十分な容量を維持できます。

In general, the limit you choose should keep your instance safe, not control individual users. Rate limiting is more about protecting Crowd from integrations and scripts going haywire, rather than stopping users from getting their work done.

例外の追加

同様に例外は、他のユーザーよりも多くのリクエストを実際に必要とするユーザーのための特別な制限です。選択した例外は、グローバル設定よりも優先されます。

例外を追加または編集した後、変更はすぐに反映されますが、新しい設定がユーザーに適用されるには最大で 1 分かかります。

例外を追加するには、次の手順を実行します。

  1. [例外] タブに移動します。

  2. [例外の追加] をクリックします。

  3. ユーザーを見つけ、そのユーザーのための新しい設定を選択します。

    • グループを選択することはできませんが、複数のユーザーを選択できます。

    • ここで利用可能なオプションはグローバルな設定の場合と同じです: "無制限のリクエストを許可"、"すべてのリクエストをブロック "、"カスタム制限を割り当て"。

  4. 変更を [保存] します。

後から例外を編集したい場合は、[例外] タブでユーザー名の横にある [編集] をクリックします。

推奨: 匿名アクセスへの例外を追加

Crowd sees all anonymous traffic as made by one user: Anonymous. If your rate limits are not too high, it might happen that a single user drains the limit assigned to anonymous. It’s a good idea to add an exemption for this account with a higher limit, and then observe whether you need to increase it further. 

レート制限されているユーザーの特定

ユーザーがレート制限を受けている場合、HTTP 429 エラー メッセージ (too many requests) が表示されるため、ユーザーはすぐにそのことを確認できます。管理者はレート制限設定ページの [制限を受けているアカウントの一覧] を開いて、レート制限を受けているユーザーを特定できます。一覧には、クラスタ全体のすべてのユーザーが表示されます。

ユーザーがレート制限を受けている場合、表に表示されるには最大で 5 分かかります。

異常なアカウント

ユーザーは一覧にユーザー名で表示されます。ただし一覧には、いくつかの異常なアカウントが表示される場合があります。以下に例を示します。

  • Unknown: That’s a user that has been deleted in Crowd. They shouldn’t appear on the list for more than 24 hours (as they can’t be rate limited anymore), but you might see them in the list of exemptions. Just delete any settings for them, they don’t need rate limiting anymore.

  • Anonymous: このエントリは、認証されていないアカウントから行われたすべてのリクエストを収集します。1 人のユーザーで匿名アクセスの制限までのリクエスト数を簡単に使用できてしまうことがあるため、匿名トラフィックに例外を追加して、高い制限値を追加することをおすすめします。

制限付きのリクエストをログ ファイルに追加する

You can also view information about rate limited users and requests in the Crowd log file. This is useful if you want to get more details about the URLs that requests targeted or originated from.

ここをクリックして展開...

制限付きのリクエストをログ ファイルに追加するには、次の手順を実行します。

  1. Go to Administration > Logging and profiling.

  2. Scroll down until you see the input prompt for Class/Package name

  3. Set the package name to: com.atlassian.ratelimiting.internal.requesthandler.logging

  4. Set the logging level to DEBUG, and click Add.

  5. Every rate limited requests will now appear in the Crowd log file: 

    2023-12-03 19:51:24,337 http-nio-8095-exec-17 url: /rest/appmanagement/1/application/32770; user: admin DEBUG [internal.requesthandler.logging.RateLimitedRequestLogger] User [admin] has been rate limited for URL [https://instenv-209516-tll5.instenv.internal.atlassian.com/rest/appmanagement/1/application/32770]




レート制限とは - ユーザーの観点から

ヘッダー

説明

X-RateLimit-Limit

これまでに持つことができるリクエスト (トークン) の最大数。この制限に到達した後は、新しいトークンがバケットに追加されません。管理者はこれを [最大要求数] として設定します。

X-RateLimit-Remaining

トークンの残りの数。自身が現在保有していて、すぐに使用できるトークン数です。

X-RateLimit-Interval-Seconds

時間間隔 (秒単位)。この間隔ごとに新しいトークンのバッチを取得できます。

X-RateLimit-FillRate

時間間隔ごとに取得するトークンの数。管理者は、これを [許容要求数] として設定します。

retry-after

新しいトークンを取得するまでに待機する必要がある時間。

You can send a request successfully when the retry-after header is set to 0 after several failures with the HTTP status code 429.

ユーザーがレート制限を受けていてリクエストが処理されない場合、HTTP 429 エラー メッセージ (too many requests) が返されます。ユーザーはこのヘッダーを使用して、スクリプトや自動化を制限に合わせて調整し、妥当な頻度でリクエストを送信できます。

URL と外部アプリケーションの許可リスト

URL とリソースを許可リストに追加する

We’ve also added a way to allowlist whole URLs and resources on your Crowd instance. This should be used as quick fix for something that gets rate limited, but shouldn’t.

使用すべきタイミング

For example, a Marketplace app added some new API to Crowd. The app itself is used from the UI, so it shouldn’t be limited, but it might happen that Crowd sees this traffic as external and applies the rate limit. In this case, you could disable the app or increase the rate limit, but this brings additional complications.

このような問題を回避するには、アプリによって追加されたリソース全体を許可リストに追加し、それらが制限なしで動作するようにできます。

特定の URL をレート制限から除外することを許可するには、次の手順を実行します。

  1. Stop Crowd.

  2. Add the com.atlassian.ratelimiting.whitelisted-url-patterns system property, and set the value to a comma-separated list of URLs, for example: 

    -Dcom.atlassian.ratelimiting.whitelisted-url-patterns=/**/rest/applinks/**,/**/rest/capabilities,/**/rest/someapi
  3. Restart Crowd.

外部アプリケーションを許可リストに追加する

コンシューマー キーを許可リストに追加して、アプリケーション リンクを通じて連携された外部アプリケーションのレート制限を削除できます。

If you're integrating Crowd with other Atlassian products, you don't have to allowlist them as this traffic isn't limited.

  1. アプリケーションのコンシューマー キーを見つけます。

    1. Go to Administration > Application links.

    2. アプリケーションを見つけて [編集] をクリックします。

    3. [受信認証] を開き、コンシューマー キーをコピーします。

  2. コンシューマー キーを許可リストに追加します。

    1. Stop Crowd.

    2. com.atlassian.ratelimiting.whitelisted-oauth-consumers システム プロパティを追加し、値をコンシューマー キーのカンマ区切りリストに設定します。例: 

      -Dcom.atlassian.ratelimiting.whitelisted-oauth-consumers=app-connector-for-confluence-server
    3. Restart Crowd.

コンシューマー キーを入力すると、関連するアプリケーションからのトラフィックは制限されなくなります。

レート制限用にコードを調整する

We’ve created a set of strategies you can apply in your code (scripts, integrations, apps) so it works with rate limits, whatever they are. For more info, see Adjusting your code for rate limiting.

最終更新日: 2023 年 12 月 11 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する

このセクションの項目

Powered by Confluence and Scroll Viewport.