我遇到了Terraform EKS标记的问题,似乎找不到可行的解决方案来在创建新集群时标记所有VPC子网。
提供一些背景信息:我们有一个AWS VPC,我们在子网中部署了几个EKS集群。我们不创建私有网络,或者子网是EKS集群创建的一部分。因此,创建集群的terraform代码无法标记现有子网和VPC。虽然EKS会添加所需的标记,但下次我们在VPC上运行terraform apply时会自动删除这些标记。
我尝试的解决方法是在VPC中提供一个terraform.tfvars文件,如下所示:
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}
)
}"
}然而,上述方法似乎不起作用。我尝试过https://www.terraform.io/docs/configuration-0-11/interpolation.html中的各种Terraform0.11函数,但都没有帮助。
有没有人能解决这个问题?
我们总是为每个EKS集群创建新的私有网络和子网的想法是错误的。显然,必须是一种使用Terraform标记现有VPC和子网资源的方法?
发布于 2020-11-21 09:05:43
您现在可以使用 aws 提供程序 ignore_tags 属性,以便在下次应用 VPC 模块时不会删除使用 aws_ec2_tag 资源制作的标签。
例如,提供程序变为:
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/"]
}
}然后,您可以像这样在您的EKS模块中利用aws_ec2_tag资源,而不必担心下次应用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"
}发布于 2019-08-15 03:28:21
当有两段不同状态文件的代码试图作用于同一资源时,这个问题总是存在的。
解决此问题的一种方法是在每次应用EKS terraform代码时将VPC资源重新导入到VPC状态文件中。这也会导入你的标签。子网也是如此,但从长远来看,这是一个手动且乏味的过程。
terraform import aws_vpc.test_vpc vpc-a01106c2
参考:https://www.terraform.io/docs/providers/aws/r/vpc.html
干杯!
发布于 2020-07-27 14:39:10
在我们的示例中,我们使用单独的脚本来调配VPC和网络资源,而不是添加特定于EKS的标签。
对于EKS集群配置,我们有单独的脚本,可以在集群上自动更新/添加标签。
因此,对于provider.tf文件中的VPC脚本,我们添加了以下条件,这样脚本就不会删除这些标记,一切都会正常工作。
provider "aws" {
region = "us-east-1"
ignore_tags {
key_prefixes = ["kubernetes.io/cluster/"]
}
}https://stackoverflow.com/questions/57495581
复制相似问题