【问题标题】:How to correctly use Count and pick multiple az subnets in Terraform如何在 Terraform 中正确使用 Count 和选择多个 az 子网
【发布时间】:2018-09-28 23:05:45
【问题描述】:

我正在尝试实现一个 module,我试图在已经创建的子网中旋转多个实例(通过 terraform),但我不确定如何在模块中实际使用 count 以及如何从 s3 存储桶数据源中选择值以在 multi-az 中旋转实例,这是我在模块 dir 中的资源的样子

resource "aws_instance" "ec2-instances" {
  count = "${var.count_num }"
  ami = "${data.aws_ami.ubuntu.id}"
  instance_type = "${var.machine_type}"
  key_name = "${var.key_name}"
  #vpc_security_group_ids = ["${aws_security_group.jumpbox-sec-group.id}"]
  vpc_security_group_ids =  ["${var.sec-group}"]
  disable_api_termination = "${var.is_production ? true : false}"
  subnet_id = "${element(var.es_stg_subnets, count.index)}" <--- This won't work , i need to use data-source as s3 
  tags {
    #Name = "${var.master_name}-${count.index+1}"
    Name = "${var.instance-tag}-${count.index+1}"
    Type = "${var.instance-type-tag}"
  }
  root_block_device {
    volume_size = "${var.instance-vol-size}"
    volume_type = "gp2"
  }
}

这是实际的模块:

module "grafana-stg" {
  source = "../../modules/services/gen-ec2"
  #ami_id = "${data.aws_ami.ubuntu.id}"
  instance_type = "${var.grafana_machine_type}"
  key_name = "jumpbox"
  vpc_security_group_ids = ["${aws_security_group.grafana-sec-group.id}"]

  #subnets = "${data.terraform_remote_state.s3_bucket_state.subnet-public-prod-1a}"

  subnet_id = ??????????????????

  disable_api_termination = "${var.is_production ? true : false}"


}

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    我会考虑使用data source 检索您的子网。

    使用Data Sources

    Terraform 有数据源的概念。您可以从 AWS 中提取资源所需的信息。在您的 gen-ec2.tf 文件中 -

    // In order to get subnets, you need the VPC they belong to.
    // Note you can filter on a variety of different tags.
    data "aws_vpc" "selected" {
      tags {
        Name = "NameOfVPC"
      }
    }
    
    // This will then retrieve all subnet ids based on filter
    data "aws_subnet_ids" "private" {
      vpc_id = "${data.aws_vpc.selected.id}"
      tags {
        Tier = "private*"
      }
    }
    
    resource "aws_instance" "ec2-instances" {
      count = "${length(data.aws_subnet_ids.private.ids)}"
      ami = "${data.aws_ami.ubuntu.id}"
      instance_type = "${var.machine_type}"
      key_name = "${var.key_name}"
      vpc_security_group_ids =  ["${var.sec-group}"]
      disable_api_termination = "${var.is_production ? true : false}"
      subnet_id = "${element(data.aws_subnet_ids.private.*.ids, count.index)}" 
      tags {
        Name = "${var.instance-tag}-${count.index+1}"
        Type = "${var.instance-type-tag}"
      }
      root_block_device {
        volume_size = "${var.instance-vol-size}"
        volume_type = "gp2"
      }
    }
    

    您的模块现在看起来像这样 -

    module "grafana-stg" {
      source = "../../modules/services/gen-ec2"
      #ami_id = "${data.aws_ami.ubuntu.id}"
      instance_type = "${var.grafana_machine_type}"
      key_name = "jumpbox"
      vpc_security_group_ids = ["${aws_security_group.grafana-sec-group.id}"]
      disable_api_termination = "${var.is_production ? true : false}"
    }
    

    【讨论】:

      【解决方案2】:

      对于我使用 Terraform v0.12.5 的我来说,波纹管 sn-p 工作正常

      data "aws_subnet_ids" "public_subnet_list" {
        vpc_id = "${var.vpc_id}"
        tags = {
          Tier = "Public"
        }
      }
      
      
      resource "aws_instance" "example" {
        count         = 2
        ami           = "ami-0c55b159cbfafe1f0"
        instance_type = "t2.micro"
        subnet_id     = tolist(data.aws_subnet_ids.public_subnet_list.ids)[count.index]
      }
      
      
      
      

      【讨论】:

        猜你喜欢
        • 2012-05-06
        • 1970-01-01
        • 2022-09-28
        • 1970-01-01
        • 2022-07-06
        • 1970-01-01
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多