pulumi-kafka 3.8.0a1723819820__py3-none-any.whl → 3.13.0a1763619276__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pulumi_kafka/__init__.py +4 -1
- pulumi_kafka/_utilities.py +10 -6
- pulumi_kafka/acl.py +298 -242
- pulumi_kafka/config/__init__.py +2 -1
- pulumi_kafka/config/__init__.pyi +48 -4
- pulumi_kafka/config/vars.py +84 -24
- pulumi_kafka/get_topic.py +30 -19
- pulumi_kafka/get_topics.py +85 -0
- pulumi_kafka/outputs.py +71 -0
- pulumi_kafka/provider.py +428 -198
- pulumi_kafka/pulumi-plugin.json +1 -1
- pulumi_kafka/quota.py +294 -79
- pulumi_kafka/topic.py +266 -88
- pulumi_kafka/user_scram_credential.py +207 -87
- {pulumi_kafka-3.8.0a1723819820.dist-info → pulumi_kafka-3.13.0a1763619276.dist-info}/METADATA +7 -6
- pulumi_kafka-3.13.0a1763619276.dist-info/RECORD +19 -0
- {pulumi_kafka-3.8.0a1723819820.dist-info → pulumi_kafka-3.13.0a1763619276.dist-info}/WHEEL +1 -1
- pulumi_kafka-3.8.0a1723819820.dist-info/RECORD +0 -17
- {pulumi_kafka-3.8.0a1723819820.dist-info → pulumi_kafka-3.13.0a1763619276.dist-info}/top_level.txt +0 -0
pulumi_kafka/pulumi-plugin.json
CHANGED
pulumi_kafka/quota.py
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
# coding=utf-8
|
|
2
|
-
# *** WARNING: this file was generated by
|
|
2
|
+
# *** WARNING: this file was generated by pulumi-language-python. ***
|
|
3
3
|
# *** Do not edit by hand unless you're certain you know what you are doing! ***
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import builtins as _builtins
|
|
6
6
|
import warnings
|
|
7
|
+
import sys
|
|
7
8
|
import pulumi
|
|
8
9
|
import pulumi.runtime
|
|
9
10
|
from typing import Any, Mapping, Optional, Sequence, Union, overload
|
|
11
|
+
if sys.version_info >= (3, 11):
|
|
12
|
+
from typing import NotRequired, TypedDict, TypeAlias
|
|
13
|
+
else:
|
|
14
|
+
from typing_extensions import NotRequired, TypedDict, TypeAlias
|
|
10
15
|
from . import _utilities
|
|
11
16
|
|
|
12
17
|
__all__ = ['QuotaArgs', 'Quota']
|
|
@@ -14,68 +19,69 @@ __all__ = ['QuotaArgs', 'Quota']
|
|
|
14
19
|
@pulumi.input_type
|
|
15
20
|
class QuotaArgs:
|
|
16
21
|
def __init__(__self__, *,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
entity_type: pulumi.Input[_builtins.str],
|
|
23
|
+
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
|
|
24
|
+
entity_name: Optional[pulumi.Input[_builtins.str]] = None):
|
|
20
25
|
"""
|
|
21
26
|
The set of arguments for constructing a Quota resource.
|
|
22
|
-
:param pulumi.Input[str]
|
|
23
|
-
:param pulumi.Input[str]
|
|
24
|
-
:param pulumi.Input[
|
|
27
|
+
:param pulumi.Input[_builtins.str] entity_type: The type of the entity (client-id, user, ip)
|
|
28
|
+
:param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] config: A map of string k/v properties.
|
|
29
|
+
:param pulumi.Input[_builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
25
30
|
"""
|
|
26
|
-
pulumi.set(__self__, "entity_name", entity_name)
|
|
27
31
|
pulumi.set(__self__, "entity_type", entity_type)
|
|
28
32
|
if config is not None:
|
|
29
33
|
pulumi.set(__self__, "config", config)
|
|
34
|
+
if entity_name is not None:
|
|
35
|
+
pulumi.set(__self__, "entity_name", entity_name)
|
|
30
36
|
|
|
31
|
-
@property
|
|
32
|
-
@pulumi.getter(name="entityName")
|
|
33
|
-
def entity_name(self) -> pulumi.Input[str]:
|
|
34
|
-
"""
|
|
35
|
-
The name of the entity to target.
|
|
36
|
-
"""
|
|
37
|
-
return pulumi.get(self, "entity_name")
|
|
38
|
-
|
|
39
|
-
@entity_name.setter
|
|
40
|
-
def entity_name(self, value: pulumi.Input[str]):
|
|
41
|
-
pulumi.set(self, "entity_name", value)
|
|
42
|
-
|
|
43
|
-
@property
|
|
37
|
+
@_builtins.property
|
|
44
38
|
@pulumi.getter(name="entityType")
|
|
45
|
-
def entity_type(self) -> pulumi.Input[str]:
|
|
39
|
+
def entity_type(self) -> pulumi.Input[_builtins.str]:
|
|
46
40
|
"""
|
|
47
|
-
The type of entity
|
|
41
|
+
The type of the entity (client-id, user, ip)
|
|
48
42
|
"""
|
|
49
43
|
return pulumi.get(self, "entity_type")
|
|
50
44
|
|
|
51
45
|
@entity_type.setter
|
|
52
|
-
def entity_type(self, value: pulumi.Input[str]):
|
|
46
|
+
def entity_type(self, value: pulumi.Input[_builtins.str]):
|
|
53
47
|
pulumi.set(self, "entity_type", value)
|
|
54
48
|
|
|
55
|
-
@property
|
|
49
|
+
@_builtins.property
|
|
56
50
|
@pulumi.getter
|
|
57
|
-
def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]:
|
|
51
|
+
def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]:
|
|
58
52
|
"""
|
|
59
|
-
A map of string k/v
|
|
53
|
+
A map of string k/v properties.
|
|
60
54
|
"""
|
|
61
55
|
return pulumi.get(self, "config")
|
|
62
56
|
|
|
63
57
|
@config.setter
|
|
64
|
-
def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]):
|
|
58
|
+
def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]):
|
|
65
59
|
pulumi.set(self, "config", value)
|
|
66
60
|
|
|
61
|
+
@_builtins.property
|
|
62
|
+
@pulumi.getter(name="entityName")
|
|
63
|
+
def entity_name(self) -> Optional[pulumi.Input[_builtins.str]]:
|
|
64
|
+
"""
|
|
65
|
+
The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
66
|
+
"""
|
|
67
|
+
return pulumi.get(self, "entity_name")
|
|
68
|
+
|
|
69
|
+
@entity_name.setter
|
|
70
|
+
def entity_name(self, value: Optional[pulumi.Input[_builtins.str]]):
|
|
71
|
+
pulumi.set(self, "entity_name", value)
|
|
72
|
+
|
|
67
73
|
|
|
68
74
|
@pulumi.input_type
|
|
69
75
|
class _QuotaState:
|
|
70
76
|
def __init__(__self__, *,
|
|
71
|
-
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
|
|
72
|
-
entity_name: Optional[pulumi.Input[str]] = None,
|
|
73
|
-
entity_type: Optional[pulumi.Input[str]] = None):
|
|
77
|
+
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
|
|
78
|
+
entity_name: Optional[pulumi.Input[_builtins.str]] = None,
|
|
79
|
+
entity_type: Optional[pulumi.Input[_builtins.str]] = None):
|
|
74
80
|
"""
|
|
75
81
|
Input properties used for looking up and filtering Quota resources.
|
|
76
|
-
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] config: A map of string k/v
|
|
77
|
-
:param pulumi.Input[str] entity_name: The name of the entity
|
|
78
|
-
:param pulumi.Input[str] entity_type: The type of entity
|
|
82
|
+
:param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] config: A map of string k/v properties.
|
|
83
|
+
:param pulumi.Input[_builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
84
|
+
:param pulumi.Input[_builtins.str] entity_type: The type of the entity (client-id, user, ip)
|
|
79
85
|
"""
|
|
80
86
|
if config is not None:
|
|
81
87
|
pulumi.set(__self__, "config", config)
|
|
@@ -84,75 +90,181 @@ class _QuotaState:
|
|
|
84
90
|
if entity_type is not None:
|
|
85
91
|
pulumi.set(__self__, "entity_type", entity_type)
|
|
86
92
|
|
|
87
|
-
@property
|
|
93
|
+
@_builtins.property
|
|
88
94
|
@pulumi.getter
|
|
89
|
-
def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]:
|
|
95
|
+
def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]:
|
|
90
96
|
"""
|
|
91
|
-
A map of string k/v
|
|
97
|
+
A map of string k/v properties.
|
|
92
98
|
"""
|
|
93
99
|
return pulumi.get(self, "config")
|
|
94
100
|
|
|
95
101
|
@config.setter
|
|
96
|
-
def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]):
|
|
102
|
+
def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]):
|
|
97
103
|
pulumi.set(self, "config", value)
|
|
98
104
|
|
|
99
|
-
@property
|
|
105
|
+
@_builtins.property
|
|
100
106
|
@pulumi.getter(name="entityName")
|
|
101
|
-
def entity_name(self) -> Optional[pulumi.Input[str]]:
|
|
107
|
+
def entity_name(self) -> Optional[pulumi.Input[_builtins.str]]:
|
|
102
108
|
"""
|
|
103
|
-
The name of the entity
|
|
109
|
+
The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
104
110
|
"""
|
|
105
111
|
return pulumi.get(self, "entity_name")
|
|
106
112
|
|
|
107
113
|
@entity_name.setter
|
|
108
|
-
def entity_name(self, value: Optional[pulumi.Input[str]]):
|
|
114
|
+
def entity_name(self, value: Optional[pulumi.Input[_builtins.str]]):
|
|
109
115
|
pulumi.set(self, "entity_name", value)
|
|
110
116
|
|
|
111
|
-
@property
|
|
117
|
+
@_builtins.property
|
|
112
118
|
@pulumi.getter(name="entityType")
|
|
113
|
-
def entity_type(self) -> Optional[pulumi.Input[str]]:
|
|
119
|
+
def entity_type(self) -> Optional[pulumi.Input[_builtins.str]]:
|
|
114
120
|
"""
|
|
115
|
-
The type of entity
|
|
121
|
+
The type of the entity (client-id, user, ip)
|
|
116
122
|
"""
|
|
117
123
|
return pulumi.get(self, "entity_type")
|
|
118
124
|
|
|
119
125
|
@entity_type.setter
|
|
120
|
-
def entity_type(self, value: Optional[pulumi.Input[str]]):
|
|
126
|
+
def entity_type(self, value: Optional[pulumi.Input[_builtins.str]]):
|
|
121
127
|
pulumi.set(self, "entity_type", value)
|
|
122
128
|
|
|
123
129
|
|
|
130
|
+
@pulumi.type_token("kafka:index/quota:Quota")
|
|
124
131
|
class Quota(pulumi.CustomResource):
|
|
125
132
|
@overload
|
|
126
133
|
def __init__(__self__,
|
|
127
134
|
resource_name: str,
|
|
128
135
|
opts: Optional[pulumi.ResourceOptions] = None,
|
|
129
|
-
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
|
|
130
|
-
entity_name: Optional[pulumi.Input[str]] = None,
|
|
131
|
-
entity_type: Optional[pulumi.Input[str]] = None,
|
|
136
|
+
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
|
|
137
|
+
entity_name: Optional[pulumi.Input[_builtins.str]] = None,
|
|
138
|
+
entity_type: Optional[pulumi.Input[_builtins.str]] = None,
|
|
132
139
|
__props__=None):
|
|
133
140
|
"""
|
|
134
|
-
|
|
141
|
+
The `Quota` resource manages Kafka quotas, which are used to limit resource usage and prevent any single client from monopolizing broker resources. Quotas can be applied to clients, users, or IP addresses to control bandwidth and request rates.
|
|
135
142
|
|
|
136
143
|
## Example Usage
|
|
137
144
|
|
|
145
|
+
### Client ID Quota
|
|
146
|
+
|
|
138
147
|
```python
|
|
139
148
|
import pulumi
|
|
140
149
|
import pulumi_kafka as kafka
|
|
141
150
|
|
|
142
|
-
|
|
143
|
-
|
|
151
|
+
# Limit a specific client's bandwidth
|
|
152
|
+
mobile_app = kafka.Quota("mobile_app",
|
|
153
|
+
entity_name="mobile-app-v1",
|
|
144
154
|
entity_type="client-id",
|
|
145
155
|
config={
|
|
146
156
|
"consumer_byte_rate": "5000000",
|
|
147
157
|
"producer_byte_rate": "2500000",
|
|
158
|
+
"request_percentage": "200",
|
|
148
159
|
})
|
|
149
160
|
```
|
|
150
161
|
|
|
162
|
+
### User Quota
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
import pulumi
|
|
166
|
+
import pulumi_kafka as kafka
|
|
167
|
+
|
|
168
|
+
# Set quotas for a specific user
|
|
169
|
+
service_account = kafka.Quota("service_account",
|
|
170
|
+
entity_name="payment-service",
|
|
171
|
+
entity_type="user",
|
|
172
|
+
config={
|
|
173
|
+
"consumer_byte_rate": "10000000",
|
|
174
|
+
"producer_byte_rate": "10000000",
|
|
175
|
+
"request_percentage": "400",
|
|
176
|
+
})
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Default User Quota
|
|
180
|
+
|
|
181
|
+
```python
|
|
182
|
+
import pulumi
|
|
183
|
+
import pulumi_kafka as kafka
|
|
184
|
+
|
|
185
|
+
# Set default quotas for all users (when entity_name is omitted)
|
|
186
|
+
default_user = kafka.Quota("default_user",
|
|
187
|
+
entity_type="user",
|
|
188
|
+
config={
|
|
189
|
+
"consumer_byte_rate": "2000000",
|
|
190
|
+
"producer_byte_rate": "1000000",
|
|
191
|
+
"request_percentage": "100",
|
|
192
|
+
})
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### IP Address Quota
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
import pulumi
|
|
199
|
+
import pulumi_kafka as kafka
|
|
200
|
+
|
|
201
|
+
# Rate limit connections from a specific IP
|
|
202
|
+
external_ip = kafka.Quota("external_ip",
|
|
203
|
+
entity_name="203.0.113.0",
|
|
204
|
+
entity_type="ip",
|
|
205
|
+
config={
|
|
206
|
+
"connection_creation_rate": "10",
|
|
207
|
+
})
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Quota Configuration Options
|
|
211
|
+
|
|
212
|
+
### Bandwidth Quotas
|
|
213
|
+
- `producer_byte_rate` - The maximum bytes per second that can be produced by the entity
|
|
214
|
+
- `consumer_byte_rate` - The maximum bytes per second that can be consumed by the entity
|
|
215
|
+
|
|
216
|
+
### Request Rate Quotas
|
|
217
|
+
- `request_percentage` - The percentage of CPU time on each broker that the entity can use for requests. Values > 100% indicate multiple CPUs (e.g., 200% = 2 CPUs)
|
|
218
|
+
|
|
219
|
+
### Connection Quotas (IP-based only)
|
|
220
|
+
- `connection_creation_rate` - The maximum rate of new connections per second from the IP address
|
|
221
|
+
|
|
222
|
+
## Quota Precedence
|
|
223
|
+
|
|
224
|
+
When multiple quotas apply to a request, Kafka uses the most specific quota:
|
|
225
|
+
|
|
226
|
+
1. `/config/users/<user>/clients/<client-id>` (most specific)
|
|
227
|
+
2. `/config/users/<user>/clients/<default>`
|
|
228
|
+
3. `/config/users/<user>`
|
|
229
|
+
4. `/config/users/<default>/clients/<client-id>`
|
|
230
|
+
5. `/config/users/<default>/clients/<default>`
|
|
231
|
+
6. `/config/users/<default>` (least specific)
|
|
232
|
+
|
|
233
|
+
## Best Practices
|
|
234
|
+
|
|
235
|
+
1. **Start with Conservative Defaults**: Set reasonable default quotas for all users/clients and then create specific quotas for services that need higher limits.
|
|
236
|
+
|
|
237
|
+
2. **Monitor Quota Usage**: Use Kafka metrics to monitor quota utilization and adjust as needed. Look for throttling metrics to identify when quotas are being hit.
|
|
238
|
+
|
|
239
|
+
3. **Use Request Percentage Carefully**: The `request_percentage` quota affects CPU usage. Values over 100% mean the client can use more than one CPU core.
|
|
240
|
+
|
|
241
|
+
4. **Plan for Growth**: Set quotas with some headroom to accommodate traffic growth, but not so high that a misbehaving client can impact the cluster.
|
|
242
|
+
|
|
243
|
+
5. **Different Quotas for Different Environments**: Use stricter quotas in development/staging environments compared to production.
|
|
244
|
+
|
|
245
|
+
> **Note:** Quotas are applied immediately but may take a few seconds to propagate across all brokers.
|
|
246
|
+
|
|
247
|
+
## Import
|
|
248
|
+
|
|
249
|
+
Kafka quotas can be imported using the entity type and name:
|
|
250
|
+
|
|
251
|
+
For named entities
|
|
252
|
+
|
|
253
|
+
```sh
|
|
254
|
+
$ pulumi import kafka:index/quota:Quota example client-id:my-client
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
For default quotas (no entity name)
|
|
258
|
+
|
|
259
|
+
```sh
|
|
260
|
+
$ pulumi import kafka:index/quota:Quota default_user user:
|
|
261
|
+
```
|
|
262
|
+
|
|
151
263
|
:param str resource_name: The name of the resource.
|
|
152
264
|
:param pulumi.ResourceOptions opts: Options for the resource.
|
|
153
|
-
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] config: A map of string k/v
|
|
154
|
-
:param pulumi.Input[str] entity_name: The name of the entity
|
|
155
|
-
:param pulumi.Input[str] entity_type: The type of entity
|
|
265
|
+
:param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] config: A map of string k/v properties.
|
|
266
|
+
:param pulumi.Input[_builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
267
|
+
:param pulumi.Input[_builtins.str] entity_type: The type of the entity (client-id, user, ip)
|
|
156
268
|
"""
|
|
157
269
|
...
|
|
158
270
|
@overload
|
|
@@ -161,23 +273,128 @@ class Quota(pulumi.CustomResource):
|
|
|
161
273
|
args: QuotaArgs,
|
|
162
274
|
opts: Optional[pulumi.ResourceOptions] = None):
|
|
163
275
|
"""
|
|
164
|
-
|
|
276
|
+
The `Quota` resource manages Kafka quotas, which are used to limit resource usage and prevent any single client from monopolizing broker resources. Quotas can be applied to clients, users, or IP addresses to control bandwidth and request rates.
|
|
165
277
|
|
|
166
278
|
## Example Usage
|
|
167
279
|
|
|
280
|
+
### Client ID Quota
|
|
281
|
+
|
|
168
282
|
```python
|
|
169
283
|
import pulumi
|
|
170
284
|
import pulumi_kafka as kafka
|
|
171
285
|
|
|
172
|
-
|
|
173
|
-
|
|
286
|
+
# Limit a specific client's bandwidth
|
|
287
|
+
mobile_app = kafka.Quota("mobile_app",
|
|
288
|
+
entity_name="mobile-app-v1",
|
|
174
289
|
entity_type="client-id",
|
|
175
290
|
config={
|
|
176
291
|
"consumer_byte_rate": "5000000",
|
|
177
292
|
"producer_byte_rate": "2500000",
|
|
293
|
+
"request_percentage": "200",
|
|
294
|
+
})
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### User Quota
|
|
298
|
+
|
|
299
|
+
```python
|
|
300
|
+
import pulumi
|
|
301
|
+
import pulumi_kafka as kafka
|
|
302
|
+
|
|
303
|
+
# Set quotas for a specific user
|
|
304
|
+
service_account = kafka.Quota("service_account",
|
|
305
|
+
entity_name="payment-service",
|
|
306
|
+
entity_type="user",
|
|
307
|
+
config={
|
|
308
|
+
"consumer_byte_rate": "10000000",
|
|
309
|
+
"producer_byte_rate": "10000000",
|
|
310
|
+
"request_percentage": "400",
|
|
178
311
|
})
|
|
179
312
|
```
|
|
180
313
|
|
|
314
|
+
### Default User Quota
|
|
315
|
+
|
|
316
|
+
```python
|
|
317
|
+
import pulumi
|
|
318
|
+
import pulumi_kafka as kafka
|
|
319
|
+
|
|
320
|
+
# Set default quotas for all users (when entity_name is omitted)
|
|
321
|
+
default_user = kafka.Quota("default_user",
|
|
322
|
+
entity_type="user",
|
|
323
|
+
config={
|
|
324
|
+
"consumer_byte_rate": "2000000",
|
|
325
|
+
"producer_byte_rate": "1000000",
|
|
326
|
+
"request_percentage": "100",
|
|
327
|
+
})
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### IP Address Quota
|
|
331
|
+
|
|
332
|
+
```python
|
|
333
|
+
import pulumi
|
|
334
|
+
import pulumi_kafka as kafka
|
|
335
|
+
|
|
336
|
+
# Rate limit connections from a specific IP
|
|
337
|
+
external_ip = kafka.Quota("external_ip",
|
|
338
|
+
entity_name="203.0.113.0",
|
|
339
|
+
entity_type="ip",
|
|
340
|
+
config={
|
|
341
|
+
"connection_creation_rate": "10",
|
|
342
|
+
})
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## Quota Configuration Options
|
|
346
|
+
|
|
347
|
+
### Bandwidth Quotas
|
|
348
|
+
- `producer_byte_rate` - The maximum bytes per second that can be produced by the entity
|
|
349
|
+
- `consumer_byte_rate` - The maximum bytes per second that can be consumed by the entity
|
|
350
|
+
|
|
351
|
+
### Request Rate Quotas
|
|
352
|
+
- `request_percentage` - The percentage of CPU time on each broker that the entity can use for requests. Values > 100% indicate multiple CPUs (e.g., 200% = 2 CPUs)
|
|
353
|
+
|
|
354
|
+
### Connection Quotas (IP-based only)
|
|
355
|
+
- `connection_creation_rate` - The maximum rate of new connections per second from the IP address
|
|
356
|
+
|
|
357
|
+
## Quota Precedence
|
|
358
|
+
|
|
359
|
+
When multiple quotas apply to a request, Kafka uses the most specific quota:
|
|
360
|
+
|
|
361
|
+
1. `/config/users/<user>/clients/<client-id>` (most specific)
|
|
362
|
+
2. `/config/users/<user>/clients/<default>`
|
|
363
|
+
3. `/config/users/<user>`
|
|
364
|
+
4. `/config/users/<default>/clients/<client-id>`
|
|
365
|
+
5. `/config/users/<default>/clients/<default>`
|
|
366
|
+
6. `/config/users/<default>` (least specific)
|
|
367
|
+
|
|
368
|
+
## Best Practices
|
|
369
|
+
|
|
370
|
+
1. **Start with Conservative Defaults**: Set reasonable default quotas for all users/clients and then create specific quotas for services that need higher limits.
|
|
371
|
+
|
|
372
|
+
2. **Monitor Quota Usage**: Use Kafka metrics to monitor quota utilization and adjust as needed. Look for throttling metrics to identify when quotas are being hit.
|
|
373
|
+
|
|
374
|
+
3. **Use Request Percentage Carefully**: The `request_percentage` quota affects CPU usage. Values over 100% mean the client can use more than one CPU core.
|
|
375
|
+
|
|
376
|
+
4. **Plan for Growth**: Set quotas with some headroom to accommodate traffic growth, but not so high that a misbehaving client can impact the cluster.
|
|
377
|
+
|
|
378
|
+
5. **Different Quotas for Different Environments**: Use stricter quotas in development/staging environments compared to production.
|
|
379
|
+
|
|
380
|
+
> **Note:** Quotas are applied immediately but may take a few seconds to propagate across all brokers.
|
|
381
|
+
|
|
382
|
+
## Import
|
|
383
|
+
|
|
384
|
+
Kafka quotas can be imported using the entity type and name:
|
|
385
|
+
|
|
386
|
+
For named entities
|
|
387
|
+
|
|
388
|
+
```sh
|
|
389
|
+
$ pulumi import kafka:index/quota:Quota example client-id:my-client
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
For default quotas (no entity name)
|
|
393
|
+
|
|
394
|
+
```sh
|
|
395
|
+
$ pulumi import kafka:index/quota:Quota default_user user:
|
|
396
|
+
```
|
|
397
|
+
|
|
181
398
|
:param str resource_name: The name of the resource.
|
|
182
399
|
:param QuotaArgs args: The arguments to use to populate this resource's properties.
|
|
183
400
|
:param pulumi.ResourceOptions opts: Options for the resource.
|
|
@@ -193,9 +410,9 @@ class Quota(pulumi.CustomResource):
|
|
|
193
410
|
def _internal_init(__self__,
|
|
194
411
|
resource_name: str,
|
|
195
412
|
opts: Optional[pulumi.ResourceOptions] = None,
|
|
196
|
-
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
|
|
197
|
-
entity_name: Optional[pulumi.Input[str]] = None,
|
|
198
|
-
entity_type: Optional[pulumi.Input[str]] = None,
|
|
413
|
+
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
|
|
414
|
+
entity_name: Optional[pulumi.Input[_builtins.str]] = None,
|
|
415
|
+
entity_type: Optional[pulumi.Input[_builtins.str]] = None,
|
|
199
416
|
__props__=None):
|
|
200
417
|
opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts)
|
|
201
418
|
if not isinstance(opts, pulumi.ResourceOptions):
|
|
@@ -206,8 +423,6 @@ class Quota(pulumi.CustomResource):
|
|
|
206
423
|
__props__ = QuotaArgs.__new__(QuotaArgs)
|
|
207
424
|
|
|
208
425
|
__props__.__dict__["config"] = config
|
|
209
|
-
if entity_name is None and not opts.urn:
|
|
210
|
-
raise TypeError("Missing required property 'entity_name'")
|
|
211
426
|
__props__.__dict__["entity_name"] = entity_name
|
|
212
427
|
if entity_type is None and not opts.urn:
|
|
213
428
|
raise TypeError("Missing required property 'entity_type'")
|
|
@@ -222,9 +437,9 @@ class Quota(pulumi.CustomResource):
|
|
|
222
437
|
def get(resource_name: str,
|
|
223
438
|
id: pulumi.Input[str],
|
|
224
439
|
opts: Optional[pulumi.ResourceOptions] = None,
|
|
225
|
-
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
|
|
226
|
-
entity_name: Optional[pulumi.Input[str]] = None,
|
|
227
|
-
entity_type: Optional[pulumi.Input[str]] = None) -> 'Quota':
|
|
440
|
+
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
|
|
441
|
+
entity_name: Optional[pulumi.Input[_builtins.str]] = None,
|
|
442
|
+
entity_type: Optional[pulumi.Input[_builtins.str]] = None) -> 'Quota':
|
|
228
443
|
"""
|
|
229
444
|
Get an existing Quota resource's state with the given name, id, and optional extra
|
|
230
445
|
properties used to qualify the lookup.
|
|
@@ -232,9 +447,9 @@ class Quota(pulumi.CustomResource):
|
|
|
232
447
|
:param str resource_name: The unique name of the resulting resource.
|
|
233
448
|
:param pulumi.Input[str] id: The unique provider ID of the resource to lookup.
|
|
234
449
|
:param pulumi.ResourceOptions opts: Options for the resource.
|
|
235
|
-
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] config: A map of string k/v
|
|
236
|
-
:param pulumi.Input[str] entity_name: The name of the entity
|
|
237
|
-
:param pulumi.Input[str] entity_type: The type of entity
|
|
450
|
+
:param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] config: A map of string k/v properties.
|
|
451
|
+
:param pulumi.Input[_builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
452
|
+
:param pulumi.Input[_builtins.str] entity_type: The type of the entity (client-id, user, ip)
|
|
238
453
|
"""
|
|
239
454
|
opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
|
|
240
455
|
|
|
@@ -245,27 +460,27 @@ class Quota(pulumi.CustomResource):
|
|
|
245
460
|
__props__.__dict__["entity_type"] = entity_type
|
|
246
461
|
return Quota(resource_name, opts=opts, __props__=__props__)
|
|
247
462
|
|
|
248
|
-
@property
|
|
463
|
+
@_builtins.property
|
|
249
464
|
@pulumi.getter
|
|
250
|
-
def config(self) -> pulumi.Output[Optional[Mapping[str, str]]]:
|
|
465
|
+
def config(self) -> pulumi.Output[Optional[Mapping[str, _builtins.str]]]:
|
|
251
466
|
"""
|
|
252
|
-
A map of string k/v
|
|
467
|
+
A map of string k/v properties.
|
|
253
468
|
"""
|
|
254
469
|
return pulumi.get(self, "config")
|
|
255
470
|
|
|
256
|
-
@property
|
|
471
|
+
@_builtins.property
|
|
257
472
|
@pulumi.getter(name="entityName")
|
|
258
|
-
def entity_name(self) -> pulumi.Output[str]:
|
|
473
|
+
def entity_name(self) -> pulumi.Output[Optional[_builtins.str]]:
|
|
259
474
|
"""
|
|
260
|
-
The name of the entity
|
|
475
|
+
The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
261
476
|
"""
|
|
262
477
|
return pulumi.get(self, "entity_name")
|
|
263
478
|
|
|
264
|
-
@property
|
|
479
|
+
@_builtins.property
|
|
265
480
|
@pulumi.getter(name="entityType")
|
|
266
|
-
def entity_type(self) -> pulumi.Output[str]:
|
|
481
|
+
def entity_type(self) -> pulumi.Output[_builtins.str]:
|
|
267
482
|
"""
|
|
268
|
-
The type of entity
|
|
483
|
+
The type of the entity (client-id, user, ip)
|
|
269
484
|
"""
|
|
270
485
|
return pulumi.get(self, "entity_type")
|
|
271
486
|
|