使用AWS Go SDK向托管前缀列表添加CIDRs时遇重复API错误
问题描述
AWS账户中存在一个全新的空Managed Prefix List,尝试通过Go语言结合AWS Go SDK编写的服务批量加载CIDR列表时,当传入的cidrs []domain.Cidr包含多个元素,触发以下错误:
CIDR (99.79.87.237/32) is a duplicate.
对应的核心代码如下:
func (a AWSPrefixListRepository) AddCidrs(cidrs []domain.Cidr, resource string, currentVersion int64) error { svc := ec2.New(a.sess) _, err := svc.ModifyManagedPrefixList(&ec2.ModifyManagedPrefixListInput{ CurrentVersion: ¤tVersion, PrefixListId: &resource, AddEntries: a.buildAddEntries(cidrs), }) if err != nil { return err } return nil } func (a AWSPrefixListRepository) buildAddEntries(cidrs []domain.Cidr) []*ec2.AddPrefixListEntry { var addEntries []*ec2.AddPrefixListEntry for _, cidr := range cidrs { addEntries = append(addEntries, &ec2.AddPrefixListEntry{ Cidr: &cidr.PrefixIpv4, Description: &cidr.Description, }) } return addEntries }
问题分析与解决方法
问题根源
AWS的ModifyManagedPrefixList API不允许在AddEntries参数中传入重复的CIDR条目——哪怕目标Prefix List本身是空的,只要请求体里存在重复CIDR,就会触发该报错。大概率是传入的cidrs数组内部包含重复的99.79.87.237/32条目。
解决步骤
在构建AddEntries之前对CIDR列表做去重处理,基于CIDR的IP前缀字段(PrefixIpv4)去重,同一个CIDR无论描述是否相同,都不能重复添加。
修改后的代码示例
调整buildAddEntries函数,添加去重逻辑:
func (a AWSPrefixListRepository) buildAddEntries(cidrs []domain.Cidr) []*ec2.AddPrefixListEntry { var addEntries []*ec2.AddPrefixListEntry // 用map记录已处理过的CIDR,实现去重 seenCidrs := make(map[string]struct{}) for _, cidr := range cidrs { // 如果该CIDR已经处理过,跳过 if _, exists := seenCidrs[cidr.PrefixIpv4]; exists { continue } seenCidrs[cidr.PrefixIpv4] = struct{}{} addEntries = append(addEntries, &ec2.AddPrefixListEntry{ Cidr: &cidr.PrefixIpv4, Description: &cidr.Description, }) } return addEntries }
额外建议
可以在调用AddCidrs方法的业务层提前做去重校验,提前拦截重复数据,减少无效的AWS API调用,同时可以在日志中记录被跳过的重复CIDR,方便排查数据来源问题。
内容的提问来源于stack exchange,提问作者Victor Hugo Montes
相关产品推荐
相关产品推荐

