Amazon web services 如何创建AWS安全组并在不同的.tf文件中使用它?

Amazon web services 如何创建AWS安全组并在不同的.tf文件中使用它?,amazon-web-services,amazon-ec2,terraform,aws-security-group,Amazon Web Services,Amazon Ec2,Terraform,Aws Security Group,正如标题所说,如果我使用terraform/aws/layers/bastion/main.tf创建一个EC2实例,我知道我也可以在同一个main.tf文件中创建一个安全组供bastion实例使用,但是如果我想创建一个可以在不同文件中使用的安全组呢 例如,如果terraform/aws/layers/worker/main.tf需要使用与bastion/main.tf相同的安全组,我该怎么做 bastion/main.tf provider "aws" { regi

正如标题所说,如果我使用terraform/aws/layers/bastion/main.tf创建一个EC2实例,我知道我也可以在同一个main.tf文件中创建一个安全组供bastion实例使用,但是如果我想创建一个可以在不同文件中使用的安全组呢

例如,如果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"
}
您可以使用“模块”将共享资源分组,然后从.tf文件中调用它们


另一种选择是,如果可行,在生成所需安全组的.tf文件中,输出其所需属性,如ID。使用S3后端存储此堆栈的tfstate。现在,在需要此安全组的其他堆栈中,使用tfstate作为数据获取该安全组的ID。

在模块中声明要公开和使用的安全组ID的输出,并在其他模块中使用:

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
}

由于没有提供其他TF配置,这个问题太过宽泛,无法回答,因此我将链接到相关文档,说明如何进行一般性操作:这是指向我原始问题的链接:我使用了模块,但有人在回复中建议创建此模块。因此,您将单资源模块重构为该模块,这很好。然而,我的意见仍然有效:问题太广泛,无法按原样回答,因此请使用所要求的信息进行更新,或者使用我提供的文档继续前进。还要注意的是,同一个配置文件或不同的配置文件在您的情况下没有什么不同。嗨,谢谢您回复我-自从发布后,我改变了一些事情,并使其正常工作,尽管遇到了一个不同的问题,我相信这可能是由于Terraform Cloud在每个工作区都有不同的状态文件。。您是否介意快速浏览一下,看看是否有任何建议/解决方法?感谢您的回复,我正在使用terraform安全组模块,但无法使输出正常工作。。terraform/aws/global/vpc/security_groups.tf中的原始帖子我已经创建了一个安全组,然后我在terraform/aws/layers/bastion/main.tf中使用[${module.vpc.bastion sg}]引用它,但不是使用已经创建的sg的输出,而是尝试再次创建安全组?