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

标签 amazon-web-services terraform amazon-iam

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

为了简单起见,这里有一个从环境根模块之一调用模块的基本示例:

##QA-resources.tf

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

some_variable = ${module.some_module.some_output}

问题是,当一个模块已经创建时,Terraform 会抛出以下错误:

Error creating [resource-type] [resource-name]: EntityAlreadyExists: [resource-type] with [resource-name] already exists. status code: 409, request id: ...



在外部 terraform.tfstate 范围内创建模块时会发生这种情况。其中一个资源有一个独特的字段,如“名称”。

就我而言,它是在尝试使用已创建具有该特定名称的角色的 IAM 模块时发生的,但在许多其他情况下也可能发生(我不希望讨论特定于我的用例)。

我希望如果模块的资源之一存在,则不会发生故障,并且模块的输出将可用于 root。模块 .

任何建议如何管理这个(可能使用特定的命令或标志)?

我发现了一些相关的线程:

Terraform doesn't reuse an AWS Role it just created and fails?

what is the best way to solve EntityAlreadyExists error in terraform?

Terraform error EntityAlreadyExists: Role with name iam_for_lambda already exists

编辑

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

它是 AWS EKS 集群的基本角色,附加了 2 个策略(通过 var.policies 传递):
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)}"
}

这个角色被包装成一个模块并被传递给根模块。
发生上述 block 引用中的错误是因为在根模块尝试创建角色时该角色已经存在。

最佳答案

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

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

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

data "aws_iam_role" "k8s" {
  name = "k8s-role"
}

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

最后,如果您的角色当前不受 Terraform 管理,但您希望将其置于 Terraform 的所有权之下,您可以明确告诉 Terraform 通过导入该现有对象来开始管理该现有对象,以创建现有对象和您的 resource 之间的关联。堵塞:
terraform import aws_iam_role.k8s_role k8s-role

关于amazon-web-services - Terraform - 当模块的资源已经存在时,EntityAlreadyExists 错误 (409),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58891274/

相关文章:

amazon-web-services - 在 cloudform 模板中设置堆栈级别标签 - 而不是在嵌套堆栈中

带有 AWS Opsworks Mysql 层的 Mysql 5.6?

amazon-web-services - 如何通过 ASG 使用 Terraform 获取 EC2 实例的私有(private) IP

azure - 使用 terraform 如何将自定义域添加到 Azure 前门

azure - 无法使用 terraform 在 blob 容器内创建文件夹

java - 如何在 AWS 中创建新用户

java - 根据 id 从 DynamoDB 检索项目并转换该项目

azure - 将本地 tf 状态文件指定给管道中的 azurerm 提供程序

amazon-web-services - 有没有办法将 AWS IAM 与 LDAP 服务器连接起来?

amazon-web-services - 仅适用于付款和使用事件 View 的 AWS IAM 政策(适用于会计人员)