【问题标题】:Terraform fix no matching subnet found for vpc with id vpcTerraform 修复了没有为 id 为 vpc 的 vpc 找到匹配的子网
【发布时间】:2021-01-24 17:18:07
【问题描述】:

我有以下 terraform 代码,当我尝试 terraform apply --auto-approve 时,它给了我这个错误

Terraform 修复未找到 ID 为 vpc 的 vpc 的匹配子网

我认为这是因为 data 块试图在创建子网后立即获取子网 ID。因为,大约 1 分钟后,我可以再次执行 terraform apply --auto-approve 并且效果很好。

我该如何解决这个问题?

# -------------------------------------------
# -------------------------------------------
# Create VPC
module "ecs_vpc" {
  source = "./modules/7_vpc"
}

# -------------------------------------------
# -------------------------------------------
# Create SUBNETS
module "ecs_subnets_public_1" {
  source = "./modules/8_subnet"
  SUBNET_CIDR = "10.0.128.0/18"
  VPC_ID = module.ecs_vpc.vpc_id
  SUBNET_TAGS = {"Name" : "terraform-subnet-public-1"}
}

module "ecs_subnets_private_1" {
  source = "./modules/8_subnet"
  SUBNET_CIDR = "10.0.192.0/18"
  VPC_ID = module.ecs_vpc.vpc_id  
  SUBNET_TAGS = {"Name" : "terraform-subnet-private-1"}
}

# -------------------------------------------
# -------------------------------------------
# Create IGW
module "ecs_igw" {
  source = "./modules/9_igw"
  IGW_TAGS = {"Name" : "terraform-igw"}
  VPC_ID = module.ecs_vpc.vpc_id
}

# -------------------------------------------
# -------------------------------------------
# Create EIP for NAT
module "nat_eip" {
  source = "./modules/10_eip"
  EIP_NETWORK_BRODER_GROUP_REGION = "us-east-2"
  EIP_TAGS = {"Name" : "terraform-nat-eip"}
}

# -------------------------------------------
# -------------------------------------------
# Create NAT
data "aws_subnet_ids" "public_1" {
  vpc_id = module.ecs_vpc.vpc_id

  tags = {
    Name = "*terraform-subnet-public-1" // or two filter by a unique word use; *private*
  }
}

output "public" {
  value = data.aws_subnet_ids.public_1.id
}

data "aws_subnet_ids" "private_1" {
  vpc_id = module.ecs_vpc.vpc_id

  tags = {
    Name = "*terraform-subnet-private-1" // or two filter by a unique word use; *private*
  }
}

output "private" {
  value = data.aws_subnet_ids.private_1.id
}

谢谢!

【问题讨论】:

    标签: amazon-web-services terraform


    【解决方案1】:

    由于您在模块ecs_subnets_public_1ecs_subnets_private_1 中创建子网,因此您不应使用data source 来获取有关这些子网的信息。 ./modules/8_subnet 模块应该返回它想要通过outputs 向父模块公开的所有信息,如 TF 文档的Module Composition 中所示。这是使用outout 完成的:

    输出值以将结果返回给调用模块,然后它可以使用它在其他地方填充参数。

    所以您的./modules/8_subnet 将有output 作为子网ID。像这样的:

    output "subnet_id" {
       value = aws_subnet.mysubnet.id
    }
    

    然后要在父模块中访问它,您将使用以下内容而不是数据源:

    module.ecs_subnets_private_1.subnet_id
    
    # and
    
    module.ecs_subnets_public_1.subnet_id
    

    尽管如此,data.aws_subnet_ids 失败的可能原因是它们可能在子网实际创建之前运行。要解决这个问题,您必须添加 depends_on:

    data "aws_subnet_ids" "public_1" {
      vpc_id = module.ecs_vpc.vpc_id
    
      tags = {
        Name = "*terraform-subnet-public-1" // or two filter by a unique word use; *private*
      }
    
      depends_on = [module.ecs_subnets_public_1]
    }
    
    data "aws_subnet_ids" "private_1" {
      vpc_id = module.ecs_vpc.vpc_id
    
      tags = {
        Name = "*terraform-subnet-private-1" // or two filter by a unique word use; *private*
      }
    
      depends_on = [module.ecs_subnets_private_1]
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-24
      • 1970-01-01
      • 2019-11-27
      • 2020-05-06
      • 2018-02-05
      • 1970-01-01
      • 2021-02-15
      • 2020-08-02
      • 2021-11-01
      相关资源
      最近更新 更多