【问题标题】:Terraform aws_elastic_beanstalk_environment "Error: Missing required argument"Terraform aws_elastic_beanstalk_environment“错误:缺少必需的参数”
【发布时间】:2021-05-09 12:50:09
【问题描述】:

背景

我有一个 Terraform 脚本,可以创建多个不同的 AWS 资源并将它们链接在一起。一个组件是 aws_elastic_beanstalk_environment。它具有所需的参数和大量的配置设置。因此文件的开头是:

data "aws_elastic_beanstalk_application" "myapp" {
  name = "beanstalkapp"
}

resource "aws_elastic_beanstalk_environment" "beanstalk" {
  name                = "beanstalk-environment"
  application         = data.aws_elastic_beanstalk_application.myapp.name
  solution_stack_name = "64bit Amazon Linux 2 v5.2.5 running Node.js 12"

  setting {
    namespace = "aws:ec2:instances"
    name = "InstanceTypes"
    value = "t2.micro"
  }
  setting {
    namespace = "aws:elasticbeanstalk:environment"
    name = "EnvironmentType"
    value = "LoadBalanced"
  }
  setting {
    namespace = "aws:elasticbeanstalk:environment"
    name = "LoadBalancerType"
    value = "application"
  }
  setting {
    namespace = "aws:elasticbeanstalk:environment"
    name = "ServiceRole"
    value = "aws-elasticbeanstalk-service-role"
  }
  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name = "IamInstanceProfile"
    value = "aws-elasticbeanstalk-ec2-role"
  }
  setting {
    namespace = "aws:ec2:vpc"
    name      = "VPCId"
    value     = var.createNewVPC ? aws_vpc.vpc_new[0].id : var.vpc_id_existing
  }
  setting {
    namespace = "aws:ec2:vpc"
    name      = "Subnets"
    value     = var.createNewSubnets ? "${aws_subnet.subnet_private_a_new[0].id},${aws_subnet.subnet_private_b_new[0].id}" : "${var.subnet_private_a_id},${var.subnet_private_b_id}"
  }
  setting {
    namespace = "aws:ec2:vpc"
    name      = "ELBSubnets"
    value     = var.createNewSubnets ? "${aws_subnet.subnet_public_a_new[0].id},${aws_subnet.subnet_public_b_new[0].id}" : "${var.subnet_public_a_id},${var.subnet_public_b_id}"
  }
  setting {
    namespace = "aws:autoscaling:asg"
    name = "MinSize"
    value = "2"
  }
  setting {
    namespace = "aws:autoscaling:asg"
    name = "MaxSize"
    value = "2"
  }
  setting {
     namespace = "aws:elasticbeanstalk:application"
     name      = "Application Healthcheck URL"
     value     = "/"
  }
  setting {
     namespace = "aws:elasticbeanstalk:application:environment"
     name      = "DB_HOST"
     value     = data.aws_db_instance.myDB.address
  }
  setting {
     namespace = "aws:elasticbeanstalk:application:environment"
     name      = "DB_USER"
     value     = random_password.rds_username.result
  }
  setting {
     namespace = "aws:elasticbeanstalk:application:environment"
     name      = "DB_PASS"
     value     = random_password.rds_password.result
  }
  setting {
     namespace = "aws:elasticbeanstalk:application:environment"
     name      = "DB_PORT"
     value     = data.aws_db_instance.myDB.port
  }
  setting {
     namespace = "aws:elasticbeanstalk:application:environment"
     name      = "CACHE_ADDRESS"
     value     = data.aws_elasticache_cluster.myCache.cluster_address
  }
  setting {
     namespace = "aws:elasticbeanstalk:application:environment"
     name      = "CACHE_PORT"
     value     = var.cache_port
  }
}

问题

使用 -target=aws_elastic_beanstalk_environment.beanstalk 运行脚本时,beantalk 部署得很好。 运行脚本部署完整堆栈时,会创建其他组件,然后我得到

Error: Missing required argument

  on beanstalk.tf line 6, in resource "aws_elastic_beanstalk_environment" "beanstalk":
  6: resource "aws_elastic_beanstalk_environment" "beanstalk" {

The argument "setting.1.value" is required, but no definition was found.

我可能和下一个人一样擅长破译神秘的错误消息,但这似乎是 Terraform 内部令人窒息的东西。我在 0.13.5 并且有错误,所以我升级到 0.14.6。唯一的区别是现在它显示关于“setting.1.value”的行。

关于这意味着什么或如何解决它的任何想法?

【问题讨论】:

  • 错误是关于aws_elastic_beanstalk_environment.beanstalk,但你显示的是不同的eb:aws_elastic_beanstalk_environment.myenvironment
  • @Marcin 我很抱歉;我已经从真实名称中修改了显示的名称,但未能正确更新该名称。
  • 您的 EB 定义中只有一个 setting 块?我认为错误与其他一些 setting 块有关。
  • 该错误表明您的setting 块有问题。没有看到他们,很难检查可能是什么问题。
  • @Marcin 更新。

标签: amazon-web-services amazon-elastic-beanstalk terraform


【解决方案1】:

这是导致问题的设置块:

  setting {
     namespace = "aws:elasticbeanstalk:application:environment"
     name      = "CACHE_ADDRESS"
     value     = data.aws_elasticache_cluster.myCache.cluster_address
  }

如果我用静态值替换该值,一切正常。 我认为这是 Terraform 本身返回 cluster_address 正确值的问题。 出现问题是因为此 ElastiCache 是一个 Redis 实例,但 cluster_address 属性仅适用于 Memcached。 似乎 Terraform 应该为此提供更好的错误消息。

因此,如果您看到奇怪的“setting.x.value”错误,这可能意味着您正在尝试使用仅适用于一些资源可用选项的东西。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多