我已经看过多篇讨论蓝/绿部署的文章,他们一直都在强制重新启动Launch Configuration和Autoscaling Group。例如:
https://groups.google.com/forum/#!msg/terraform-tool/7Gdhv1OAc80/iNQ93riiLwAJ
除了ASG的所需容量重置为默认值之外,这通常很有用。因此,如果我的集群处于负载状态,那么容量将会突然下降。
我的问题是:有没有办法在不丢失容量的情况下执行Terraform蓝/绿部署?
答案 0 :(得分:1)
我对此没有完整的纯地形解决方案。
我的方法是运行一个小的脚本以获取当前所需的容量,设置一个变量,然后在asg中使用该变量。
handle-desired-capacity:
@echo "Handling current desired capacity"
@echo "---------------------------------"
@if [ "$(env)" == "" ]; then \
echo "Cannot continue without an environment"; \
exit -1; \
fi
$(eval DESIRED_CAPACITY := $(shell aws autoscaling describe-auto-scaling-groups --profile $(env) | jq -SMc '.AutoScalingGroups[] | select((.Tags[]|select(.Key=="Name")|.Value) | match("prod-asg-app")).DesiredCapacity'))
@if [ "$(DESIRED_CAPACITY)" == '' ]; then \
echo Could not determine desired capacity.; \
exit -1; \
fi
@if [ "$(DESIRED_CAPACITY)" -lt 2 -o "$(DESIRED_CAPACITY)" -gt 10 ]; then \
echo Can only deploy between 2 and 10 instances.; \
exit -1; \
fi
@echo "Desired Capacity is $(DESIRED_CAPACITY)"
@sed -i.bak 's!desired_capacity = [0-9]*!desired_capacity = $(DESIRED_CAPACITY)!g' $(env)/terraform.tfvars
@rm -f $(env)/terraform.tfvars.bak
@echo ""
很显然,这虽然很难看,但确实可以做到。
我正在寻找是否可以从远程状态获得ASG的名称作为输出,然后可以在下一次运行中使用它来获得所需的容量,但是我仍在努力地理解这一点,以使它很有用。
答案 1 :(得分:0)
作为第二个答案,我将 AWSCLI + jq 封装到 Terraform 模块中。
https://registry.terraform.io/modules/digitickets/cli/aws/latest
module "current_desired_capacity" {
source = "digitickets/cli/aws"
assume_role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/OrganizationAccountAccessRole"
role_session_name = "GettingDesiredCapacityFor${var.environment}"
aws_cli_commands = ["autoscaling", "describe-auto-scaling-groups"]
aws_cli_query = "AutoScalingGroups[?Tags[?Key==`Name`]|[?Value==`digitickets-${var.environment}-asg-app`]]|[0].DesiredCapacity"
}
和
module.current_desired_capacity.result
为您提供您在 aws_cli_query 中指定的 ASG 当前所需的容量。
再说一次,这很丑陋,但这种形式化意味着您现在可以从 AWS 访问大量尚未在 Terraform 中可用的属性。
这是一个温和的黑客。没有传递任何资源,而且它是纯粹针对单个标量值以只读方式编写的,因此请谨慎使用。
作为作者,我很乐意通过位于 https://github.com/digitickets/terraform-aws-cli/issues
的 GitHub 问题页面对此进行解释