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, не так ли?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
10 124
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

Я выполнил terraform destroy, а затем снова terraform apply, который выявил истинные ошибки. Я исправил свои ошибки и успешно применил его снова. Хотя я не понимаю, почему мне пришлось разрушить инфраструктуру, а затем снова применить ее, чтобы увидеть ошибки. В любом случае спасибо за ваш ответ.

Defozo 21.03.2018 17:06

Было бы хорошо добавить сюда ошибки, которые появились для вас, чтобы другие люди могли их увидеть;)

Jenninha 21.03.2018 17:10

Я столкнулся с такой же ситуацией. Выполнение «export TF_LOG = DEBUG» позволило мне увидеть, почему ресурс (в данном случае определение задачи ECS) не был создан.

user1170291 20.10.2018 21:37

У меня была такая же ошибка с ресурсом aws_ecs_task_definition, который является ошибкой в ​​определении контейнера json. Как только я удалил ресурс, который ссылался на ресурс aws_ecs_task_definition, я получил "настоящую" ошибку (Ошибка декодирования JSON). Пока какой-то другой ресурс ссылается на ресурс с ошибкой, возникает только вводящая в заблуждение ошибка «ресурс не найден».

induktiv 02.03.2019 10:57

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

  • Замени свою линию на task_definition = "[]"
  • Запускаем terraform plan

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

module.tf.aws_ecs_task_definition.sandbox: ECS Task Definition container_definitions is invalid: Error decoding JSON: json: cannot unmarshal string into Go struct field ContainerDefinition.MemoryReservation of type int64

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

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

Спасибо! Вы вообще поняли, как получать содержательные сообщения? Это ошибка терраформирования?

Morozov 12.07.2019 11:36

Что вы имеете в виду под фразой «проблема с aws_ecs_task_definition не находит переменную? Я работаю над проектом, в котором я получаю аналогичную ошибку OP для файла с именем. aws_ecs_task_definition - официальный термин или вы используете это как уловку -все заполнители для различных потенциальных проблем?

Josh Desmond 30.07.2019 17:59

это, в частности, ошибка разработчика в файле шаблона, который передается как определение контейнера в terraform.io/docs/providers/aws/r/ecs_task_definition.html, где ошибка по умолчанию замаскирована

wonton 01.08.2019 19:13

Ключевым моментом здесь является то, что не найдено, это то, что не работает. В предоставленном случае ресурс с проблемой можно «отладить», выполнив целевое применение. Например. terraform apply aws_codepipeline.newsapi_lambda.aws_iam_role.newsapi_lambda_‌​codepipeline

Ralph Bolton 14.10.2019 18:00

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

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

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

    event_pattern = <<PATTERN
{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "lastStatus": [
        "STOPPED"
    ],
    "desiredStatus": [
        "RUNNING"
    ],
    "clusterArn": [
      ${aws_ecs_cluster.main.arn}
    ]
  }
}
PATTERN

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

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

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

Спасибо тебе за это.

Matt Miller 06.11.2019 00:29

Спасибо. Это помогло мне найти проблему с aws_ecs_task_definition

suman j 31.05.2020 14:41

Другие вопросы по теме