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 をご覧ください.
そうでない場合は、お知らせください。コードを自分で実行してテストします。
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:タイプint64のGo構造体フィールドContainerDefinition.MemoryReservationに文字列を非整列化できません
この場合、template_file
でmemSize
を引用しましたが、暗黙的にint64に変換されなかったため、エラーが発生しました。
"memoryReservation": "${mem_size}"
を"memoryReservation": ${mem_size}
に変更し、task_definitionプレースホルダーを削除すると、すべてがスムーズに進みました。
このような問題の調査を支援するために、ターゲットを絞ったterraform plan
。私の場合(カスタムAWS VPCモジュールからのCIDRブロックへの設定が誤っている)、実行後
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