gpt4 book ai didi

aws-cloudformation - AWS CDK参数错误: Value of property Parameters must be an object with String (or simple type) properties

转载 作者:行者123 更新时间:2023-12-03 07:22:30 26 4
gpt4 key购买 nike

更新

接受的答案如下 Victor是正确的解决方法。

我联系了 AWS Support,确认了该错误。他们意识到了这个问题,并将我链接到这两个链接以跟踪此案例。

... During my investigation and replication of the issue, I noticed that this issue seems to be with how CDK handles the VPCEndpoint resource as its parameters include a list of DNS entries with them.
This is a known issue with the resource:
https://github.com/aws/aws-cdk/issues/5897
https://github.com/aws/aws-cdk/issues/9488

在此之前,如果您遇到此问题,解决方案就在这里。


原始问题

我期望能够开箱即用地使用 Fn.select 和 Fn.split,但是下面的代码有一些非常奇怪的行为,想知道我是否在做一些意想不到的事情。

我希望输出包含声明的函数fn::Select [1, fn:split [ fn:select [0, getAttr [ Something ] ] ] ]

但实际上我看到的只是getAttr [something],这导致属性参数的值必须是具有String(或简单类型)属性的对象 部署期间

感谢任何帮助

这是重现错误的代码

#!/usr/bin/env node
import 'source-map-support/register';
import {App, aws_ec2, aws_lambda, Fn, NestedStack, NestedStackProps, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

const app = new App();

export class MainStack extends Stack {
constructor(scope: Construct, id: string, props: StackProps) {
super(scope, id, props);
new Nested1(this, 'first', {})
}
}
export class Nested1 extends NestedStack {
constructor(scope: Construct, id: string, props: NestedStackProps) {
super(scope, id, props);

const vpc = new aws_ec2.Vpc(this, 'vpc', {
subnetConfiguration: [{
cidrMask: 28,
name: 'private-test-bug',
subnetType: aws_ec2.SubnetType.PRIVATE_ISOLATED,
}]
})
const apiEndpoint = new aws_ec2.InterfaceVpcEndpoint(this, `apiEndpoint`, {
service: {
name: 'com.amazonaws.eu-central-1.execute-api',
port: 443,
},
vpc: vpc,
subnets: {
subnets: vpc.isolatedSubnets,
onePerAz: true
},
open: true,
privateDnsEnabled: false,
});
// BUG IS HERE
new Nested2(this, 'nested2', { VpcEndpoint: apiEndpoint }) // CDK should handle and parse the reference, but it dont
}
}

export interface Nested2StackProps extends NestedStackProps { VpcEndpoint: aws_ec2.InterfaceVpcEndpoint; }
export class Nested2 extends NestedStack {
constructor(scope: Construct, id: string, props: Nested2StackProps) {
super(scope, id, props);

const lambda = new aws_lambda.Function(this, 'lambda-function', {
code: aws_lambda.Code.fromInline(`exports.handler = (event, context) => { console.log(process.env.dns_name) }`),
handler: 'index.handler',
runtime: aws_lambda.Runtime.NODEJS_16_X,
environment: { dns_name: Fn.select(1, Fn.split(':', Fn.select(0, props.VpcEndpoint.vpcEndpointDnsEntries))) } // USAGE IS HERE
})
}
}

new MainStack (app, 'TestStack', {
env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },
});

最佳答案

简而言之,它看起来像是 CDK 中的一个错误。 CDK 尝试将数组作为参数发送到嵌套模板。相反,它应该连接数组并将其作为字符串传递。

我建议解决该问题。我将代码分成两部分。首先,我解释一下这个想法并展示一些代码片段。最后,我展示完整的解决方案。

我们在嵌套堆栈中定义参数,如下所示:

  const stack = new NestedStack(scope, id, {
parameters: {
VpcEndpointDnsEntries: props.VpcEndpointDnsEntries
},
})

在代码中,我们为此参数创建一个对象,并使用它来获取参数值。

  const endpoints = new CfnParameter(stack, 'VpcEndpointDnsEntries', {
type: 'List<String>',
description: 'List of entries.'
})

// Read the value:

const strings = endpoints.valueAsList

在最后一步中,我们几乎像往常一样将参数传递给嵌套堆栈,只是我们加入了字符串。

  createNestedStack(stack, 'NestedStack',
{ VpcEndpointDnsEntries: Fn.join(',', apiEndpoint.vpcEndpointDnsEntries) })

请注意,lambda 函数不起作用,它会引发运行时异常。否则,堆栈和嵌套堆栈将正常部署。

请在下面找到完整的代码。

抱歉,我现在真的很着急。我计划今晚修复语法并更新答案。

import { App, CfnParameter, Fn, NestedStack, Stack } from 'aws-cdk-lib'
import { env } from 'process'
import { InterfaceVpcEndpoint, Vpc } from 'aws-cdk-lib/aws-ec2'
import { Code, Function, Runtime } from 'aws-cdk-lib/aws-lambda'

function createMainStack (scope, id, props) {
const stack = new Stack(scope, id, props)

const vpc = Vpc.fromLookup(stack, 'Vpc', { vpcName: 'WarehousePrinters' })

const apiEndpoint = new InterfaceVpcEndpoint(stack, `ApiEndpoint`, {
service: {
name: 'com.amazonaws.eu-west-1.execute-api',
port: 443,
},
vpc,
subnets: { subnets: vpc.privateSubnets, onePerAz: true },
open: true,
privateDnsEnabled: false,
})

createNestedStack(stack, 'NestedStack', { VpcEndpointDnsEntries: Fn.join(',', apiEndpoint.vpcEndpointDnsEntries) })

return stack
}

function createNestedStack (scope, id, props) {
const stack = new NestedStack(scope, id, {
parameters: {
VpcEndpointDnsEntries: props.VpcEndpointDnsEntries
},
})

const endpoints = new CfnParameter(stack, 'VpcEndpointDnsEntries', {
type: 'List<String>',
description: 'List of entries.'
})

new Function(stack, 'LambdaFunction', {
code: Code.fromInline(`export function handler = () => console.log(env.dns_name)`),
handler: 'index.handler',
runtime: Runtime.NODEJS_16_X,
environment: {
dns_name: Fn.select(1, Fn.split(':', Fn.select(0, endpoints.valueAsList)))
}
})

return stack
}

const app = new App()
createMainStack(app, 'MainStack', {
env: { account: env.CDK_DEFAULT_ACCOUNT, region: env.CDK_DEFAULT_REGION }
})

关于aws-cloudformation - AWS CDK参数错误: Value of property Parameters must be an object with String (or simple type) properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73245986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com