Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS-CDK:有没有办法通过输入参数传递vpc cidr?_Amazon Web Services_Aws Cdk - Fatal编程技术网

Amazon web services AWS-CDK:有没有办法通过输入参数传递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,

我试图将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, 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,因此查找在这里没有多大帮助。