首页 > 解决方案 > 如何使用 importValue() 从现有 Cloudformation 堆栈中检索数组

问题描述

我正在尝试将现有 CloudFormation 堆栈中的子网列表导入我正在部署的堆栈中。这些值以逗号分隔的字符串形式存储在现有堆栈的输出中,例如

subnet-1, subnet-2, subnet-3

我尝试使用的导入代码是:

const privateSubnets = Fn.importValue(PrivateSubnets).split(',');

我希望我可以只使用 .split(','),但是当我稍后在 VPC 声明中尝试使用 privateSubnets 变量时出现错误:

const myVpc = Vpc.fromVpcAttributes(this, 'Vpc', {
      vpcId: vpcId,
      availabilityZones: [0, 1, 2].map(i => Fn.select(i, Fn.getAzs())),
      privateSubnetIds: privateSubnets,
      publicSubnetIds: publicSubnets
    });

我已经四处寻找,但看起来我无法做到这一点。正如您在上面看到的,我正在导入可用区域,然后将它们解析出来,但是我无法找到一种与 importValue() 函数一起使用的方法。

标签: typescriptamazon-web-servicesaws-cdk

解决方案


Fn.importValue返回一个Ref - 所以为了使用 ref 中的值,您需要使用内部函数

const privateSubnets = Fn.split(',', Fn.importValue(PrivateSubnets));


const myVpc = Vpc.fromVpcAttributes(this, 'Vpc', {
    vpcId: vpcId,
    availabilityZones: [0, 1, 2].map(i => Fn.select(i, Fn.getAzs())),
    privateSubnetIds: [Fn.select(0, privateSubnets), Fn.select(1, privateSubnets), Fn.select(2, privateSubnets)],
    publicSubnetIds: publicSubnets
});

不幸的是,没有一个好的方法可以知道 Ref 的长度并对其进行迭代以正确地将 privateSubnetsId 映射到 ImportValue。

对于您来说,使用 SSM 参数而不是 CloudFormation 导出来存储/传递私有子网 ID 的值可能是一个更清晰的长期选择。因为您可以将 SSM 参数的字符串值加载到 CDK 堆栈中并使用它。


推荐阅读