Как создать группу безопасности AWS и использовать ее в разных файлах .tf?

Как сказано в заголовке, если я использую terraform / aws / sizes / bastion / main.tf для создания экземпляра EC2, я знаю, что могу также создать группу безопасности в том же файле main.tf для использования экземпляром бастиона, но что, если я хочу создать группу безопасности, которую можно будет использовать в другом файле?

Например, если terraform / aws / Layers / worker / main.tf должен использовать ту же группу безопасности, что и bastion / main.tf, как я могу это сделать?

bastion/main.tf

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" {
  from_port   = ##
  to_port     = ##
  protocol    = "##"
  description = "Bastion SSH"
  cidr_blocks = ["1.2.3.4/5"]
}

resource "aws_security_group_rule" "bastion_to_db" {
  from_port                = ##
  to_port                  = ##
  protocol                 = "##"
  description              = "Access to default server security group"
  source_security_group_id = "sg-12345"
}

person cjspencer    schedule 22.06.2020    source источник
comment
Этот вопрос слишком общий, чтобы отвечать на него, поскольку другие конфигурации TF не предоставляются, поэтому я буду ссылаться на соответствующую документацию, которая объясняет, как это сделать в целом: terraform.io/docs/providers/aws/r/   -  person Matt Schuchard    schedule 22.06.2020
comment
это ссылка на мой исходный вопрос: stackoverflow.com/questions/62470490/ Я использовал модули, но кто-то предложил в ответах сделать это.   -  person cjspencer    schedule 22.06.2020
comment
Итак, вы перешли с одноресурсных модулей на это, и это хорошо. Однако мой комментарий все еще в силе: вопрос слишком широк, чтобы ответить на него как есть, поэтому, пожалуйста, либо обновите запрошенную информацию, либо используйте предоставленную мной документацию, чтобы двигаться дальше. Также обратите внимание, что в вашей ситуации нет разницы между одним и тем же файлом конфигурации или другим файлом конфигурации.   -  person Matt Schuchard    schedule 22.06.2020
comment
Привет, спасибо, что вернулся ко мне - с момента публикации я немного изменил ситуацию и заставил ее работать, хотя столкнулся с другой проблемой, которая, как я полагаю, может быть связана с тем, что Terraform Cloud имеет разные файлы состояния для каждой рабочей области ... вы не возражаете, если у вас есть быстро взгляните и посмотрите, есть ли у вас какие-либо предложения / способы решения проблемы? stackoverflow.com/questions/62515965/   -  person cjspencer    schedule 22.06.2020


Ответы (2)


Вы можете использовать модули для группировки общих ресурсов, а затем вызывать их из вашего файла .tf.

Другой альтернативой является, если это возможно, в файле .tf, где сгенерирована требуемая группа безопасности, вывести требуемые атрибуты, такие как ID. Используйте бэкэнд S3 для хранения tfstate этого стека. Теперь в других стеках, где требуется эта группа безопасности, используйте tfstate в качестве данных для получения идентификатора этой группы безопасности.

person saurabh14292    schedule 22.06.2020
comment
Спасибо за ответ, я использую модуль группы безопасности terraform, но не могу заставить вывод работать .. исходное сообщение stackoverflow.com/questions/ 62470490 / - person cjspencer; 22.06.2020
comment
в terraform / aws / global / vpc / security_groups.tf я создал группу безопасности, затем я ссылаюсь на нее в terraform / aws / Layers / bastion / main.tf с помощью [$ {module.vpc.bastion-sg}], но скорее чем использовать вывод уже созданного sg, он пытается снова создать группу безопасности? - person cjspencer; 22.06.2020

Объявите в модуле вывод, идентификатор группы безопасности которого вы хотите раскрыть и использовать в других модулях:

output "security_group_id" {
    value = aws_security_group.bastion_from_ssh.id
}

Пример: ссылка на вывод в другом модуле:

module "bastion" {
   source = "path/to/bastion/dir"
   // ... 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
}
person Alain O'Dea    schedule 22.06.2020