如果您在一个可部署的 cdk-app 中拥有堆栈,则可以通过使其从外部/非私有访问来从堆栈中访问属性值。
我建议做的是保留它readonly,这样它就不能从堆栈外部重新初始化。
// file: ./lib/first-stack.ts
// import statements
export class FirstStack extends Stack {
readonly vpc: IVpc;
constructor(...) {
// setup
this.vpc = new Vpc(this, "VPC", {...});
}
}
在依赖栈中,可以通过(自定义)props 传递。
// file: ./lib/second-stack.ts
export interface SecondStackProps extends StackProps {
importedVpc: IVpc;
}
export class SecondStack extends Stack {
constructor(scope: cdk.Construct, id: string, props: SecondStackProps) {
super(scope, id, props);
const importedVpc = props.importedVpc;
// do sth. with your imported resource
}
}
您可能会问为什么这样会起作用...?
它之所以有效,是因为 CDK 会生成资源 ID,并且在合成阶段它可以将资源令牌放入生成的模板中。
当您分离 cdk-apps / 堆栈部署时,这不起作用,因为 CDK 在 cdk-synth 期间无法解析(现有)资源 ID 令牌。
有了这个,你需要有另一种方法:
// file: ./lib/first-stack-separated-deployment.ts
// import statements
export class FirstStackSeparatedDeployment extends Stack {
cfnVpcId: CfnOutput;
constructor(...) {
// setup
const vpc = new Vpc(this, "VPC", {...});
this.cfnVpcId= new cdk.CfnOutput(this, "FirstStackCfnVpcId", {
value: vpc.vpcId,
exportName: "UniqueNameForYourVpcId"
});
}
}
在需要已部署资源的另一个堆栈中,您执行以下操作:
// file: ./lib/second-stack-separated-deployment.ts
export class SecondStackSeparatedDeployment extends Stack {
constructor(...) {
// setup
const vpcId = Fn.importValue("UniqueNameForYourVpcId")
const importedVpc = ec2.Vpc.fromVpcAttributes(this, "ImportedVpc", {
vpcId: vpcId,
availabilityZones: [this.region],
})
// proceed further...
}
}
基本上,您从CfnOutput 构造中获取exportName 作为标识符并通过核心Fn.importValue 导入它。
使用这种方法,已经需要部署第一个堆栈。