Terraform aws_elastic_beanstalk_environment“错误:缺少必需的参数”

时间:2021-02-05 06:53:10

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

背景

我有一个 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 运行脚本时,beanstalk 部署得很好。 当运行脚本部署全栈时,其他组件被创建,然后我得到

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”的行。

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

1 个答案:

答案 0 :(得分:0)

这是导致问题的设置块:

  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”错误,这可能意味着您正在尝试使用仅适用于资源可用选项的某些的内容。 >