python - 如果第一个规则优先级已使用 elbv2 create_rule 设置为“1”,如何在侦听器规则之上插入新的 elbv2 规则?
问题描述
我正在编写一个脚本,它将在 alb 中已经存在的侦听器规则之上插入一个新的 elbv2 侦听器规则。
response = elbv2_client.create_rule(
ListenerArn=listener_arn,
Priority=1,
Conditions=[
{
'Field': 'http-request-method',
'HttpRequestMethodConfig': {
'Values': ['GET']
}
}
],
Actions=[
{
'Type': 'fixed-response',
'FixedResponseConfig':
{
'ContentType': 'text/html',
'MessageBody': html_object,
'StatusCode': '504'
}
}
]
)
就像您在 AWS 控制台上在顶部插入新规则时所做的那样,这些规则会自动重新编号。
问题是规则 ['Priority'] 编号与 AWS 控制台中显示的编号不同(如此处的注释所述:https ://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener -update-rules.html )
注意: 控制台显示每个规则的相对序列号,而不是规则优先级。 您可以通过使用 AWS CLI 或 Elastic Load Balancing API 描述规则来获取规则的优先级。
当我使用 elbv2 create_rule() 时,如果最上面的规则设置为 Priority = 1,它会给我这个错误。
botocore.errorfactory.PriorityInUseException:调用 CreateRule 操作时发生错误(PriorityInUse):当前正在使用优先级“1”
蒂亚!
解决方案
我对此的解决方案来自上面@jordanm 的想法。
基本上要创建 2 个功能:一个用于通过在添加新规则之前添加 +1 来重新索引规则优先级,这将自动在顶部结束。如果我要恢复到旧规则,我还有另一个函数可以通过减去 -1 来重新索引优先级规则。
def reindex_forward(elbv2_client, listener_rules):
for rule in reversed(listener_rules):
if rule['Priority'] != 'default':
new_priority = int(rule['Priority']) + 1
elbv2_client.set_rule_priorities(
RulePriorities=[
{
'RuleArn': rule['RuleArn'],
'Priority': new_priority
}
]
)
return
def reindex_back(elbv2_client, listener_rules):
for index, rule in enumerate(listener_rules, start=1):
if rule['Priority'] != 'default':
elbv2_client.set_rule_priorities(
RulePriorities=[
{
'RuleArn': rule['RuleArn'],
'Priority': index
}
]
)
else:
return
return
推荐阅读
- c++ - 尽管用户提供了扣除指南,但模板候选被忽略
- python-3.x - 如何使用 mypy 检查重载的单次调度
- visual-studio-code - 如何在 vscode 扩展中侦听调试适配器协议事件?
- reporting-services - 将 Dot Net 5 类库引用添加到 SSRS 报告中
- sql - 使用 CASE 语句进行 SQL DATE 转换/转换
- reactjs - Nextjs 动态函数导入(非组件)
- javascript - 如何将对象数组过滤到 MongoDB 文档中
- android - 来自CSV的字符串中的Android换行符
- javascript - 选择一个选项后,如何让我的 Popup 自动出现在 reactJS 中?Leaflet-js
- python-3.x - Dataframe中特定条件下如何将True和False替换为数值