【问题标题】:Why does terraform fail with "An argument named "flow_log_destination_type" is not expected here"?为什么 terraform 会失败并显示“此处不需要名为“flow_log_destination_type”的参数”?
【发布时间】:2020-08-14 04:27:50
【问题描述】:

“当我使用 terraform 将 vpc 流日志模块创建到 s3 存储桶时,它会抛出错误,例如: 这里不需要名为“flow_log_destination_type”的参数。 这里不需要名为“flow_log_destination_arn”的参数。 在 Terraform 文档中,我可以看到要填写的详细信息,例如 log_destination_type 和 log_destination_arn, 我在 GitHub 上找到了一些文档,它们的代码完全相同,但在尝试时它对我不起作用

产生以下错误:

Error: Unsupported argument

  on main.tf line 52, in module "vpc_with_flow_logs_s3_bucket":
  52:   flow_log_destination_type = "s3"

An argument named "flow_log_destination_type" is not expected here.


Error: Unsupported argument

  on main.tf line 53, in module "vpc_with_flow_logs_s3_bucket":
  53:   flow_log_destination_arn  = "${aws_s3_bucket.terra-test2-lifecycle.arn}"

An argument named "flow_log_destination_arn" is not expected here.


Error: Unsupported argument

  on main.tf line 55, in module "vpc_with_flow_logs_s3_bucket":
  55:   vpc_flow_log_tags = {

An argument named "vpc_flow_log_tags" is not expected here.

我哪里做错了?”

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "2.33.0"
  # Interpolated from the workspace
  name = "${terraform.workspace}"
  cidr = var.vpc_cidr

  azs             = var.vpc_azs
  private_subnets = var.vpc_private_subnets
  public_subnets  = var.vpc_public_subnets

  enable_nat_gateway = var.vpc_enable_nat_gw
  single_nat_gateway = var.vpc_single_nat_gw

  public_subnet_tags = {
    Name = "${terraform.workspace}-public"
  }

  private_subnet_tags = {
    Name = "${terraform.workspace}-private"
  }

  tags = {
    Name = "${terraform.workspace}"
  }

  vpc_tags = {
    owner       = "PEDevOps"
    environment = "${terraform.workspace}"
    version     = "0.0.1"
    managedby   = "Terraform"
  }
}

module "vpc_with_flow_logs_s3_bucket" {
  source = "../../"
  log_destination_type = "s3"
  log_destination_arn  = "${aws_s3_bucket.terra-test2-lifecycle.arn}"

  vpc_flow_log_tags = {
    Name = "vpc-flow-logs-s3-bucket"
  }

}

resource "aws_s3_bucket" "terra-test-lifecycle" {
  bucket = "terra-test-lifecycle"
  acl    = "private"

  lifecycle_rule {
    id      = "log"
    enabled = true

    prefix = "log/"

    tags = {
      "rule"      = "log"
      "autoclean" = "true"
    }

    transition {
      days          = 30
      storage_class = "STANDARD_IA" # or "ONEZONE_IA"
    }

    expiration {
      days = 60
    }
  }
  lifecycle_rule {
    id      = "tmp"
    prefix  = "tmp/"
    enabled = true

    expiration {
      date = "2020-06-06"
    }
  }
}

为什么 terraform 会失败并显示“此处不需要名为“flow_log_destination_type”的参数”?

【问题讨论】:

  • 您能否编辑您的问题以包含您尝试此操作时 Terraform 产生的完整错误输出?这可能有助于缩小问题与此配置的哪一部分有关。
  • 检查你是否在你的模块中定义了一个名为flow_log_destination_type的变量。
  • @MartinAtkins 我添加了抛出的错误,请您看看并告诉我解决方案

标签: amazon-web-services terraform


【解决方案1】:

“../../”处的模块未声明任何 log_destination_typelog_destination_arnvpc_flow_log_tags 变量和 Terraform认为这样分配给模块块中未声明的变量是错误的:

module "vpc_with_flow_logs_s3_bucket" {
  source = "../../"
  log_destination_type = "s3"
  log_destination_arn  = "${flow_log_destination_arn}"

  vpc_flow_log_tags = {
    Name = "vpc-flow-logs-s3-bucket"
  }
}

“../../”很可能是 vpc_with_flow_logs_s3_bucket 模块的错误源路径,您应该修复它。如果您位于声明此模块块的模块的源路径中并运行cd ../../,您是否最终进入了具有 vpc_with_flow_logs_s3_bucket Terraform 代码的目录?如果不是,则 source 设置不正确,您需要修复它。

如果“../../”是正确的路径,那么您应该添加缺少的变量声明。

variable "log_destination_type" {
    type = string
}

variable "log_destination_arb" {
    type = string
}

variable "vpc_flow_log_tags" {
    type = map(string)
}

【讨论】:

    【解决方案2】:

    如果您传递了模块不期望的变量,则会发生此错误。

    例如

    module "vpc_with_flow_logs_s3_bucket" {
      source = "../../"
      log_destination_type = "s3"
      log_destination_arn  = "${flow_log_destination_arn}"
    
      vpc_flow_log_tags = {
        Name = "vpc-flow-logs-s3-bucket"
      }
    
    }
    

    如果你指定这个,如果变量 flow_log_destination_arn 在 main.tf 中定义并且不在 variables.tf 中

    ,它将引发错误

    来源: ../../vpc_with_flow_logs_s3_bucket/main.tf

    resource "aws_flow_log" "example" {
      iam_role_arn    = "${aws_iam_role.example.arn}"
      log_destination = "${aws_cloudwatch_log_group.example.arn}"
      traffic_type    = "ALL"
      vpc_id          = "${aws_vpc.example.id}"
    }
    

    【讨论】:

    • 您的陈述“如果变量 flow_log_destination_arn 是在 main.tf 而不是 variables.tf 中定义的”是不正确的。问题是分配而不是定义,您需要准确说明您的意思是哪个 main.tf 和 variables.tf,因为很可能两者都有多个。
    【解决方案3】:

    我将分享另一个可能导致此错误的原因。

    像这样编写配置块:

      scaling_config = {
        desired_size = 2
        max_size     = 2
        min_size     = 2
      }
    

    而不是(注意= 等号):

      scaling_config {
        desired_size = 2
        max_size     = 2
        min_size     = 2
      }
    

    会给出An argument named "scaling_config" is not expected here的错误。


    (*) 注意更改后,如果块类型确实不支持,错误标题将从:

    Error: Unsupported argument
    

    收件人:

    Error: Unsupported block type
    

    带有以下错误消息:

    Blocks of type "scaling_config" are not expected here.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多