对于某些关键的服务而言,更新和升级时,通常会采用不宕机的部署方式。
在变更的过程中不停机,这种部署方式可以将风险降到最低,使用户得到无感知的升级体验。然而在默认情况下,Terraform 按照先销毁后创建的执行顺序部署,很难使服务不受到影响,可以通过控制 Terraform 执行的顺序在销毁之前先执行创建。可以实现不宕机的目的。
生命周期控制
通过对 lifecycle 可以对资源的生命周期进行控制,从而改变 terraform 的默认行为。
lifecycle { 服务器托管网
create_before_destroy = true
}
- create_before_destroy = true 表示先启动要替换基础设施资源,再销毁原来的基础资源对象。
- prevent_destroy = true 阻止 terraform 销毁基础设施资源
- ignore_changes = [ ] 设置特定的属性,terraform 忽略更新相关的资源对象
部署基础设施示例代码
为了实现 terraform 实现零宕机部署,我们为 ec2 实例绑定一个弹性IP地址,即便旧的 ec2 实例被销毁,仍然可以通过弹性IP地址访问新建的 ec2 实例。
main代码
# 基础服务器模块
data "aws_security_groups" "default" {
filter {
name = "group-name"
values = [ "default" ]
}
}
# 创建 ec2
resource "aws_instance" "server" {
ami = lookup(var.amis, var.region)
instance_type = var.instance_type
key_name = var.ssh_key_name
user_data = var.server_script
tags = {
Name = "${var.server_name}"
}
lifecyc服务器托管网le { // 生命周期进行控制
create_before_destroy = true // true 表示先启动要替换基础设施资源,再销毁原来的基础资源对象。
}
}
# 开放其他端口
resource "aws_security_group_rule" "other" {
type = "ingress"
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = [ "0.0.0.0/0" ]
security_group_id = data.aws_security_groups.default.ids[0]
}
# 绑定弹性IP地址
resource "aws_eip" "lb" {
instance = aws_instance.server.id // 用来关联 ec2 实例
vpc = true // 告诉 ec2 在 vpc(虚拟网络)中。
}
outputs 代码
定义了 dns 的输出变量,便于获取 弹性IP的域名信息。
output "ip" {
value = module.nginx-server.ip // 这里引用模块的输出
description = "nginx web server ip address"
}
output "dns" {
value = module.nginx-server.dns
description = "aws eip dns"
}
部署代码
terraform apply
...
Changes to Outputs:
ip = "44.231.54.206"
dns = "ec2-44-231-54-206.us-west-2.compute.amazonaws.com"
修改信息,重新部署
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 【C++】特殊类前言一、设计一个类,不能被拷贝 二、设计一个类,只能在堆上创建对象三、设计一个类,只能在栈上创建对象四、设计一个类,不能被继承 五、设计一个类,只能创建一个对象(单例模式)
目录 前言 一、设计一个类,不能被拷贝 C++98方法 C++11方法 二、设计一个类,只能在堆上创建对象 方法一 方法二 三、设计一个类,只能在栈上创建对象 方法一 方法二 四、设计一个类,不能被继承 C++98方式 C++11方法 五、设计一个类,只能创建…