He usado este módulo para crear un grupo de seguridad en AWS VPC. ¿Cómo hago referencia al recurso creado a partir de esto en un archivo separado? Estoy creando nuestra instancia de bastión en un directorio separado en el mismo repositorio.
La configuración de mi bastión se parece a la siguiente, usa el módulo Terraform EC2 y funciona si codifico el ID del grupo de seguridad vpc, pero quiero que pueda tomarlo directamente cuando se crea el grupo de seguridad, ya que esto podría cambiar en el futuro. ..
terraform/aws/layers/bastion/main.tf
provider "aws" { region = var.region } module "ec2-instance" { source = "terraform-aws-modules/ec2-instance/aws" name = "bastion" instance_count. = 1 ami = var.image_id instance_type = var.instance_type vpc_security_group_ids = ["${}"] subnet_id = var.subnet iam_instance_profile = "aws-example-ec2-role" tags = { Layer = "Bastion" } }Así he creado el grupo de seguridad: terraform/aws/global/vpc/bastion_sg.tf
module "bastion-sg" { source = "terraform-aws-modules/security-group/aws" name = "Bastion" description = "Bastion example group" vpc_id = "vpc-12345" ingress_with_cidr_blocks = [ { from_port = ## to_port = ## protocol = "##" description = "Bastion SSH" cidr_blocks = "1.2.3.4/5" }, { from_port = ## to_port = ## protocol = "##" description = "Bastion SSH" cidr_blocks = "1.2.3.4/5" } ] egress_with_source_security_group_id = [ { from_port = ## to_port = ## protocol = "##" description = "Access to default server security group" source_security_group_id = "sg-12345" }, { from_port = ## to_port = ## protocol = "##" description = "Access to db" source_security_group_id = "sg-12345" } ] }¿Necesito enviar el ID del grupo de seguridad a outputs.tf donde he creado bastion_sg.tf antes de poder hacer referencia a bastion/main.tf como se muestra a continuación?
module "bastion_sg" source "../../global/vpc"y luego de alguna manera pasar la ID a vpc_security_group_id = ?
No usaría terraform-aws-modules. Usaría los recursos del proveedor de aws como aws_security_group y aws_security_group_rules directamente. Desde Terraform 0.12, estos módulos de un solo recurso no ofrecen ningún beneficio, solo mayor complejidad.
Este es un ejemplo de lo que podría ser su código con recursos directos del proveedor de AWS y sin módulos superfluos:
provider "aws" { region = var.region } resource "aws_instance" "bastion" { name = "bastion" ami = var.image_id instance_type = var.instance_type vpc_security_group_ids = [aws_security_group.bastion.id] subnet_id = var.subnet iam_instance_profile = "aws-example-ec2-role" tags = { Layer = "Bastion" } } resource "aws_security_group" "bastion_from_ssh" { name = "Bastion" description = "Bastion example group" vpc_id = "vpc-12345" } resource "aws_security_group_rule" "allow_ssh" { type = "ingress" from_port = ## to_port = ## protocol = "##" description = "Bastion SSH" cidr_blocks = ["1.2.3.4/5"] } resource "aws_security_group_rule" "bastion_to_db" { type = "egress" from_port = ## to_port = ## protocol = "##" description = "Access to default server security group" source_security_group_id = "sg-12345" } output "security_group_id" { value = aws_security_group.bastion_from_ssh.id }Ejemplo: Hacer referencia a la salida en otro módulo:
module "bastion" { source = "path/to/dir/with/code/above" // ... any variables it needs } resource "aws_security_group" "app_server" { name = "AppServer" description = "App Server group" vpc_id = "vpc-12345" } resource "aws_security_group_rule" "allow_ssh_to_app_server" { security_group_id = module.bastion.security_group_id type = "egress" from_port = 22 to_port = 22 protocol = "tcp" description = "SSH to App Server" source_security_group_id = aws_security_group.app_server.id } resource "aws_security_group_rule" "allow_ssh_from_bastion" { security_group_id = aws_security_group.app_server.id type = "ingress" from_port = 22 to_port = 22 protocol = "tcp" description = "SSH from Bastion" source_security_group_id = module.bastion.security_group_id }De la documentación del módulo que está utilizando, estos son los resultados .
La forma de referenciarlos en tu propia terraformación sería:
module.bastion-sg.this_security_group_id Entonces, su archivo terraform/aws/layers/bastion/main.tf se vería así:
provider "aws" { region = var.region } module "ec2-instance" { source = "terraform-aws-modules/ec2-instance/aws" name = "bastion" instance_count. = 1 ami = var.image_id instance_type = var.instance_type vpc_security_group_ids = [module.bastion-sg.this_security_group_id] subnet_id = var.subnet iam_instance_profile = "aws-example-ec2-role" tags = { Layer = "Bastion" } }