предоставление дополнительного eip в модуле terraform

#amazon-web-services #module #conditional-statements #parameter-passing #terraform

#amazon-веб-сервисы #модуль #условные операторы #передача параметров #терраформирование

Вопрос:

У меня есть модуль, который я использую для создания всех своих экземпляров aws ec2, и он работает нормально. Теперь я хочу, при необходимости, иметь возможность связать экземпляр с эластичным IP-адресом. Ассоциативная часть работает нормально, это необязательный бит, с которым я борюсь. Я использую terraform 13.5, поэтому я попытался поиграть с for_each, но, похоже, это не ответ.

Итак, вопрос в том, как я могу сделать создание aws_eip_assoication ресурса необязательным в модуле ниже. Таким образом, один и тот же модуль может использоваться для всех экземпляров ec2, будь то общедоступный, частный и т.д.?

 # module/ec2/main.tf
resource "aws_instance" "server" {
  
  subnet_id = var.subnet_id
  ami = var.ami
  key_name = var.key_name
  instance_type = var.instance_type
  vpc_security_group_ids = var.vpc_security_group_ids
  
  # Optional parameters that the caller may specify
  associate_public_ip_address = var.associate_public_ip_address
  iam_instance_profile = var.iam_instance_profile
  private_ip = var.private_ip  
}

#
# ??? How do I make this resource optional? So it only applies to ec2 instances
# that have passed in details of the eip via var.public_eip?
#
resource "aws_eip_association" "eip_assoc" {
  instance_id   = aws_instance.server.id
  allocation_id = var.public_eip
}
 
 # module/ec2/variables.tf

# Mandatory Parameters
variable "subnet_id" {}
variable "ami" {}
variable "instance_type" {}
variable "vpc_security_group_ids" {}

variable private_ip {
    description = "A pre-assigned private IP address"
    default = ""
} 
# Don't assign a public IP address by default
variable "associate_public_ip_address" {
    default = false
}
variable public_eip {
    description = "A pre-assigned public (elastic) (eip) IP address"
    default = null
}
 

Вызывающий код, сам по себе являющийся модулем.

 module "bastion_server" { 
    source = "../module/ec2"
    subnet_id                   = module.public_subnets.output_subnet_ids[0]
    ami                         = var.pattern_config.public_subnets.bastion.ami
    instance_type               = var.pattern_config.public_subnets.bastion.instance_type
    vpc_security_group_ids      = [module.bastion_sg.this_security_group_id]
    associate_public_ip_address = true
    public_eip                  = "eipalloc-0d4edc8bxxxxxxxxxx"
}

 

Ответ №1:

Обычно для условных ресурсов вы должны использовать count с условными выражениями.

Поэтому в вашем случае должно быть достаточно следующего:

 resource "aws_eip_association" "eip_assoc" {

  count = var.public_eip == null ? 0 : 1

  instance_id   = aws_instance.server.id
  allocation_id = var.public_eip
}
 

Комментарии:

1. Спасибо. В этом вопросе for_each отправился в погоню за дикими гусями. count намного проще.