如何使用私有 ip 地址跨不同子网和 Az 区域创建多个 ec2 实例

How to create multiple ec2 instance across different subnets and Az zones with private ip address

我有一个小问题。我有 3 个子网 cidr 块和 3 个不同的 az 组。我正在传递这些实例的静态 IP 地址列表,以便按顺序分配。然而,我的代码抛出“ip 地址超出子网范围”,这是有道理的,因为它只是从 ip 0 到 N 实例,我如何才能正确确保实例被放置在正确的子网中。我希望我的问题有意义并且很清楚请看下面的代码谢谢大家的帮助!下面的代码创建实例

  ### Start of Radient FID Server ###
resource "aws_instance" "FID" {
  depends_on = [aws_kms_key.aws-wm-wmad-prod] 
  disable_api_termination     = false
   
   count =  var.How_many_FID

  ami                         = var.windows_dc_ami_2016
  availability_zone           = element(var.availability_zones, count.index)
  ebs_optimized               = var.windows_dc_ebs_optimized
  instance_type               = var.windows_dc_instance_type_FID
  key_name                    = var.Key_Pair_Ec2
  monitoring                  = true
 vpc_security_group_ids       = [aws_security_group.Private01.id]
  subnet_id                   = element(aws_subnet.private_subnet_cidr_blocks_Apps, count.index).id
  private_ip                  = "${lookup(var.ips,count.index)}"                           
  associate_public_ip_address = false
 
  tags = merge(
    {
      Name        = element(var.Radiant_FID_Server_Tags, count.index)
      Project     = var.project,
      Environment = var.environment
    },
    var.tags
  )

我有一个变量文件,我正在传递私有 IP 地址:

variable "ips" {
    default = {
        "0" = "10.7.90.79"
        "1" = "10.7.90.80"
        "2" = "10.7.90.81"
        "3" = "10.7.90.82"
        "4" = "10.7.90.90"
        "5" = "10.7.90.84"
        "6" = "10.7.90.85"
        "7" = "10.7.90.86"
        "8" = "10.7.90.87"
        "9" = "10.7.90.88"
      
    }
}

##我如何创建我的子网

resource "aws_subnet" "private_subnet_cidr_blocks_AD" {
  count = length(var.private_subnet_cidr_blocks_AD) # count = 3

  vpc_id            = aws_vpc.default.id #id34odfjdf
  cidr_block        = var.private_subnet_cidr_blocks_AD[count.index] 
  availability_zone = var.availability_zones[count.index] 

  tags = merge(
    {
      Name     = element(var.private_subnet_cidr_blocks_AD_NameTag, count.index), 
      Project     = var.project,
      Environment = var.environment
    },
    var.tags
  )
}

假设您定义了以下 CIDR 阻止列表:

private_subnet_cidr_blocks_AD = ["10.7.90.64/27", "10.7.90.96/27","10.7.90.160/27"] 

然后您可以这样定义您的 IP 列表:

variable "ips" {
    default = [
        { subnet=0, ip="10.7.90.79" },
        { subnet=0, ip="10.7.90.80" },
        { subnet=0, ip="10.7.90.81" },

        # etc...

        { subnet=1, ip="10.7.90.100" },      
        { subnet=1, ip="10.7.90.101" },      

        # etc...

        { subnet=2, ip="10.7.90.170" },
        { subnet=2, ip="10.7.90.171" },
    ]
}

每个子网号是 private_subnet_cidr_blocks_AD 列表中对应 IP 所属 CIDR 块的索引。

那么您的实例定义可能如下所示:

resource "aws_instance" "FID" {
  for_each = toset( var.ips )

  subnet_id  = aws_subnet.private_subnet_cidr_blocks_Apps[each.value.subnet].id
  private_ip = each.value.ip