#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
намного проще.