在AWS CDK中组织安全组规则的最佳方式



对于我的示例,我有一个EKS集群、RDS数据库和一个VPN客户机端点,每个端点都有自己的安全组,我想在它们之间显式地定义出口/入口规则。

我定义了RDS栈中的数据库安全组,导入了EKS/VPNaws_ec2.SecurityGroups,然后定义了一个入口规则:

database_security_group.add_ingress_rule(
aws_ec2.Peer.security_group_id(eks_security_group.security_group_id),
aws_ec2.Port.tcp(5432)
)

等。这样做的问题是,如果我对需要替换的EKS堆栈进行更改,它会尝试删除数据库堆栈。我被迫注释掉入口规则,部署数据库堆栈,部署EKS堆栈,取消注释入口规则,并再次部署数据库堆栈。这似乎是一个不必要的序列(更不用说对于这些类型的资源来说它需要花费很长时间)。这适用于拥有自己的安全组的任何堆栈。

这里的最佳实践是什么?如何组织安全组规则,使一个栈对另一个栈的影响最小化?

在CDK中处理安全组的方法是根本不处理它们。

CDK具有所有IConnectable构造暴露在connectionsprop中的ec2.Connections类。允许构造之间连接的方式就是使用这个类。底层的安全组只是一个实现细节。

From the docs:

如果您在构造时没有指定安全组,则所有需要安全组的构造都会为您创建一个。在构造之后,您可以选择性地允许构造之间的连接,例如通过实例。连接对象。可以把它看作是"允许连接到您的实例",而不是"向安全组添加进入规则"。有关示例,请参阅库文档中的允许连接一节。

可以通过addIngressRule和addEgressRule直接操作安全组,但建议通过.connections对象进行突变。如果您以这种方式对两个具有安全组的构造进行对等,则将在两者中创建适当的规则。

你这样做的方式是将数据库结构(整个东西)作为prop传递给EKS堆栈。

然后你可以这样设置:

eks_cluster.connections.allow_to_default_port(database)

就是这样。

请记住,您必须在正确的堆栈中这样做,以避免循环引用。来自文档:

如果您试图将来自一个堆栈中的对等点的连接添加到另一个堆栈中的对等点,有时有必要确保您在特定堆栈中建立连接,以避免循环引用。如果堆栈之间没有其他依赖关系,那么在哪个堆栈中进行连接就无关紧要了,但如果存在现有的依赖关系(即stack1已经依赖于stack2),那么在依赖堆栈(即stack1)中进行连接就很重要了。

每当进行连接函数调用时,入口和出口安全组规则将被添加到调用对象所在的堆栈中。因此,如果您正在执行类似peer1.connections. allowfrom (peer2)的操作,那么安全组规则(入口和出口)将在peer1的堆栈中创建。

参考:https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2-readme.html允许连接

最新更新