对于我的示例,我有一个 EKS 集群、RDS 数据库和一个 VPN 客户端端点,每个端点都有自己的安全组,我希望在这些安全组之间显式定义出口/入口规则。
我在RDS堆栈中定义数据库安全组,导入EKS/VPNaws_ec2.SecurityGroup
s,然后定义入口规则:
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 有ec2.Connections
类所有IConnectable
构造暴露在connections
支柱。允许构造之间连接的方式是使用该类。底层的安全组只是一个实现细节。
来自docs https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.SecurityGroup.html:
如果您在构造时未指定安全组,则所有需要安全组的构造都会为您创建一个。构建后,您可以通过(例如)instance.connections 对象有选择地允许与构造之间的连接。将其视为“允许连接到您的实例”,而不是“向安全组添加入口规则”。有关示例,请参阅库文档中的允许连接部分。
可以通过 addIngressRule 和 addEgressRule 直接操作安全组,但建议通过 .connections 对象进行更改。如果您以这种方式将两个构造与安全组对等,则将在两者中创建适当的规则。
执行此操作的方法是将数据库构造(整个事物)作为 prop 传递给 EKS 堆栈。
然后你可以这样设置:
eks_cluster.connections.allow_to_default_port(database)
就是这样。
请记住,您必须在正确的堆栈中执行此操作以避免循环引用。来自docs https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2-readme.html#cross-stack-connections:
如果您尝试添加从一个堆栈中的对等点到不同堆栈中的对等点的连接,有时需要确保在特定堆栈中建立连接以避免循环引用。如果堆栈之间没有其他依赖关系,那么在哪个堆栈中进行连接并不重要,但如果存在现有依赖关系(即 stack1 已经依赖于 stack2),那么在依赖堆栈中建立连接就很重要(即 stack1 已经依赖于 stack2)。堆栈1)。
每当您进行连接函数调用时,入口和出口安全组规则都会添加到调用对象所在的堆栈中。因此,如果您正在执行类似peer1.connections.allowFrom(peer2)的操作,则安全组规则(入口和出口)将在peer1 的堆栈中创建。
参考:https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2-readme.html#allowing-connections https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2-readme.html#allowing-connections
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)