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

云服务器_dns解析服务器_9元

小七 141 0

功能切换、蓝绿色部署和Terraform的金丝雀测试

在对Terraform管理的基础设施进行更改时,我们希望评估、测试并适当地限制它们对生产的影响。在这篇文章中,我们演示了一些特性切换、蓝绿部署和地形资源的金丝雀测试的方法,以减轻对生产基础设施的影响。这些方法的应用因基础设施资源及其上游依赖关系而异。例如,网络更改对于承载在网络上的应用程序特别具有破坏性,通常需要将功能切换和蓝绿色部署结合起来。这使我们能够在生产环境中测试对基础设施的更改,而无需在登台环境中完全重新创建系统。»功能切换功能切换或功能标志通过二进制操作激活系统功能。在软件开发的情况下,我们使用特性切换来为用户打开或关闭特性,以便在生产中测试功能。类似地,基础设施功能切换可用于部署独立的基础设施,以支持上游依赖关系。当我们没有足够的资源来复制生产系统时,我们可以使用特性切换来隔离和测试基础设施资源,然后再将其发布使用。在Terraform中,我们可以用条件表达式创建一个功能切换。通过向资源添加count meta参数,我们可以切换特定资源的创建。变量"enable_new_ami"{默认设置为false类型=布尔}资源"aws_instance""示例"{实例_type="t2.micro"ami=数据.aws_ami.ubuntu.id版vpc_security_group_ids=[aws_安全性_组.instances.id]子网_id=aws_subnet.public.id标记={有开关=变量启用新的ami}}资源"aws_instance""example_bionic"{计数=变量启用新的ami? 1:0实例_type="t2.micro"ami=数据.aws_ami.乌班图_仿生.idvpc_security_group_ids=[aws_安全性_组.instances.id]子网_id=aws_subnet.public.id标记={有开关=变量启用新的ami}}只有在以下情况下才会创建虚拟机:变量启用新的ami设置为true。切换可以促进蓝绿部署方法,即在完全更改为最新资源之前并行运行两个资源。如果就地升级的影响足够小,我们可以切换资源(如虚拟机映像)上的参数。变量"enable_new_ami"{默认设置为false类型=布尔}资源"aws_instance""示例"{实例_type="t2.micro"ami=变量启用新的ami? 数据.aws_ami.乌班图_仿生.id: 数据.aws_ami.ubuntu.id版vpc_security_group_ids=[aws_安全性_组.实例.0.id]子网_id=aws_子网.public.0.id标记={有开关=变量启用新的ami}}在这两个用例中,我们确保切换默认为false,直到我们想测试和使用资源为止。我们还包括一个标记,用于标识资源是否有一个开关,以便在以后确定删除,从而防止技术债务的累积。»蓝绿部署对于大多数基础设施更改,我们希望通过创建一个具有新配置的重复资源集来降低更改的风险,以便在生产中进行初始测试。我们可以将这种称为蓝绿部署的技术应用于各种资源,包括网络、虚拟机,甚至帐户凭据。我们经常把现有的基础设施资源称为"蓝色",将新的基础设施资源称为"绿色"。在我们释放"绿色"资源之前,我们希望确保系统作为一个整体工作。例如,我们有一个应用程序链接到一个负载平衡器和一个DNS条目。我们可以在应用程序测试输入.生产。资源"aws_instance""应用程序"{实例_type="t2.micro"阿美=数据.aws_ami.nginx.idvpc_security_group_ids=[aws_安全性_组.实例.0.id]子网_id=aws_子网.public.0.id标记={名称="${变量前缀}-应用程序"}}资源"aws_elb""应用程序"{名称="${变量前缀}-elb"号子网=[aws_子网.public.0.id]倾听者{实例端口=80instance_protocol="http"lb_端口=80lb_protocol="http"}健康检查{健康阈值=2不健康阈值=2超时=3目标="HTTP:80/"间隔=30}实例=[aws_实例.application.id]}资源"aws_route53_record""应用程序"{区域_id=aws_route53_zone.private.zone_标识name="应用程序${aws_route53_专区.private.name}"类型="A"别名{名称=aws_elb.application.dns_名称区域_id=aws_elb.application.zone_标识evaluate_target_health=真}加权路由策略{重量=10}set_identifier="蓝色"}假设我们有一个新版本的应用程序。我们要确保新版本在发布给用户之前能够正常工作。我们使用新的应用程序版本创建一个"绿色"的基础设施集以进行测试。变量"enable_green_application"{默认设置为false类型=布尔}资源"aws_instance""应用程序""绿色"{计数=var.enable_green_应用程序? 1:0实例_type="t2.micro"ami=数据.aws_ami.nginx公司_绿色.idvpc_security_group_ids=aws_安全性_组.实例.*.id号子网_id=aws_子网.public.0.id标记={有开关=var.enable_green_应用程序}}资源"aws_elb""应用程序""绿色"{计数=var.enable_green_应用程序? 1:0名称="${变量前缀}-绿色elb"子网=aws_子网.public.*.id号倾听者{实例端口=80instance_protocol="http"lb_端口=80lb_protocol="http"}健康检查{健康阈值=22 U阈值=不健康超时=3目标="HTTP:80/"间隔=30}实例=aws_instance.application_绿色.*.id号标记={有开关=var.enable_green_应用程序}}资源"aws_route53_record""应用程序""绿色"{计数=var.enable_green_应用程序? 1:0区域_id=aws_route53_zone.private.zone_标识name="应用程序${aws_route53_专区.private.name}"类型="A"别名{名称=aws_elb.应用-绿色.0.dns_名称区域_id=aws_elb.应用-绿色.0.区域标识evaluate_target_health=真}加权路由策略{权重=0}set_identifier="绿色"}当我们在Terraform配置中插入一组绿色的基础设施时,我们希望确保现有的"蓝色"基础设施不会发生任何变化。使用功能切换,我们可以禁用"绿色"基础设施,直到我们准备好进行测试。因此,terraform plan的输出显示基础设施是最新的。>地形图正在刷新计划前内存中的地形状态。。。...没有变化。基础设施是最新的。这意味着Terraform没有检测到配置和实际存在的物理资源。因此,没有需要采取行动。当我们打开新的应用程序时,terraform plan的输出会添加新的"绿色"资源。>地形平面图-var=enable_green_application=true…Terraform将执行以下操作:#美国焊接学会_elb.应用-绿色将创建[0]…计划:3添加,0更改,0销毁。...在这个例子中,我们更新DNS记录的权重,以便逐步将流量路由到"绿色"资源。当100%的流量通过新的基础设施资源时,我们可以从Terraform配置中删除"蓝色"基础设施,并消除功能切换。资源"aws_instance""应用程序""绿色"{实例_type="t2.micro"ami=数据.aws_ami.nginx公司_绿色.idvpc_security_group_ids=aws_安全性_组.实例.*.id号子网_id=aws_子网.public.0.id标记={有开关=var.enable_green_应用程序}}Terraform将自动将资源的上一个索引与处于状态的单个资源对齐。因此,资源本身不会改变。因为我们删除了切换,所以虚拟机的标记将在不影响虚拟机的情况下进行适当的更新。>地形图...#美国焊接学会_instance.application_绿色将更新到位~resource"aws_instance""应用程序\u绿色"{##为清楚起见省略~标签={~"Has\u Toggle"="真"->"假"}...计划:0添加,2更改,3销毁在保留资源名称时,不需要将现有资源重新导入新名称。通过删除"蓝色"基础设施配置,Terraform注意到"蓝色"资源将被销毁。在应用程序的下一次更新中,我们可以将应用程序命名为aws_instance.application_蓝色重复我们建立的模式。»金丝雀测试为了确定我们是否可以使用新的基础设施资源,我们执行一个canary测试来快速确认正确的配置。我们通常将此应用于蓝绿色部署,以在向新资源增加流量之前进行确认。在联网的情况下,我们可能需要一个canary测试来检查配置了Terraform的网络对等和路由。对网络的更改可能会影响路由配置、安全组和应用程序。为了确保我们的新子网具有正确的路由和配置,我们部署了一个虚拟机作为"金丝雀"实例。资源"aws_instance""canary"{计数=变量启用新网络? 1:0实例_type="t2.micro"ami=数据.aws_ami.ubuntu.id版vpc_security_group_ids=[aws_安全性_组.实例[1] .id]子网_id=aws_子网.public[1] .id号标记={名称="${变量前缀}-金丝雀"}}我们可以用这个