Terraform部署AWS Elastic Beanstalk时提示子网不存在错误
解决Terraform部署AWS Elastic Beanstalk时的ELBSubnets子网不存在错误
我尝试使用Terraform创建AWS Elastic Beanstalk环境,相关配置如下:
main.tf
resource "aws_elastic_beanstalk_application" "elasticapp" { name = var.elasticapp } resource "aws_elastic_beanstalk_environment" "beanstalkappenv" { name = var.beanstalkappenv application = aws_elastic_beanstalk_application.elasticapp.name solution_stack_name = var.solution_stack_name tier = var.tier setting { namespace = "aws:ec2:vpc" name = "VPCId" value = var.vpc_id } setting { namespace = "aws:ec2:vpc" name = "Subnets" value = var.public_subnets } setting { namespace = "aws:elasticbeanstalk:environment:process:default" name = "MatcherHTTPCode" value = "200" } setting { namespace = "aws:elasticbeanstalk:environment" name = "LoadBalancerType" value = "application" } setting { namespace = "aws:autoscaling:launchconfiguration" name = "InstanceType" value = "t2.micro" } setting { namespace = "aws:ec2:vpc" name = "ELBScheme" value = "internet facing" } setting { namespace = "aws:autoscaling:asg" name = "MinSize" value = 1 } setting { namespace = "aws:autoscaling:asg" name = "MaxSize" value = 2 } setting { namespace = "aws:elasticbeanstalk:healthreporting:system" name = "SystemType" value = "enhanced" } }
provider.tf
provider "aws" { region = "eu-west-3" }
vars.tf
variable "elasticapp" { default = "pos-eb" } variable "beanstalkappenv" { type = string default = "pos-eb-env" } variable "solution_stack_name" { type = string default = "64bit Amazon Linux 2 v3.2.0 running Python 3.8" } variable "tier" { type = string default = "WebServer" } variable "vpc_id" { default = "vpc-xxxxxxxxxxx" } variable "public_subnets" { type = string default = "subnet-xxxxxxxxxxxxxxx" }
执行terraform apply时出现以下错误:
Error: ConfigurationValidationException: Configuration validation exception: Invalid option value: 'subnet-xxxxxxxxxxxxxxx' (Namespace: 'aws:ec2:vpc', OptionName: 'ELBSubnets'): The subnet 'subnet-xxxxxxxxxxxxxxx' does not exist. │ status code: 400, request id: be485042-a653-496b-8510-b310d5796eef │ │ with aws_elastic_beanstalk_environment.beanstalkappenv, │ on main.tf line 9, in resource "aws_elastic_beanstalk_environment" "beanstalkappenv": │ 9: resource "aws_elastic_beanstalk_environment" "beanstalkappenv" {
我已在指定的VPC内创建了该子网,且目前仅拥有一个子网,请问该如何解决此错误?
解决方案
错误原因分析
你指定了LoadBalancerType = "application",Elastic Beanstalk会自动创建Application Load Balancer(ALB),此时必须显式配置负载均衡器使用的子网(即ELBSubnets),否则Beanstalk会尝试使用默认配置导致匹配失败。另外,AWS对ALB有硬性要求:必须关联至少两个不同可用区的子网,以保证高可用性,你当前仅有的一个子网无法满足这个要求。
具体解决步骤
确认子网的正确性
- 仔细核对子网ID,确保没有拼写错误
- 确认子网位于
eu-west-3区域(与provider配置的region一致) - 确认子网确实属于你指定的VPC
添加ELBSubnets配置
在main.tf的aws_elastic_beanstalk_environment资源中,新增以下setting块,明确指定负载均衡器使用的子网:setting { namespace = "aws:ec2:vpc" name = "ELBSubnets" value = var.public_subnets }创建第二个可用区的子网
在当前VPC内的另一个可用区创建第二个公网子网,然后更新vars.tf中的public_subnets变量,将两个子网ID用逗号分隔:variable "public_subnets" { type = string default = "subnet-xxxxxxxxxxxxxxx,subnet-yyyyyyyyyyyyyyy" }重新执行部署
运行以下命令完成部署:terraform init terraform apply
备选方案(不推荐用于生产)
如果因特殊原因只能使用一个子网,可以将负载均衡器类型改为Classic Load Balancer,它允许使用单个子网。修改main.tf中的对应配置:
setting { namespace = "aws:elasticbeanstalk:environment" name = "LoadBalancerType" value = "classic" }
注意:Classic Load Balancer功能有限,不建议用于生产环境。
内容的提问来源于stack exchange,提问作者Mike D Hovhannisyan
相关产品推荐
相关产品推荐

