Как реализовать сине-зеленые развертывания в AWS с Terraform без потери емкости

Я видел несколько статей, в которых обсуждались сине-зеленые развертывания, и они постоянно включают принудительное воссоздание конфигурации запуска и группы автоматического масштабирования. Например:

https://groups.google.com/forum/

В целом это прекрасно работает, за исключением того, что требуемая емкость ASG сбрасывается до значения по умолчанию. Так что, если мой кластер находится под нагрузкой, то произойдет внезапное падение емкости.

У меня такой вопрос: есть ли способ выполнить развертывание Terraform сине-зеленого без потери емкости?

2 ответа

У меня нет полного решения только для терраформ.

Подход, который у меня есть, заключается в том, чтобы запустить небольшой скрипт, чтобы получить текущую желаемую емкость, установить переменную и затем использовать эту переменную в 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 в качестве выходных данных из удаленного состояния, которое я затем могу использовать при следующем запуске, чтобы получить желаемую емкость, но я изо всех сил пытаюсь понять это достаточно, чтобы сделать его полезным.

В качестве второго ответа я завернул 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дает текущую желаемую мощность ASG, которую вы указали в файле aws_cli_query.

Опять же, это довольно уродливо, но формализация этого означает, что теперь вы можете получить доступ к МНОЖЕСТВУ свойств из AWS, которые еще не доступны в Terraform.

Это нежный взлом. Никакие ресурсы не передаются, и он был написан исключительно для чтения только для одиночных скалярных значений, поэтому, пожалуйста, используйте его с осторожностью.

Как автор, я был бы рад объяснить что-нибудь об этом на странице GitHub Issues по адресу https://github.com/digitickets/terraform-aws-cli/issues .

Другие вопросы по тегам