AWS CDK 如何处理假设 return 列表而不是字符串的 Fn.getAtt
AWS CDK How to handle Fn.getAtt that supposes to return list instead of string
我有一个 AWS::EC2::VPCEndpoint 资源类型,我想获取它的 DnsEntries 值,根据 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#aws-resource-ec2-vpcendpoint-return-values 这是一个 DNS 条目列表。我希望能够 select 列表中的第一项,所以我尝试了这样的操作:
const vpcEndpoint = new ec2.CfnVPCEndpoint(this, "vpcendpoint", {
serviceName: "com.amazonaws.vpce.us-west-2.vpce-svc-xxxxxx",
vpcId: "vpc-123",
privateDnsEnabled: false,
subnetIds: ["subnet-123"],
vpcEndpointType: "Interface",
});
const fisrtDnsEntry = cdk.Fn.select(0, cdk.Fn.getAtt(vpcEndpoint.logicalId, "DnsEntries"))
这不起作用,因为 Fn.select
需要一个字符串数组,但是 Fn.getAtt
returns IResolvable
并且只有 toString()
方法。
知道我还能做什么吗?
关于这个有一个未解决的问题 - https://github.com/aws/aws-cdk/issues/3627。
目前,您可以使用以下代码片段:
const firstEntry = cdk.Fn.select(0, vpcEndpoint.attrDnsEntries);
const entryParts = cdk.Fn.split(':', firstEntry);
const primaryDNSName = cdk.Fn.select(1, entryParts);
new cdk.CfnOutput(this, 'primaryDNSName', { value: primaryDNSName });
CDK 输出:
UI 输出:
如果您确定 GetAtt 会 return 一个列表,您只需要让 TypeScript 相信它是安全的。您可以使用 core.Token.asList()
:
const firstDnsEntry = cdk.Fn.select(
0,
core.Token.asList(
cdk.Fn.getAtt(vpcEndpoint.logicalId, "DnsEntries")
)
)
原来在这个问题上发现了这个技巧:https://github.com/aws/aws-cdk/issues/8284
我有一个 AWS::EC2::VPCEndpoint 资源类型,我想获取它的 DnsEntries 值,根据 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#aws-resource-ec2-vpcendpoint-return-values 这是一个 DNS 条目列表。我希望能够 select 列表中的第一项,所以我尝试了这样的操作:
const vpcEndpoint = new ec2.CfnVPCEndpoint(this, "vpcendpoint", {
serviceName: "com.amazonaws.vpce.us-west-2.vpce-svc-xxxxxx",
vpcId: "vpc-123",
privateDnsEnabled: false,
subnetIds: ["subnet-123"],
vpcEndpointType: "Interface",
});
const fisrtDnsEntry = cdk.Fn.select(0, cdk.Fn.getAtt(vpcEndpoint.logicalId, "DnsEntries"))
这不起作用,因为 Fn.select
需要一个字符串数组,但是 Fn.getAtt
returns IResolvable
并且只有 toString()
方法。
知道我还能做什么吗?
关于这个有一个未解决的问题 - https://github.com/aws/aws-cdk/issues/3627。
目前,您可以使用以下代码片段:
const firstEntry = cdk.Fn.select(0, vpcEndpoint.attrDnsEntries);
const entryParts = cdk.Fn.split(':', firstEntry);
const primaryDNSName = cdk.Fn.select(1, entryParts);
new cdk.CfnOutput(this, 'primaryDNSName', { value: primaryDNSName });
CDK 输出:
UI 输出:
如果您确定 GetAtt 会 return 一个列表,您只需要让 TypeScript 相信它是安全的。您可以使用 core.Token.asList()
:
const firstDnsEntry = cdk.Fn.select(
0,
core.Token.asList(
cdk.Fn.getAtt(vpcEndpoint.logicalId, "DnsEntries")
)
)
原来在这个问题上发现了这个技巧:https://github.com/aws/aws-cdk/issues/8284