云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

数据库_手机登录服务器_返现

小七 141 0

地形形成云闪:寻求最佳设置

这是Dimitris Koutsourelis和Alexis Dimitriadis的一篇客座帖子,他们为Workable的安全团队工作,这家公司生产软件,帮助公司寻找和雇佣优秀人才人员。概述这篇文章是关于我们作为代码实践的基础设施的介绍性旅程;以声明性和版本控制的方式管理Cloudflare配置。我们想分享我们在这个过程中获得的经验;我们的痛点,我们面临的局限,我们采取的不同方法,并提供我们解决方案和实验的部分内容。地形世界Terraform是一个很好的工具,可以满足我们的需求,幸运的是,Cloudflare维护了自己的提供商,允许我们轻松地管理其服务配置。除此之外,Terragrunt是一个很薄的包装器,它提供了额外的命令和功能,用于保持Terraform配置保持干燥,并管理远程状态。两者的结合通过使用terraform和terragrun模块,为Cloudflare资源(配置)提供了一个更模块化和可重用的结构。我们选择使用这两个工具的最新版本(分别是Terraform-v0.12和Terragrunt-v0.19),并不断升级以利用有价值的新特性和功能,这些特性和功能在这个时间点上消除了重要的限制。可操作上下文我们的设置包括多个域,这些域分为两个不同的Cloudflare组织:生产和登台。我们的环境有其自己的目的和技术要求(即:QA、开发、沙盒和生产),这意味着Cloudflare区域配置的设置略有不同。我们的方法我们的主要目标是有一个模块化的设置,能够管理任何区域的任何配置,同时将代码重复性保持在最低限度。这比听起来更复杂;在开发期间,我们反复更改了Terraform文件夹结构和其他技术方面。下面几节将说明我们的路径中的一组备选方案,以及优缺点。结构Terraform配置基于项目的目录结构,因此这是开始的地方。我们决定将共享公共配置的区域分组到同一目录下,而不是保留Cloudflare的组织结构(生产和登台作为根级目录,包含属于每个组织的区域)。这有助于保持代码的干燥,并保持设置的一致性和可读性。另一方面,这种结构增加了额外的复杂性,因为需要有条件地处理两组不同的凭证,并且必须使用工作区管理和隔离两个状态文件(在环境/根级别)。除此之外,我们使用Terraform模块,将跨区域组的通用配置集保存在一个单独的位置。Terraform模块存储库模块/│–├—防火墙/│ ├── 主.tf│ ├── 变量.tf│–├—分区设置/│ ├── 主.tf│ ├── 变量.tf│ └── [...]└──Terragrunt模块库环境/│ ├── [...]│–├—开发/│–├—质量保证/│–├—演示/│–├—8区/(生产)│ └── 盐酸特拉格朗│–├—9区/(分段)│ └── 盐酸特拉格朗│ ├── 配置.tfvars│ ├── tf总管│ └── 变量.tf│ ├── 配置.tfvars│ ├── 机密.tfvars│ ├── 主.tf│ ├── 变量.tf│ └── 盐酸特拉格朗└──Terragrunt模块树提供了灵活性,因为我们能够在区域、组区域或组织级别(这与Cloudflare配置功能内联,即:也可以在组织级别配置自定义错误页面)应用配置。资源类型我们决定以不同的方式实现地形资源,以更有效地满足我们的需求。1静态资源首先想到的是用一个或多个.tf文件实现所有资源,并为每个属性分配硬编码值。它简单明了,但是如果它导致在环境之间复制/粘贴代码,则可能会有很高的维护成本。因此,公共设置似乎是一个很好的用例;我们选择相应地实现access_rules Terraform资源:模块/访问规则/主.tf资源"cloudflare_access_rule""no_17"{notes="这是一个描述"mode="黑名单"配置={target="ip"value="x.x.x.x"}}[...]2参数化资源我们的下一步是增加变量以获得灵活性。当共享资源配置的几个属性在多个区域之间存在差异时,这很有用。大多数配置都保持不变(如上所述),变量实例化被添加到Terraform模块中,而它们的值作为输入变量或在_u.tfvars_u文件中的条目通过Terragrunt模块输入。相应地实现了zone_settings_override资源:模块/区域设置/主.tf资源"cloudflare_zone_settings_override""zone_settings"{区域标识=变量区域标识设置{总是在线="开"始终使用_https="on"[...]浏览器检查=变量浏览器检查移动电话重定向{mobile_子域=var.mobile_重定向_子域状态=可变移动重定向状态条带uri=var.mobile_重定向_uri}[...]waf="开"webp="关"websockets="开"}}环境/qa/主.tf"区域设置"模块{源="git@github.com:foo/modules/zone_设置"区域名称=变量区域名称浏览器检查=变量区域设置浏览器检查[...]}环境/qa/配置.tfvars#区域设置zone_settings_browser_check="关"[...]}三。动态资源在这一点上,我们认为一个更有趣的方法是创建通用资源模板来在一个地方管理给定资源的所有实例。模板被实现为Terraform模块,并根据其输入动态创建每个资源:通过Terragrunt模块(在本例中为/environments)输入的数据,或tfvars文件中的条目。我们选择以这种方式实现account_member资源。模块/账户成员/变量.tf变量"用户"{description="用户映射-角色"类型=映射(列表(字符串))}变量"成员角色"{description="帐户角色ID"类型=映射(字符串)}模块/账户成员/主.tf资源"cloudflare_account_member""帐户_member"{对于每个=可变用户电子邮件地址=每个.keyrole_ids=[中的角色每个值:查找(可变成员角色,角色)]生命周期{防止破坏=真}}我们向模板提供用户列表(地图列表)。每个成员都被分配了许多角色。为了使代码更具可读性,我们将用户映射到角色名称而不是角色ID:环境/配置.tfvars成员角色={admin="000013091sds0193jdskd01d1dsdjhsd1"admin_ro="0000ds81hd131bdsjd813hh173hds8adh"analytics="0000hdsa8137djahd81y37318hshdsjhd"[...]super\u admin="00001534sd1a2123781j5gj18gj511321"}用户={"user1@workable.com"=超级管理员"]"user2@workable.com"=分析","审核日志","缓存清除","cf工作人员"]"user3@workable.com"=cf_stream"][...]"robot1@workable.com"=cf_stream"]}我们处理的另一个有趣的例子是rate\u limit resource;变量声明(对象列表)和实现如下所示:模块/速率限制/变量.tf可变"速率限制"{description="费率限制列表"默认值=[]类型=列表(对象({禁用=布尔,阈值=数字,description=字符串,句点=数字,匹配=对象({请求=对象({url_pattern=map(字符串),方案=列表(字符串),方法=列表(字符串)}),响应=对象({状态=列表(编号),源站流量=bool})}),动作=对象({模式=字符串,超时=数字})}))}模块/速率限制/主.tf当地人{[…]}数据"cloudflare_zones""区域"{过滤器{名称=变量区域名称status="活动"暂停=假}}资源"cloudflare_rate_limit""速率_limit"{计数=长度(可变利率限额)zone_id=查找(data.cloudflare_区.区域。区域[0],"id")禁用=可变利率限额[计数.索引].残废阈值=可变利率限额[计数.索引].阈值说明=可变利率限额[计数.索引].说明期间=可变利率限额[计数.索引].期间匹配{请求{url_模式=local.url_模式[计数.索引]方案=可变利率限额[计数.索引].match.request.schemes方法=可变利率限额[计数.索引].match.request.methods}回应{状态=可变利率限额[计数.索引].匹配响应状态起点流量=可变利率限额[计数.索引].match.response.origin_流量}}行动{模式=可变利率限额[计数.索引].动作模式超时=可变利率限额[计数.索引].动作.超时}}环境/质量保证/费率_限制.tfvars普通费率限制=[{#1禁用=假阈值=50description="样本说明"周期=60匹配={请求={url_模式={"子域"="foo""路径"="/api/v1/bar"}方案=["全部",]方法=["GET","POST",]}响应={状态=[]源站流量=真}}操作={mode="模拟"超时=3600}},[...]}]这种方法的最大优点是,所有常用的速率限制规则都在一个地方,每个环境中