EC2 实例的输出子网

Posted

技术标签:

【中文标题】EC2 实例的输出子网【英文标题】:Output Subnets for EC2 instance 【发布时间】:2021-07-03 18:51:26 【问题描述】:

我正在构建具有两个模块的 VPC 和 AWS EC2。一个用于 VPC,一个用于 EC2。我正在努力弄清楚如何在 ec2 模块中使用子网的输出。

我在 VPC 模块中创建了子网。

    resource "aws_subnet" "tnt_public_subnets_cidr" 
    vpc_id                  = aws_vpc.tnt_vpc.id
    count             = length(var.availability_zones)
    cidr_block        = var.tnt_public_subnets_cidr [count.index]
    availability_zone = element(var.availability_zones, count.index)
    map_public_ip_on_launch = true
    tags =
       Name = "$var.environment_mgmt_subnet_$count.index + 1"
       Environment = var.environment
    

然后我使用了一个输出。

    output "tnt_public_subnets_cidr"
    value = [aws_subnet.tnt_public_subnets_cidr.*.id]
    

然后在 ec2 模块中创建一个变量。

    variable "tnt_public_subnets_cidr"
    

现在我该怎么办?我在 ec2 模块 main 的哪里使用它?子网ID?

   resource "aws_instance" "Webserver" 
   count                       = var.instance_count
   ami                         = var.ami
   instance_type               = var.instance_type
   associate_public_ip_address = var.public_address
   disable_api_termination     = true
   subnet_id                   = var.tnt_public_subnets_cidr

然后在根模块中。

   module "webserver" 
   source      = "./modules/ec2/webserver"
   ami         = var.ami_value
   count       = var.count
   environment = var.environment
   subnet_id   = module.vpc.tnt_public_subnets_cidr.id
   

当我尝试运行 terraform 计划时出现此错误:

    Error: Missing required argument

    on main.tf line 15, in module "webserver":
    15: module "webserver" 

    The argument "tnt_public_subnets_cidr" is required, but no definition was
    found.

那么我哪里错了?当将它们用于其他模块时,我对输出的流动方式感到困惑。

【问题讨论】:

【参考方案1】:

在您的模块中,您有一个没有默认值的变量:

   variable "tnt_public_subnets_cidr"
    

这意味着您在实例化模块时必须提供它

   module "webserver" 
   source      = "./modules/ec2/webserver"
   ami         = var.ami_value
   count       = var.count
   environment = var.environment
   tnt_public_subnets_cidr = module.vpc.tnt_public_subnets_cidr.id
   

您的输出也应该是一个列表,而不是列表的列表:

output "tnt_public_subnets_cidr"
    value = aws_subnet.tnt_public_subnets_cidr.*.id

【讨论】:

以上是关于EC2 实例的输出子网的主要内容,如果未能解决你的问题,请参考以下文章

VPC 中私有子网中 EC2 实例的 Amazon ELB

AWS 如何从私有子网中的 EC2 实例打开网站

Terraform 一个具有两个子网的 EC2 实例

通过 Ubuntu 堡垒到私有子网中的 EC2 实例的 SSH 隧道

SSH到位于VPC中的私有子网中的AWS EC2实例

同一子网中具有相同安全组的 2 个 ec2 实例,但 1 个不可访问