#amazon-web-services #terraform #terraform-provider-aws #infrastructure-as-code
#amazon-веб-службы #terraform #terraform-поставщик -aws #инфраструктура как код
Вопрос:
Я использую Terraform с AWS в качестве поставщика.
В одной из моих сетей я случайно настроил неправильные значения, что привело к сбою в создании ресурсов.
Итак, ситуация заключалась в том, что некоторые части ресурсов были запущены, но я бы предпочел, чтобы весь процесс выполнялся как одна транзакция.
Я знаком с выводом, который выдает Terraform в таких случаях:
Terraform не выполняет автоматический откат при возникновении ошибок. Вместо этого ваш файл состояния Terraform был частично обновлен всеми ресурсами, которые успешно завершились. Пожалуйста, устраните приведенную выше ошибку и повторите процедуру для постепенного изменения вашей инфраструктуры.
Мой вопрос таков: Есть ли еще способ настроить политику отката в случаях, когда некоторые ресурсы были созданы, а некоторые завершились сбоем?
Ниже приведен простой пример воспроизведения проблемы.
В локальной переменной 'az_list'
просто измените значение с ‘names’ на ‘zone_ids’:
az_list = "${data.aws_availability_zones.available.zone_ids}"
И будет создан VPC с некоторыми группами безопасности по умолчанию и таблицами маршрутов, но без подсетей.
resources.tf:
provider "aws" {
region = "${var.region}"
}
### Local data ###
data "aws_availability_zones" "available" {}
locals {
#In order to reproduce an error: Change 'names' to 'zone_ids'
az_list = "${data.aws_availability_zones.available.names}"
}
### Vpc ###
resource "aws_vpc" "base_vpc" {
cidr_block = "${var.cidr}"
instance_tenancy = "default"
enable_dns_hostnames = "false"
enable_dns_support = "true"
}
### Subnets ###
resource "aws_subnet" "private" {
vpc_id = "${aws_vpc.base_vpc.id}"
cidr_block = "${cidrsubnet( var.cidr, 8, count.index 1 length(local.az_list) )}"
availability_zone = "${element(local.az_list, count.index)}"
count = 2
}
resource "aws_subnet" "public" {
vpc_id = "${aws_vpc.base_vpc.id}"
cidr_block = "${cidrsubnet(var.cidr, 8, count.index 1)}"
availability_zone = "${element(local.az_list, count.index)}"
count = 2
map_public_ip_on_launch = true
}
variables.tf:
variable "region" {
description = "Name of region"
default = "ap-south-1"
}
variable "cidr" {
description = "The CIDR block for the VPC"
default = "10.0.0.0/16"
}
Комментарии:
1. как указано в инструкции,
Terraform does not automatically rollback in the face of errors
. Вы можете только уничтожить весь стек или перейти к применению всего стека.2. Существует несколько способов устранения проблем с неправильными файлами tfstate с помощью
terraform state rm
, но для этого требуются некоторые ручные операции.3. Есть ли способ вывести код состояния в этих случаях (для отправки во внешний скрипт)?
4. Почему вы хотите выполнить откат, чтобы уничтожить VPC, вместо того чтобы просто исправить ошибку и затем применить только подсети? Частичное применение здесь кажется более полезным
5. В некоторых случаях будет полезно частичное применение, возможно, во многих случаях, но в некоторых процессах автоматизации я бы предпочел, чтобы все создание было откатано.