Terraform EKS 标记

2023-11-25

我遇到了 Terraform EKS 标记问题,并且似乎没有找到可行的解决方案来在创建新集群时标记所有 VPC 子网。

提供一些背景信息:我们有一个 AWS VPC,在其中将多个 EKS 集群部署到子网中。我们不会在 EKS 集群创建过程中创建 VPC 或子网。因此,创建集群的 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}
        )
     }"
    }

然而,上面的方法似乎不起作用。我尝试过各种 Terraform 0.11 功能https://www.terraform.io/docs/configuration-0-11/interpolation.html但他们都没有帮助。

有人能够解决这个问题吗?

我们总是为每个 EKS 集群创建新的 VPC 和子网的想法是错误的。显然,必须有一种使用 Terraform 标记现有 VPC 和子网资源的方法?


您现在可以使用 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_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_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"
}

/**
  These tags have been decoupled from the eks module and moved to the more appropirate vpc module.
*/
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/internal-elb"
  value       = "1"
}

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"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Terraform EKS 标记 的相关文章

随机推荐

  • unittest.py 与trace.py 不能很好地配合 - 为什么?

    哇 今晚我发现 Python 单元测试是使用unittest模块不能很好地进行覆盖率分析trace模块 这是最简单的单元测试 在foobar py import unittest class Tester unittest TestCase
  • 初始化空ByteArray

    如何在 Kotlin 中初始化一个空的 ByteArray 每当我尝试这样做时 val asdfasdf ByteArray 当我稍后尝试使用 asdfasdf 时 我被告知需要初始化它 mVisualizer getWaveForm as
  • 我可以使用什么工具在浏览器中测试 :contains() CSS3 伪类?

    我正在尝试开发与 Selenium 一起使用的 CSS 选择器 我特别想使用伪类 contains 尽管 W3 有一个带有 contains 的 CSS3 草案 但最终版本似乎并未包含它 我正在使用 Chrome 的工具来帮助我检查 CSS
  • 使用 PyGtk 时 GUI 未从另一个线程更新

    我正在使用 PyGTK 构建 GUI 应用程序 我想从另一个线程更新 textview 小部件 但每次我尝试更新时该小部件都没有更新 我应该怎么做才能获得可靠的 GUI 更新 GTK 不是线程安全的 因此您不应简单地从其他线程调用 GUI
  • 在 Android Activity 中打开网页时出现 net::ERR_ACCESS_DENIED Android 错误 [重复]

    这个问题在这里已经有答案了 打开 Android 活动时 Android 网页显示 net ERR ACCESS DENIED 嵌入网页标签 我尝试在 Android Manifest 中提供权限
  • 如何在同一个shell中执行bash脚本

    我有一个 bash 脚本 它调用三个不同的命令 并且执行必须在一个 shell 中进行 我通过在每个命令后添加 来得到它 如下所示 CMD1 CMD2 CMD3 现在我需要的是 假设我在 MAC 机器上打开一个终端 所有命令都应该在打开的
  • 如何强制 go mod 接受声明其路径与其 go.mod 不同的模块?

    当我跑步时go mod tidy 它破坏了 因为我的项目导入的包使用路径导入了另一个包github com coreos bbolt 但是当它从此路径获取包时go mod说它的路径是go etcd io bbolt 问题是导入包和导入包都是
  • 如何以编程方式读取 MSI 文件内的属性?

    有没有办法读取里面的属性MSI file 例如 给定一个名为测试包 msi 我需要找到 productName PackageCode version 我将把它与 WMI 卸载一起使用 string objPath string Forma
  • 为什么在放弃泛型运算符时无法推断类型[重复]

    这个问题在这里已经有答案了 我读到 从 Java 7 开始 像第一个语句一样在右侧指定类型来创建集合是不好的风格 因为编译器可以从左侧推断类型 List
  • 方形拼图解决方案

    Question given an integer number n print the numbers from 1 up to n2 like this n 4 结果是 01 02 03 04 12 13 14 05 11 16 15
  • 函数调用中的 C++ 临时对象生命周期

    当我们通过原始指针或引用将临时智能指针管理的对象传递给函数时 标准是否保证该对象的生存期将延长到函数的生存期 include
  • JQuery JEditable - 如何禁用点击编辑

    我想知道您是否可以停止点击时编辑文本 我有一个单独的编辑按钮来使文本可编辑 这是我希望用户能够编辑文本的唯一方法 因此想要关闭单击编辑吗 有任何想法吗 布里特是对的 添加一个自定义事件 然后用按钮触发它 这是一些代码来解释它 自定义事件 i
  • 使用 N-API 将数据流式传输到 Node.js C++ 插件

    我正在为 NodeJS 构建一个 C 插件 我想将数据从 C 异步流式传输到 Node 我找到了这篇文章 https nodeaddons com streaming data into a node js c addon 然而 我想使用
  • Django:HttpResponseRedirect 不起作用

    我是 Python Django 和整体编程的新手 我需要有关 HttpResponseRedirect 的帮助 因为它在我的登录视图中不起作用 它确实可以在我的主视图文件中工作 但不是我想要的方式 我没有重定向到所需的页面 而是只在同一页
  • 如何在API平台上保存与实体的嵌套关系

    我有两个实体 Question and 选择其中 Question 与 Alternative 有 OneToMany 关系 我正在尝试发送带有嵌套文档的 JSON选择通过 POST 到QuestionAPI 平台 API 平台返回以下错误
  • 如何在 Dart 中逐行读取文件

    这个问题是一个问题的延续上一个问题 我编写了以下代码来确定是否File openRead 创建了一个可以逐行流式传输的 Stream 事实证明答案是否定的 读取整个文件 然后传递到下一个转换 我的问题是 如何在 Dart 中逐行流式传输文件
  • 如何在不复制数据的情况下连接 pandas DataFrame?

    我想连接两个 pandas DataFrame 而不复制数据 也就是说 我希望连接的 DataFrame 成为两个原始 DataFrame 中数据的视图 我尝试使用 concat 但不起作用 此代码块显示更改基础数据会影响连接的两个 Dat
  • 从 SQLite3 导出数据

    我需要一种简单的方法从包含多个表的 SQLite 数据库中导出数据 然后将它们导入到另一个数据库中 这是我的场景 我有 5 个表 A B C D E 每个表都有一个主键作为第一列 称为 ID 我想要一个 Unix 命令 它仅以可以导入到另一
  • 如何反序列化 Kubernetes YAML 文件

    如何将 Kubernetes YAML 文件反序列化为 Go 结构 我查看了kubectl代码 但不知何故 每个 YAML 文件都会出现错误 no kind Deployment is registered for version apps
  • Terraform EKS 标记

    我遇到了 Terraform EKS 标记问题 并且似乎没有找到可行的解决方案来在创建新集群时标记所有 VPC 子网 提供一些背景信息 我们有一个 AWS VPC 在其中将多个 EKS 集群部署到子网中 我们不会在 EKS 集群创建过程中创