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





Я считаю, что ваше объявление о роли может быть немного неправильным. И terraform не смог сгенерировать для этого arn, поэтому не найден.
Похоже, вам также нужно создать resource "aws_iam_role_policy". См. https://www.terraform.io/docs/providers/aws/r/codepipeline.html
Немного непонятно, зачем вам нужно делиться.
Если это не так, дайте мне знать, и я сам попробую запустить код для проверки.
Было бы хорошо добавить сюда ошибки, которые появились для вас, чтобы другие люди могли их увидеть;)
Я столкнулся с такой же ситуацией. Выполнение «export TF_LOG = DEBUG» позволило мне увидеть, почему ресурс (в данном случае определение задачи ECS) не был создан.
У меня была такая же ошибка с ресурсом aws_ecs_task_definition, который является ошибкой в определении контейнера json. Как только я удалил ресурс, который ссылался на ресурс aws_ecs_task_definition, я получил "настоящую" ошибку (Ошибка декодирования JSON). Пока какой-то другой ресурс ссылается на ресурс с ошибкой, возникает только вводящая в заблуждение ошибка «ресурс не найден».
Если у вас возникла проблема с 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, и все прошло гладко.
Спасибо! Вы вообще поняли, как получать содержательные сообщения? Это ошибка терраформирования?
Что вы имеете в виду под фразой «проблема с aws_ecs_task_definition не находит переменную? Я работаю над проектом, в котором я получаю аналогичную ошибку OP для файла с именем. aws_ecs_task_definition - официальный термин или вы используете это как уловку -все заполнители для различных потенциальных проблем?
это, в частности, ошибка разработчика в файле шаблона, который передается как определение контейнера в terraform.io/docs/providers/aws/r/ecs_task_definition.html, где ошибка по умолчанию замаскирована
Ключевым моментом здесь является то, что не найдено, это то, что не работает. В предоставленном случае ресурс с проблемой можно «отладить», выполнив целевое применение. Например. terraform apply aws_codepipeline.newsapi_lambda.aws_iam_role.newsapi_lambda_codepipeline
Поскольку название проблемы довольно общее, я попал по этой ссылке.
Мне удалось найти проблему, учитывая то, что есть 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 фактически предоставил четкое сообщение об ошибке о том, что именно я сделал не так на этот раз. Надеюсь, поможет :)
Спасибо тебе за это.
Спасибо. Это помогло мне найти проблему с aws_ecs_task_definition
Я выполнил
terraform destroy, а затем сноваterraform apply, который выявил истинные ошибки. Я исправил свои ошибки и успешно применил его снова. Хотя я не понимаю, почему мне пришлось разрушить инфраструктуру, а затем снова применить ее, чтобы увидеть ошибки. В любом случае спасибо за ваш ответ.