Terraform - Ресурс не найден для переменной, несмотря на то, что он объявлен в том же файле

Terraform не может найти ресурс, который объявлен в том же файле, где находится ссылка.

Кажется, что эта линия вызывает проблемы: role_arn = "${aws_iam_role.newsapi_lambda_codepipeline.arn}", Не может найти newsapi_lambda_codepipeline который объявлен как resource "aws_iam_role" "newsapi_lambda_codepipeline" { ... },

Это мой main.tf:

resource "aws_s3_bucket" "newsapi_lambda_builds" {
  bucket = "newsapi-lambda-builds"
  acl    = "private"
}

resource "aws_iam_role" "newsapi_lambda_codebuild" {
  name = "newsapi-lambda-codebuild"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:GetBucketVersioning"
      ],
      "Resource": "arn:aws:s3:::newsapi_lambda_builds",
      "Effect": "Allow"
    },
    {
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::newsapi_lambda_builds"
      ],
      "Effect": "Allow"
    },
    {
      "Action": [
        "lambda:invokefunction",
        "lambda:listfunctions"
      ],
      "Resource": "*",
      "Effect": "Allow"
    },
    {
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ]
    }
  ]
}
EOF
}
resource "aws_iam_role" "newsapi_lambda_codepipeline" {
  name = "newsapi-lambda-codepipeline"

  assume_role_policy = <<EOF
{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "codepipeline.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:GetBucketVersioning"
      ],
      "Resource": "${aws_s3_bucket.newsapi_lambda_builds.arn}",
      "Resource": "${aws_s3_bucket.newsapi_lambda_builds.arn}/*"
      "Effect": "Allow"
    },
    {
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::newsapi_lambda_builds"
      ],
      "Effect": "Allow"
    },
    {
      "Effect": "Allow",
      "Action": [
        "codebuild:BatchGetBuilds",
        "codebuild:StartBuild"
      ],
      "Resource": "*"
    }
  ],
  "Version": "2012-10-17"
}
EOF
}


resource "aws_codepipeline" "newsapi_lambda" {
  name     = "newsapi-lambda"
  role_arn = "${aws_iam_role.newsapi_lambda_codepipeline.arn}"

  artifact_store {
    location = "${aws_s3_bucket.newsapi_lambda_builds.bucket}"
    type     = "S3"
  }

  stage {
    name = "Source"

    action {
      name             = "Source"
      category         = "Source"
      owner            = "ThirdParty"
      provider         = "GitHub"
      version          = "1"
      output_artifacts = ["newsapi_lambda"]

      configuration {
        Owner      = "Defozo"
        Repo       = "traceitfor.me_newsapi_lambda"
        Branch     = "master"
      }
    }
  }

  stage {
    name = "Build"

    action {
      name            = "Build"
      category        = "Build"
      owner           = "AWS"
      provider        = "CodeBuild"
      input_artifacts = ["newsapi_lambda"]
      version         = "1"
      role_arn = "${aws_iam_role.newsapi_lambda_codebuild.arn}"

      configuration {
        ProjectName = "newsapi-lambda"
      }
    }
  }
}

После выполнения terraform apply Я получил:

Error: Error running plan: 1 error(s) occurred:

* aws_codepipeline.newsapi_lambda: 1 error(s) occurred:

* aws_codepipeline.newsapi_lambda: Resource 'aws_iam_role.newsapi_lambda_codepipeline' not found for variable 'aws_iam_role.newsapi_lambda_codepipeline.arn'

Я не понимаю, почему это происходит. я имею aws_iam_role.newsapi_lambda_codepipeline заявил, не так ли?

1 ответ

Решение

Я считаю, что ваша декларация роли может быть немного неправильной. И терраформ не смог создать арн для этого, поэтому не найден.

Похоже, вам также нужно создать resource "aws_iam_role_policy", См. https://www.terraform.io/docs/providers/aws/r/codepipeline.html Немного неясно, почему вам нужно разделить.

Если это не так, дайте мне знать, и я попробую запустить код для тестирования.

Для тех, кто испытывает проблемы с aws_ecs_task_definition не найти переменную для aws_ecs_task_definition.XXX.arnесть хороший шанс, что ваш JSON вышел из строя. Вот что я сделал, чтобы исправить мою проблему

  • Замените свою строку на task_definition = "[]"
  • Бежать terraform plan

В этот момент вы должны получить ошибку. Например, я получил

module.tf.aws_ecs_task_definition.sandbox: Определение задачи ECS container_definitions недопустимо: Ошибка при декодировании JSON: json: не удается отменить сортировку строки в поле структуры Go ContainerDefinition.MemoryReservation типа int64

В этом случае я цитировал memSize в моем template_file и он неявно не конвертируется в int64, следовательно, ошибка.

Я изменился "memoryReservation": "${mem_size}" в "memoryReservation": ${mem_size}, удалил заполнитель task_definition, и все прошло гладко.

Чтобы помочь в расследовании таких проблем, вы можете запустить целевой terraform plan. В моем случае (неверно настроенная ссылка на блок CIDR из настраиваемого модуля AWS VPC) после запуска

terraform plan --target aws_security_group.something-or-other

Terraform фактически предоставил четкое сообщение об ошибке о том, что именно я сделал не так на этот раз. Надеюсь, это поможет:)

Поскольку название проблемы довольно общее, я попал по этой ссылке.

Я смог найти проблему, учитывая тот факт, что есть something wrong with the resource which was not found and hence it is not getting created

В моем случае это была переменная, на которую неправильно ссылаются в aws_cloudwatch_event_rule ключ "event_pattern"

    event_pattern = <<PATTERN
{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "lastStatus": [
        "STOPPED"
    ],
    "desiredStatus": [
        "RUNNING"
    ],
    "clusterArn": [
      ${aws_ecs_cluster.main.arn}
    ]
  }
}
PATTERN
Другие вопросы по тегам