繁体   English   中英

AWS CDK。 如何将第一个堆栈的 `id` 传递给第二个堆栈

[英]AWS CDK. How to pass `id` of first stack to second stack

我有一个具有多个堆栈的项目,但具有通用的stacks.ts文件。

  • 我的 1 个堆栈创建了一个 VPC
  • 我的 2 堆栈创建了一个 ECS

堆栈vpc.tf

export class stack-vpc extends Stack {
   constructor(scope: Construct, id: string, props?: props) {
       super(scope, id, props);
       new ec2.Vpc(this, 'dev-vpc', {
           cidr: "10.0.0.0/16",
           vpcName: "dev-vpc"
       })
   }
}

堆栈ecs.tf

export interface Istack-ecs extends StackProps {
   vpc: ec2.Vpc;
}


export class stack-ecs extends Construct {
   constructor(scope: Construct, id: string, props: Istack-ecs) {
       super(scope, id);
       new ecs.Cluster(this, "fargate", {
           vpc: props.vpc,
           clusterName: "test",
           enableFargateCapacityProviders: true
       });
   }
}

这是stacks.ts文件

const app = new cdk.App();
const vpc = new stack-vpc(app, "Dev_VPC_CF", props);
const ecs = new stack-ecs(app, "Dev_ECS_CF", props);

vpc的创建没有任何问题,但是一旦我将 ecs 放入我的堆栈中,cdk 就会给我错误:

[Error at /stack-ecs] Could not find any VPCs matching {"account":"__--__","region":"eu-central-1",
"filter":{"tag:Name":"stack-vpc","isDefault":"false"},
"returnAsymmetricSubnets":true,
"lookupRoleArn":"arn:aws:iam::__--__:role/cdk-hnb659fds-lookup-role-__--__-eu-central-1"}

cdk.context.json正在从我的 aws 凭据中检索正确的值,所以我不能责怪身份验证,所以我的问题我需要以某种方式等到一个堆栈给我一个 output,这样我就可以在我的其他堆栈中使用它

fromLookup方法用于引用现有的已部署资源。 这不是你想要的。 相反,使用 Typescript 语言功能在堆栈内和堆栈之间传递构造。 正如@gshpychka 在评论中解释的那样,有几种 CDK 模式:

对于一个简单的应用程序,具有 Vpc 和 Ecs 资源的单个堆栈是一个很好的方法 cdk-examples repo 有几个这样的带有 Vpc 的 ECS 示例

export class MySingleStack extends Stack {
  constructor(scope: Construct, id: string, props?: props) {
    super(scope, id, props);
    const vpc = new ec2.Vpc(this, 'dev-vpc', {
      cidr: '10.0.0.0/16',
      vpcName: 'dev-vpc',
    });

    const cluster = new ecs.Cluster(this, 'Ec2Cluster', { vpc });
  }
}

或者,在同一应用程序的堆栈之间传递 Vpc 引用。 VpcStack 导出一个 Vpc。 EcsStack 的 props 应该扩展cdk.StackProps ,添加一个vpc: ec2.Vpc属性。 vpc 从 VpcStack 导出并作为 prop 传递给 EcsStack:

// vpc.ts
export class VpcStack extends Stack {
  readonly vpc: ec2.Vpc;

  constructor(scope: Construct, id: string, props?: props) {
    super(scope, id, props);
    this.vpc = new ec2.Vpc(this, 'dev-vpc', {
      cidr: '10.0.0.0/16',
      vpcName: 'dev-vpc',
    });
  }
}


// stacks.ts
const app = new cdk.App();
const { vpc } = new VpcStack(app, 'Dev_VPC_CF', props);
new EcsStack(app, 'Dev_ECS_CF', { ...props, vpc });

正如@fedonev所说

fromLookup 方法用于引用现有的已部署资源。

所以你可以这样做:

  1. 您的vpc应该导出ec2.Vpc
  2. Construct在您的情况下不起作用,您需要从cdk.Stack扩展
  3. 因为你的ecs接口Istack-ecs已经在期待一个vpc
const app = new cdk.App();
const your_vpc = new stack-vpc(app, "Dev_VPC_CF", props);
const your_ecs = new stack-ecs(app, "Dev_ECS_CF", {
    vpc: your_vpc.vpc // As your props expects one single value
});
your_ecs.addDependency(your_vpc); // Guarantees That your `vpc` will be created firstly
app.synth();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM