jenkins Terraform:不允许名称重复

eoigrqb6  于 2023-06-28  发布在  Jenkins
关注(0)|答案(2)|浏览(109)

我有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识别我的工作区的现有资源,而不是每次都尝试创建它们?
问候,伊沃

z6psavjg

z6psavjg1#

这是一个AWS错误。这里没有显示,但我猜您尝试将两个工作区部署到同一个AWS帐户。但是由于AWS帐户已经有了您尝试使用第二个工作空间创建的资源,因此此操作失败。
请在此处查看AWS文档:https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html#:~:text= RoleName,MyResource%22%20and%20%22myresource%22.

m0rkklqb

m0rkklqb2#

您遇到的问题是Terraform知道资源是唯一的(这由状态文件处理),但您使用的是显式名称,这会导致AWS中的冲突:

resource "aws_iam_policy" "AWSLambdaBasicExecutionRole" {
   name        = "${var.iam_policy_name}"
   ...

因此,您看到的错误来自AWS,而不是Terraform。
你可以像这样添加一个资源:

resource "random_string" "suffix" {
  length = 16
  special = false
}

首次运行terraform初始化
然后,您可以将此后缀添加到需要唯一名称的所有资源:

resource "aws_iam_policy" "AWSLambdaBasicExecutionRole" {
   name        = "${var.iam_policy_name}-${random_string.suffix.result}"
   ...

在重新规划时,Terraform将看到随机字符串已经生成(它在您的状态文件中,因此不会更改)。
除了使用随机字符串之外,您还可以使用您知道在环境中唯一的前缀或后缀(即。工作区-a、工作区-b)。

相关问题