首页 > 解决方案 > 如果第一个规则优先级已使用 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”

蒂亚!

标签: pythonamazon-web-servicesboto3

解决方案


我对此的解决方案来自上面@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


推荐阅读