Amazon web services AWS-CDK:有没有办法通过输入参数传递vpc cidr?
我试图将vpc cidr作为输入参数传递,如下所示:Amazon web services AWS-CDK:有没有办法通过输入参数传递vpc cidr?,amazon-web-services,aws-cdk,Amazon Web Services,Aws Cdk,我试图将vpc cidr作为输入参数传递,如下所示: import { Stack, StackProps, Construct, CfnParameter } from '@aws-cdk/core'; import { Vpc, SubnetType } from '@aws-cdk/aws-ec2'; export class VpcStructureCdkStack extends Stack { constructor(scope: Construct, id: string,
import { Stack, StackProps, Construct, CfnParameter } from '@aws-cdk/core';
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';
export class VpcStructureCdkStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// VPC CIDR as input parameter
const vpcCidr = new CfnParameter(this, 'vpcCidr', {
type: 'String',
description: 'Please enter the IP range (CIDR notation) for this VPC',
allowedPattern: '((\d{1,3})\.){3}\d{1,3}/\d{1,2}'
})
// The code that defines your stack goes here
new Vpc(this, 'VPC', {
maxAzs: 3,
cidr: vpcCidr.valueAsString,
subnetConfiguration: [
{
name: 'App',
subnetType: SubnetType.PRIVATE,
cidrMask: 24
},
...
但是得到以下错误:
Error: 'cidr' property must be a concrete CIDR string, got a Token (we need to parse it for automatic subdivision)
使用环境变量时出现相同错误
有没有办法不硬编码vpc cidr?来自以下文档:
CFNPareter实例通过令牌将其值公开给AWS CDK应用程序。
与所有令牌一样,参数的令牌在合成时解析,但它解析为对AWS CloudFormation模板中定义的参数的引用,该引用将在部署时解析,而不是解析为具体值。
[…]通常,我们建议不要在AWS CDK中使用AWS CloudFormation参数
尤其是最后一句话是至关重要的
你现在怎么解决
正如您已经说过的:通过编程语言使用环境变量。
我不知道你使用环境变量的方法,因为你没有展示它。
让我给你举个例子
//文件:lib/your_stack.ts
导出类VpcStructureCdkStack扩展堆栈{
构造函数(作用域:Construct,id:string,props?:StackProps){
超级(范围、id、道具);
//从环境中读取值。
//显然,您必须在调用任何cdk命令之前设置或传递它
const vpcCidr=process.env.VPC_CIDR;
新专有网络(本“专有网络”{
马克萨兹:3,
//通过它
cidr:vpcCidr,
子网配置:[
{
名称:“应用程序”,
subnetType:subnetType.PRIVATE,
西德马克:24
},
// ...
]
}
}
}
不过,这只是将可配置值导入CDK的一种方法
更好且可调试的方法是在中设置所有动态/用户/域值。
最好在cdk.json
中实现您自己的价值观。如果它还不存在,请创建它,不要忘记将其放入Git(或您选择的VCS)中
{
// ...
背景:{
// ...
“VpcCidr”:“10.0.0.0/8”,
}
}
如果cdk.json
方法也不够,您还有另一个选择:
通过-c/--context-vpcCidr=10.0.0.0/8将其作为参数传递给cdk-synth/deploy
。
然而,这更难调试,因为它不一定要进行版本控制
在堆栈中(IMHO执行此操作的最佳位置),可以调用以下方法从上下文检索实际值:
const vpcCidr=this.node.tryGetContext(“vpcCidr”);
并将其传递给您的VPC构造函数。创建您自己的VPC或导入现有的VPC。对于第二个解决方案,有fromLookup()
,它将找到合适的VPC(通过标签、名称或其他VPCLookupOptions
)及其CIDR:
我通过读取外部配置文件做了类似的事情
import*作为cdk从“@aws cdk/core”导入;
从“@aws-cdk/aws-ec2”导入{Vpc,SubnetType}”;
导入fs=要求(“fs”);
导出类ExampleStack扩展了cdk.Stack{
构造函数(作用域:cdk.Construct,id:string,props?:cdk.StackProps){
超级(范围、id、道具);
const configJson=fs.readFileSync(
“config/”+this.account+“.json”,
“utf8”
);
让config=JSON.parse(configJson);
const vpc=vpc.fromLookup(此为“vpc”{
vpcId:config.vpcId
});
}
}
const app=new cdk.app();
新的ExampleStack(应用程序“ExampleStack”{
环境:{
账户:process.env.CDK\u默认账户,
区域:process.env.CDK_默认区域,
}});
文件位置为./config/123123.json
{
“vpcId”:“123123”
}
工作得很好。非常感谢。OP希望创建一个具有可变CIDR的VPC,因此查找在这里没有多大帮助。