web-dev-qa-db-ja.com

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を宣言しましたね。

7
Defozo

あなたの役割宣言は少し間違っていると思います。そして、terraformはそのためのarnを生成できなかったため、見つかりませんでした。

resource "aws_iam_role_policy"も作成する必要があるようです。 https://www.terraform.io/docs/providers/aws/r/codepipeline.html をご覧ください.

そうでない場合は、お知らせください。コードを自分で実行してテストします。

6
Jenninha

aws_ecs_task_definitionaws_ecs_task_definition.XXX.arnの変数が見つからないという問題が発生している場合は、JSONの形式が正しくない可能性があります。これは私の問題を解決するために私がしたことです

  • 行をtask_definition = "[]"に置き換えます
  • terraform planを実行します

この時点で、エラーが発生するはずです。たとえば、私は得ました

module.tf.aws_ecs_task_definition.sandbox:ECSタスク定義container_definitionsが無効です:JSONのデコード中にエラーが発生しました:json:タイプint64のGo構造体フィールドContainerDefinition.MemoryReservationに文字列を非整列化できません

この場合、template_filememSizeを引用しましたが、暗黙的にint64に変換されなかったため、エラーが発生しました。

"memoryReservation": "${mem_size}""memoryReservation": ${mem_size}に変更し、task_definitionプレースホルダーを削除すると、すべてがスムーズに進みました。

7
wonton

このような問題の調査を支援するために、ターゲットを絞ったterraform plan。私の場合(カスタムAWS VPCモジュールからのCIDRブロックへの設定が誤っている)、実行後

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

Terraformは、実際に今回私が何を間違ったかについて明確なエラーメッセージを提供しました。それが役に立てば幸い :)

1
Karol Małyszko

問題のタイトルはかなり一般的なものなので、このリンクに行きました。

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
0
rahuljain1311