如何通过CloudFormation免硬编码添加Cloudflare IP至AWS安全组
CloudFormation 免硬编码配置Cloudflare IP安全组方案
完全不需要在CloudFormation脚本里逐一硬编码Cloudflare的IP条目,下面两种方案都可以实现自动配置,后续维护成本极低:
- 方案1:自定义资源+模板内置循环自动拉取IP生成规则
在CloudFormation模板里定义一个Lambda-backed自定义资源,部署栈的时候会自动触发Lambda请求Cloudflare公开的IPv4地址列表接口,拿到全量IP段后通过Fn::ForEach循环语法批量生成安全组入站规则,全程不需要手动录入任何IP。
Lambda核心逻辑参考:
模板里拿到自定义资源返回的IP列表后,直接遍历给安全组加80/443端口的放行规则即可,每次更新栈都会自动拉取最新的IP段,不需要人工修改模板。import urllib3 import cfnresponse def lambda_handler(event, context): try: http = urllib3.PoolManager() # 拉取Cloudflare官方公开的IPv4列表 resp = http.request('GET', 'https://www.cloudflare.com/ips-v4') ip_ranges = [cidr.strip() for cidr in resp.data.decode('utf-8').split('\n') if cidr.strip()] cfnresponse.send(event, context, cfnresponse.SUCCESS, {'CloudflareIpv4Cidrs': ip_ranges}) except Exception as err: cfnresponse.send(event, context, cfnresponse.FAILED, {'Error': str(err)}) - 方案2:托管前缀列表引用(更推荐)
自己在账号下创建一个客户管理的前缀列表,配一个每周触发的EventBridge定时任务,自动跑Lambda拉取最新的Cloudflare IP段更新前缀列表条目。安全组规则里直接引用这个前缀列表作为源地址,只需要写1条规则就能放行所有Cloudflare IP。
这个方案比批量生成规则更简洁:前缀列表单条目最多支持1000个CIDR,完全能容纳Cloudflare全量IP段,后续IP更新时只需要同步前缀列表,所有关联这个前缀列表的安全组会自动生效,不需要重新部署CloudFormation栈。之前社区里用AWS CLI实现的同类需求,本质也是走的自动更新前缀列表的逻辑。
注意:Cloudflare会不定期调整公网IP段,不管选哪种方案,都要配置定时自动刷新机制,不要一次性把IP写死,否则后续IP变更后很容易出现访问不通的问题。
内容的提问来源于stack exchange,提问作者Saif
相关产品推荐
相关产品推荐

