Terraform EKS маркировка

У меня возникла проблема с маркировкой Terraform EKS, и я, похоже, не нашел работоспособного решения для маркировки всех подсетей VPC при создании нового кластера.

Чтобы обеспечить некоторый контекст: у нас есть один AWS VPC, где мы внедряем несколько кластеров EKS в подсети. Мы не создаем VPC или подсети являются частью создания кластера EKS. Поэтому код terraform, создающий кластер, не может пометить существующие подсети и VPC. Хотя EKS добавит необходимые теги, они будут автоматически удалены при следующем запуске terraform apply на VPC.

Моя попытка обойти это - предоставить файл terraform.tfvars в VPC следующим образом:

eks_tags = 
 [
 "kubernetes.io/cluster/${var.cluster-1}", "shared", 
 "kubernetes.io/cluster/${var.cluster-2}", "shared",
 "kubernetes.io/cluster/${var.cluster-2}", "shared",
]    

Затем внутри ресурсов VPC и подсетей мы делаем что-то вроде

    resource "aws_vpc" "demo" {
      cidr_block = "10.0.0.0/16"

      tags = "${
        map(
         ${var.eks_tags}
        )
     }"
    }

Тем не менее, выше, похоже, не работает. Я пробовал различные функции Terraform 0.11 из https://www.terraform.io/docs/configuration-0-11/interpolation.html но не из них помогу.

Кто-нибудь может решить эту проблему?

Идея, что мы всегда создаем новый VPC и подсеть для каждого кластера EKS, ошибочна. Очевидно, что должен быть способ пометить существующие ресурсы VPC и подсети с помощью Terraform?

1 ответ

Теперь вы можете использовать поставщика aws ignore_tags атрибут, чтобы теги, созданные с aws_ec2_tag ресурс не удаляется при следующем применении модуля VPC.

Например, провайдер становится:

provider "aws" {
  profile = "terraform"
  region  = "us-west-1"
  
  // This is necessary so that tags required for eks can be applied to the vpc without changes to the vpc wiping them out.
  // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/resource-tagging
  ignore_tags {
    key_prefixes = ["kubernetes.io/"]
  }
}

Добавьте, затем вы можете использовать aws_ec2_tag ресурс в вашем модуле EKS, не беспокоясь о том, что тег будет удален при следующем применении модуля VPC.

/*
  Start of resource tagging logic to update the provided vpc and its subnets with the necessary tags for eks to work
  The toset() function is actually multiplexing the resource block, one for every item in the set. It is what allows 
  for setting a tag on each of the subnets in the vpc.
*/
resource "aws_ec2_tag" "vpc_tag" {
  resource_id = data.terraform_remote_state.vpc.outputs.vpc_id
  key         = "kubernetes.io/cluster/${var.cluster_name}"
  value       = "shared"
}

resource "aws_ec2_tag" "private_subnet_tag" {
  for_each    = toset(data.terraform_remote_state.vpc.outputs.private_subnets)
  resource_id = each.value
  key         = "kubernetes.io/role/elb"
  value       = "1"
}

resource "aws_ec2_tag" "private_subnet_cluster_tag" {
  for_each    = toset(data.terraform_remote_state.vpc.outputs.private_subnets)
  resource_id = each.value
  key         = "kubernetes.io/cluster/${var.cluster_name}"
  value       = "shared"
}

resource "aws_ec2_tag" "public_subnet_tag" {
  for_each    = toset(data.terraform_remote_state.vpc.outputs.public_subnets)
  resource_id = each.value
  key         = "kubernetes.io/role/elb"
  value       = "1"
}

resource "aws_ec2_tag" "public_subnet_cluster_tag" {
  for_each    = toset(data.terraform_remote_state.vpc.outputs.public_subnets)
  resource_id = each.value
  key         = "kubernetes.io/cluster/${var.cluster_name}"
  value       = "shared"
}

В нашем случае у нас есть отдельные сценарии для предоставления VPC и сетевых ресурсов, мы не добавляем специальные теги EKS.

Для подготовки кластера EKS у нас есть отдельные сценарии, которые будут автоматически обновлять / добавлять теги в кластер.

Поэтому для сценариев VPC в файле provider.tf мы добавляем условие ниже, чтобы сценарии не удаляли эти теги и все работало правильно.

provider "aws" {
region = "us-east-1"
 ignore_tags {
    key_prefixes = ["kubernetes.io/cluster/"]
  }
}

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

Одним из способов решения этой проблемы является повторный импорт ресурса VPC в файл состояния VPC каждый раз, когда вы применяете свой код terraform EKS. Это также импортирует ваши теги. То же самое касается подсетей, но в конечном итоге это ручной и утомительный процесс.

terraform import aws_vpc.test_vpc vpc-a01106c2

Ссылка: https://www.terraform.io/docs/providers/aws/r/vpc.html

Ура!

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