我有Terraform与工作空间。当我运行Terraform时,我的资源被创建,但当我更改工作区时,由于资源已经创建,因此出现以下错误:
Error: creating IAM Role: EntityAlreadyExists (role): Role with name env-role already exists.
Error: creating IAM Policy (policy): EntityAlreadyExists: A policy called env-with-policy already exists. Duplicate names are not allowed.
这些是资源:
resource "aws_iam_role" "payload_for_lambda" {
name = "${var.iam_role_name}"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}
resource "aws_iam_policy" "AWSLambdaBasicExecutionRole" {
name = "${var.iam_policy_name}"
path = "/"
description = "AWS IAM Policy for managing aws lambda role"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*",
"Effect": "Allow"
}
]
}
EOF
}
我运行terraform init和terraform apply命令来应用更改。
有没有一种方法可以让Terraform识别我的工作区的现有资源,而不是每次都尝试创建它们?
问候,伊沃
2条答案
按热度按时间z6psavjg1#
这是一个AWS错误。这里没有显示,但我猜您尝试将两个工作区部署到同一个AWS帐户。但是由于AWS帐户已经有了您尝试使用第二个工作空间创建的资源,因此此操作失败。
请在此处查看AWS文档:https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html#:~:text= RoleName,MyResource%22%20and%20%22myresource%22.
m0rkklqb2#
您遇到的问题是Terraform知道资源是唯一的(这由状态文件处理),但您使用的是显式名称,这会导致AWS中的冲突:
因此,您看到的错误来自AWS,而不是Terraform。
你可以像这样添加一个资源:
首次运行terraform初始化
然后,您可以将此后缀添加到需要唯一名称的所有资源:
在重新规划时,Terraform将看到随机字符串已经生成(它在您的状态文件中,因此不会更改)。
除了使用随机字符串之外,您还可以使用您知道在环境中唯一的前缀或后缀(即。工作区-a、工作区-b)。