在另一个模块中为 EC2 添加指定子网 - AWS Terraform -
Add specify Subnet for EC2 in another module - AWS Terraform -
我是 Terraform 新手。
我有 vpc 模块和 ec2 模块。
- VPC 模块创建 3 个 public 个子网。
- EC2 模块创建 2 个实例。
-> 所以我希望第一个实例使用 public 子网 1,第二个实例使用 public 子网 3。我使用了输出变量,但我不知道如何使用输出。请帮帮我
提供商是 AWS
VPC模块
#/module/vpc/main.tf
resource "aws_subnet" "pub_subnet" {
count = var.create_vpc && length(var.public_subnet) > 0 ? length(var.public_subnet) : 0
vpc_id = local.vpc_id
availability_zone = element(var.azs, count.index)
cidr_block = element(var.public_subnet, count.index)
map_public_ip_on_launch = true
# network_acls = aws_network_acl.nacls
tags = merge ({
Name = format("Pub_subnet %s", element(var.public_subnet, count.index))
},
var.tags
)
}
#module/vpc/output
output "public_subnet_id" {
value = aws_subnet.pub_subnet[0].id
}
EC2 模块
#/module/ec2/variables
variable "ec2_instance" {
type = map(object({
ec2_name = string
ec2_ami = string
ec2_instance_type = string
ec2_subnet_id = string
ec2_associate_public_ip_address = string
ec2_key_name = string
ec2_security_groups = list(string)
ec2_user_data = string
root_block_device_volume_type = string
root_block_device_volume_size = number
root_block_device_iops = number
root_block_device_throughput = number
}))
}
#/module/vpc/main.tf
resource "aws_instance" "ec2" {
for_each = var.ec2_instance
ami = each.value.ec2_ami
instance_type = each.value.ec2_instance_type
subnet_id = each.value.ec2_subnet_id
associate_public_ip_address = each.value.ec2_associate_public_ip_address
key_name = each.value.ec2_key_name
security_groups = each.value.ec2_security_groups
user_data = each.value.ec2_user_data
root_block_device {
volume_type = each.value.root_block_device_volume_type
volume_size = each.value.root_block_device_volume_size
iops = each.value.root_block_device_iops
throughput = each.value.root_block_device_throughput
}
tags = merge ({
Name = format("%s", each.value.ec2_name)
},
var.tags
)
}
根模块
#/main.tf
module "vpc" {
source = "../../modules/ec2"
public_subnet = [ "13.9.1.0/24", "13.9.2.0/24", "13.9.7.0/24" ]
}
module "ec2"{
source = "../../modules/ec2"
ec2_instance = {
"bastion_pub_sub_1" = {
ec2_name = "bastion_pub_sub_1"
ec2_ami = data.aws_ami.ubuntu_20_04.id
ec2_associate_public_ip_address = true
ec2_instance_type = "t2.micro"
ec2_key_name = #secret
ec2_subnet_id = module.vpc.public_subnet_id
ec2_user_data = "value"
root_block_device_iops = 3000
root_block_device_throughput = 125
root_block_device_volume_size = 8
root_block_device_volume_type = "gp3"
},
source = "../../qa_modules/ec2"
ec2_instance = {
"bastion_pub_sub_2" = {
ec2_name = "bastion_pub_sub_2"
ec2_ami = data.aws_ami.ubuntu_20_04.id
ec2_associate_public_ip_address = true
ec2_instance_type = "t2.micro"
ec2_key_name = #secret
ec2_subnet_id = module.vpc.public_subnet_id
ec2_user_data = "value"
root_block_device_iops = 3000
root_block_device_throughput = 125
root_block_device_volume_size = 8
root_block_device_volume_type = "gp3"
}
}
那么,在 ec2_subnet_id = module.vpc.public_subnet_id,我如何添加子网“13.9.1.0/24”,例如“bastion_pub_sub_1”,子网“13.9.7.0/24”,例如“bastion_pub_sub_2”
你的输出应该是:
output "public_subnet_id" {
value = aws_subnet.pub_subnet[*].id
}
然后:
module "ec2"{
source = "../../modules/ec2"
ec2_instance = {
"bastion_pub_sub_1" = {
ec2_name = "bastion_pub_sub_1"
ec2_ami = data.aws_ami.ubuntu_20_04.id
ec2_associate_public_ip_address = true
ec2_instance_type = "t2.micro"
ec2_key_name = #secret
ec2_subnet_id = module.vpc.public_subnet_id[0]
ec2_user_data = "value"
root_block_device_iops = 3000
root_block_device_throughput = 125
root_block_device_volume_size = 8
root_block_device_volume_type = "gp3"
},
source = "../../qa_modules/ec2"
ec2_instance = {
"bastion_pub_sub_2" = {
ec2_name = "bastion_pub_sub_2"
ec2_ami = data.aws_ami.ubuntu_20_04.id
ec2_associate_public_ip_address = true
ec2_instance_type = "t2.micro"
ec2_key_name = #secret
ec2_subnet_id = module.vpc.public_subnet_id[2]
ec2_user_data = "value"
root_block_device_iops = 3000
root_block_device_throughput = 125
root_block_device_volume_size = 8
root_block_device_volume_type = "gp3"
}
}
我是 Terraform 新手。 我有 vpc 模块和 ec2 模块。
- VPC 模块创建 3 个 public 个子网。
- EC2 模块创建 2 个实例。
-> 所以我希望第一个实例使用 public 子网 1,第二个实例使用 public 子网 3。我使用了输出变量,但我不知道如何使用输出。请帮帮我
提供商是 AWS
VPC模块
#/module/vpc/main.tf
resource "aws_subnet" "pub_subnet" {
count = var.create_vpc && length(var.public_subnet) > 0 ? length(var.public_subnet) : 0
vpc_id = local.vpc_id
availability_zone = element(var.azs, count.index)
cidr_block = element(var.public_subnet, count.index)
map_public_ip_on_launch = true
# network_acls = aws_network_acl.nacls
tags = merge ({
Name = format("Pub_subnet %s", element(var.public_subnet, count.index))
},
var.tags
)
}
#module/vpc/output
output "public_subnet_id" {
value = aws_subnet.pub_subnet[0].id
}
EC2 模块
#/module/ec2/variables
variable "ec2_instance" {
type = map(object({
ec2_name = string
ec2_ami = string
ec2_instance_type = string
ec2_subnet_id = string
ec2_associate_public_ip_address = string
ec2_key_name = string
ec2_security_groups = list(string)
ec2_user_data = string
root_block_device_volume_type = string
root_block_device_volume_size = number
root_block_device_iops = number
root_block_device_throughput = number
}))
}
#/module/vpc/main.tf
resource "aws_instance" "ec2" {
for_each = var.ec2_instance
ami = each.value.ec2_ami
instance_type = each.value.ec2_instance_type
subnet_id = each.value.ec2_subnet_id
associate_public_ip_address = each.value.ec2_associate_public_ip_address
key_name = each.value.ec2_key_name
security_groups = each.value.ec2_security_groups
user_data = each.value.ec2_user_data
root_block_device {
volume_type = each.value.root_block_device_volume_type
volume_size = each.value.root_block_device_volume_size
iops = each.value.root_block_device_iops
throughput = each.value.root_block_device_throughput
}
tags = merge ({
Name = format("%s", each.value.ec2_name)
},
var.tags
)
}
根模块
#/main.tf
module "vpc" {
source = "../../modules/ec2"
public_subnet = [ "13.9.1.0/24", "13.9.2.0/24", "13.9.7.0/24" ]
}
module "ec2"{
source = "../../modules/ec2"
ec2_instance = {
"bastion_pub_sub_1" = {
ec2_name = "bastion_pub_sub_1"
ec2_ami = data.aws_ami.ubuntu_20_04.id
ec2_associate_public_ip_address = true
ec2_instance_type = "t2.micro"
ec2_key_name = #secret
ec2_subnet_id = module.vpc.public_subnet_id
ec2_user_data = "value"
root_block_device_iops = 3000
root_block_device_throughput = 125
root_block_device_volume_size = 8
root_block_device_volume_type = "gp3"
},
source = "../../qa_modules/ec2"
ec2_instance = {
"bastion_pub_sub_2" = {
ec2_name = "bastion_pub_sub_2"
ec2_ami = data.aws_ami.ubuntu_20_04.id
ec2_associate_public_ip_address = true
ec2_instance_type = "t2.micro"
ec2_key_name = #secret
ec2_subnet_id = module.vpc.public_subnet_id
ec2_user_data = "value"
root_block_device_iops = 3000
root_block_device_throughput = 125
root_block_device_volume_size = 8
root_block_device_volume_type = "gp3"
}
}
那么,在 ec2_subnet_id = module.vpc.public_subnet_id,我如何添加子网“13.9.1.0/24”,例如“bastion_pub_sub_1”,子网“13.9.7.0/24”,例如“bastion_pub_sub_2”
你的输出应该是:
output "public_subnet_id" {
value = aws_subnet.pub_subnet[*].id
}
然后:
module "ec2"{
source = "../../modules/ec2"
ec2_instance = {
"bastion_pub_sub_1" = {
ec2_name = "bastion_pub_sub_1"
ec2_ami = data.aws_ami.ubuntu_20_04.id
ec2_associate_public_ip_address = true
ec2_instance_type = "t2.micro"
ec2_key_name = #secret
ec2_subnet_id = module.vpc.public_subnet_id[0]
ec2_user_data = "value"
root_block_device_iops = 3000
root_block_device_throughput = 125
root_block_device_volume_size = 8
root_block_device_volume_type = "gp3"
},
source = "../../qa_modules/ec2"
ec2_instance = {
"bastion_pub_sub_2" = {
ec2_name = "bastion_pub_sub_2"
ec2_ami = data.aws_ami.ubuntu_20_04.id
ec2_associate_public_ip_address = true
ec2_instance_type = "t2.micro"
ec2_key_name = #secret
ec2_subnet_id = module.vpc.public_subnet_id[2]
ec2_user_data = "value"
root_block_device_iops = 3000
root_block_device_throughput = 125
root_block_device_volume_size = 8
root_block_device_volume_type = "gp3"
}
}