如何在 Terraform 中将安全组添加为另一个安全组的入站规则

如何在 Terraform 中将安全组添加为另一个安全组的入站规则

我有一个 Terraform 代码库,它部署了一个私有 EKS 集群、一个堡垒主机和其他 AWS 服务。我还在 Terraform 中添加了一些安全组。其中一个安全组允许从我的家庭 IP 到堡垒主机的入站流量,以便我可以通过 SSH 连接到该节点。这个安全组称为bastionSG,它也运行良好。

但是,最初我无法从堡垒主机运行 kubectl,堡垒主机是我用来针对 EKS 集群节点执行 kubernetes 开发的节点。原因是我的 EKS 集群是私有的,只允许来自同一 VPC 中的节点的通信,我需要添加一个安全组,允许从堡垒主机到我的cluster control plane安全组 bastionSG 所在的节点的通信。

因此,我现在的例行工作是,一旦 Terraform 部署了所有内容,我就会找到自动生成的 EKS 安全组并bastionSG通过 AWS 控制台(UI)将我的入站规则添加到其中,如下图所示。

在此处输入图片描述

我不想通过 UI 来执行此操作,因为我已经在使用 Terraform 来部署我的整个基础设施。

我知道我可以像这样查询现有的安全组

data "aws_security_group" "selectedSG" {
  id = var.security_group_id
}

在这种情况下,假设selectedSGTerraform 完成应用过程后,EKS 会创建安全组。然后我想bastionSG向其添加一条入站规则,而不会覆盖自动添加的其他规则。

更新:> EKS 节点组

resource "aws_eks_node_group" "flmd_node_group" {
  cluster_name    = var.cluster_name
  node_group_name = var.node_group_name
  node_role_arn   = var.node_pool_role_arn
  subnet_ids      = [var.flmd_private_subnet_id]
  instance_types = ["t2.small"]

  scaling_config {
    desired_size = 3
    max_size     = 3
    min_size     = 3
  }

  update_config {
    max_unavailable = 1
  }

  remote_access {
    ec2_ssh_key = "MyPemFile"
    source_security_group_ids = [
      var.allow_tls_id,
      var.allow_http_id, 
      var.allow_ssh_id,
      var.bastionSG_id
     ]
  }

  tags = {
    "Name" = "flmd-eks-node"
  }
}

如上所示,EKS 节点组中有 bastionSG 安全组。我希望它允许从我的堡垒主机连接到 EKS 控制平面。

EKS 集群

resource "aws_eks_cluster" "flmd_cluster" {
  name     = var.cluster_name
  role_arn = var.role_arn

  vpc_config {
    subnet_ids =[var.flmd_private_subnet_id, var.flmd_public_subnet_id, var.flmd_public_subnet_2_id]
    endpoint_private_access = true
    endpoint_public_access = false
    security_group_ids = [ var.bastionSG_id]
  }
}

bastionSG_id是下面创建的安全组的输出,它作为变量传递到上面的代码中。

BastionSG 安全组

resource "aws_security_group" "bastionSG" {
  name        = "Home to bastion"
  description = "Allow SSH - Home to Bastion"
  vpc_id      = var.vpc_id

  ingress {
    description      = "Home to bastion"
    from_port        = 22
    to_port          = 22
    protocol         = "tcp"
    cidr_blocks      = [<MY HOME IP address>]
  }

  egress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }

  tags = {
    Name = "Home to bastion"
  }
}

答案1

您可以使用 Terraform AWS“aws_security_group_rule”扩展现有的安全组,它接受任意但必需的安全组 ID。请参阅:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group_rule

相关内容