我正在写 terraform应该在不同环境中重用的模块。
为了简单起见,这里有一个从环境根模块之一调用模块的基本示例:
##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/