动态命名CDK资源



我正在使用CDK从yaml模板文件创建一些基础设施。某些资源需要多个实例。我认为编写一个函数将是创建资源的多个实例的最简单方法

功能

def create_vpn_connection_route(cidr_count, destination_cidr):
vpn_connection_route = aws_ec2.CfnVPNConnectionRoute(
self,
f'vpn_connection_route{cidr_count}',
vpn_connection_id=vpn_connection.ref,
destination_cidr_block=destination_cidr
)
return vpn_connection_route

然后我在其上循环并生成"0";Id";通过像一样在destination_cidrs上枚举

for cidr_count, destination_cidr in enumerate(tenant_config['vpn_config'][0]['destination_cidrs']):
create_vpn_connection_route(cidr_count, destination_cidr)

这是我的yaml 中的内容

vpn_config:
- private_ip:
- 10.1.195.201/32
- 10.1.80.20/32
- 10.1.101.8/32

CDK有更好的方法吗?我可以为资源动态生成Id吗?

干杯

我不知道它会让你的代码变得更好,但你可以使用构造而不是函数。

class VpnConnectionRoute(core.Construct):
def __init__(self, scope, id_, vpn_connection, destination_cidr):
super().__init__(scope, id_)
self.vpn_connection_route = aws_ec2.CfnVPNConnectionRoute(
self,
'vpn_connection_route',
vpn_connection_id=vpn_connection.vpn_id,
destination_cidr_block=destination_cidr
)
# ...
for cidr_count, destination_cidr in enumerate(tenant_config['vpn_config'][0]['destination_cidrs']):
VpnConnectionRoute(self, f"route{cidr_count}", vpn_connection, destination_cidr)
VpnConnectionRoute(self, f"route{cidr_count}", vpn_connection, destination_cidr)
VpnConnectionRoute(self, f"route{cidr_count}", vpn_connection, destination_cidr)

CDK将根据构造和您的名称自动命名您的资源。所以最终结果看起来像:

"route1vpnconnectionrouteAE1C11A9": {
"Type": "AWS::EC2::VPNConnectionRoute",
"Properties": {
"DestinationCidrBlock": "10.1.195.201/32",
"VpnConnectionId": {
"Ref": "Vpn6F669752"
}
},
"Metadata": {
"aws:cdk:path": "app/route1/vpn_connection_route"
}
},

您也可以将destination_cidr放在您的路线名称中。CDK将自动为您删除所有不支持的字符。

for destination_cidr in tenant_config['vpn_config'][0]['destination_cidrs']:
aws_ec2.CfnVPNConnectionRoute(
self,
f'VPN Connection Route for {destination_cidr}',
vpn_connection_id=vpn_connection.vpn_id,
destination_cidr_block=destination_cidr
)

这里的最佳解决方案可能取决于当这些地址更改时您希望发生什么。对于这种特定的资源类型,名称或值的任何更改都需要替换。因此,在值发生变化时保持名称的一致性可能并不重要。

最新更新