如何根据 Terraform 中 for_each 中的映射值设置 EC2 资源实例计数

2024-01-13

对于以下 Terraform 代码 - 我希望最终得到 2 个测试沙箱开发实例和 1 个测试沙箱测试实例。我希望能够从地图值中得出计数instance_count.

我尝试过使用count但 Terraform 不允许用户这样做for_each.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.27"
    }
  }

  required_version = ">= 0.14.9"
}

variable "instance_name" {
  description = "Value of the Name tag for the EC2 instance"
  type        = string
  default     = "ChangedName"
}

variable "aws_region" {
  description = "AWS Region"
  type        = string
  default     = "eu-west-2"
}

variable "instance_size_small" {
  description = "Instance size small"
  type        = string
  default     = "t3.micro"
}

variable "redundant_count" {
  description         = "Default redundancy - base number of instances to create for redundant services"
  type                = number
  default             = 1
}

variable "ami" {
  description = "Ubuntu 20.04 AMI"
  type        = string
  default     = "ami-0015a39e4b7c0966f"
}

provider "aws" {
  profile = "sandbox"
  region  = var.aws_region
}

variable "environment_name" {
  description         = "Environment Name"
  type                = string
  default             = "dev"
}

variable "client_name" {
  description         = "Client Name"
  type                = string
  default             = "sandbox"
}

variable "instances" {
  description = "Map of modules names to configuration."
  type        = map
  default     = {
    testing-sandbox-dev = {
      instance_count          = 2,
      instance_type           = "t3.micro",
      environment             = "dev"
    },
    testing-sandbox-test = {
      instance_count          = 1,
      instance_type           = "t3.micro",
      environment             = "test"
    }
  }
}

resource "aws_instance" "ec2-instance" {
  for_each = var.instances

  ami           = var.ami
  instance_type = each.value.instance_type

  tags = {
    Name = "${each.key}.${var.client_name}"
    client = var.client_name
    environment = var.environment_name
  }
}

如何指定预定义映射中的实例计数?


你必须扩展你的var.instances如下:

locals {
  instances_flat = merge([
          for env, val in var.instances:
           {
             for idx in range(val["instance_count"]):
               "${env}-${idx}" => {
                   instance_type           = val["instance_type"]
                   environment             = val["environment"]
               }
           }
      ]...)
}

这使:

instances_flat = {
  "testing-sandbox-dev-0" = {
    "environment" = "dev"
    "instance_type" = "t3.micro"
  }
  "testing-sandbox-dev-1" = {
    "environment" = "dev"
    "instance_type" = "t3.micro"
  }
  "testing-sandbox-test-0" = {
    "environment" = "test"
    "instance_type" = "t3.micro"
  }
}

then

resource "aws_instance" "ec2-instance" {
  for_each      = local.instances_flat

  ami           = var.ami
  instance_type = each.value.instance_type

  tags = {
    Name = "${each.value.environment}.${var.client_name}"
    client = var.client_name
    environment = var.environment_name
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据 Terraform 中 for_each 中的映射值设置 EC2 资源实例计数 的相关文章

随机推荐