首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当模块的资源已经存在时,Terraform - EntityAlreadyExists错误(409)

当模块的资源已经存在时,Terraform - EntityAlreadyExists错误(409)
EN

Stack Overflow用户
提问于 2019-11-16 13:33:39
回答 1查看 24.2K关注 0票数 8

我正在编写一个应该在不同环境中重用的terraform模块。

为了使事情变得简单,下面是从某个环境根模块调用模块的基本示例:

代码语言:javascript
复制
##QA-resources.tf

module "some_module" {
  source = "./path/to/module" 
}

some_variable = ${module.some_module.some_output}

问题是,当已经创建模块时,Terraform抛出的错误为:

创建资源类型错误: EntityAlreadyExists:具有资源名称的资源类型已经存在.状态代码: 409,请求id:.

当模块是在外部terraform.tfstate的范围下创建的,而其中一个资源有一个像'Name‘这样的唯一字段时,就会发生这种情况。

在我的例子中,它是在尝试使用IAM模块时发生的,IAM模块已经用那个特定的名称创建了一个角色,但是在许多其他情况下都可能发生这种情况(我不希望讨论是特定于我的用例)。

如果模块的某个资源存在,那么root I将不会发生故障,并且模块的输出将可供模块使用。

对于如何管理(可能使用特定的命令或标志)有什么建议吗?

我发现了几个相关的线程:

Terraform不重用它刚刚创建的AWS角色,但失败了?

解决地形EntityAlreadyExists误差的最佳方法是什么?

lambda已经存在了

编辑

对于@Martin请求,这是导致错误的资源。

它是AWS集群的一个基本角色,它有两个附加策略(通过var.policies传递):

代码语言:javascript
复制
resource "aws_iam_role" "k8s_role" {
  name = "k8s-role"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}


resource "aws_iam_role_policy_attachment" "role-policy-attach" {
  role  = "${aws_iam_role.k8s_role.name}"
  count = "${length(var.policies)}"
  policy_arn = "${element(var.policies, count.index)}"
}

此角色被包装为一个模块并传递给根模块。

发生上述块引号中提到的错误是因为根模块试图创建角色时角色已经存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-20 00:02:00

在Terraform看来,每个对象要么由Terraform管理,要么不由Terraform管理。Terraform避免隐式地获取现有对象的所有权,因为如果要这样做,那么当您随后运行terraform destroy时,您可能会无意中破坏了Terraform不打算管理的东西。

在您的示例中,这意味着您需要决定名为k8s-role的角色是否由Terraform管理,如果您有多个Terraform配置,则需要选择一个配置来管理该对象。

在将管理对象的一个Terraform配置中,可以使用resource "aws_iam_role"来指定该对象。如果任何其他配置都需要访问它,或者根本不使用Terraform来管理它,那么您可以在需要它的情况下直接引用角色名称k8s-role。如果您需要有关该角色的更多信息,而不仅仅是它的名称,那么您可以使用数据源获取该信息,而不必声明要管理对象:

代码语言:javascript
复制
data "aws_iam_role" "k8s" {
  name = "k8s-role"
}

例如,如果需要使用此角色的ARN,则可以使用arn访问此数据资源的data.aws_iam_role.k8s.arn属性。

最后,如果您的角色目前不是由Terraform管理的,但您希望将其置于Terraform的所有权之下,则可以显式地告诉Terraform通过导入该对象以创建现有对象与resource块之间的关联来开始管理该现有对象:

代码语言:javascript
复制
terraform import aws_iam_role.k8s_role k8s-role
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58891274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档