如何创建可在堆栈之间共享的VPC?

时间:2019-08-23 09:50:08

标签: aws-cdk

我正在努力解决如何创建可重用的VPC,该VPC可使用AWS CDK在多个堆栈中使用。我希望能够为每个项目创建不同的堆栈,然后能够导入应分配给不同堆栈的VPC。我也想使用一个好的结构来创建它,在这里我可以在不同的时间部署不同的堆栈(这意味着:我不想一次部署所有堆栈)。

我尝试了以下方法,但是这将为每个堆栈创建一个新的VPC,这不是我想要实现的,而是我想一次创建我的VPC,然后如果它已经存在,它将简单地重用以前创建的VPC。

app.ts

import cdk = require('@aws-cdk/core');
import { Stack1 } from '../lib/stack1';
import { Stack2 } from '../lib/stack2';

const app = new cdk.App();

new Stack1(app, "Stack1");
new Stack2(app, "Stack2");

stack1.ts

import cdk = require('@aws-cdk/core');

import { Configurator } from './configurators/configurator'

export class Stack1 extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const configurator = new Configurator(scope, "Stack1");

    // later reuse vpc from configurator using configurator.vpc
  }
}

stack2.ts

import cdk = require('@aws-cdk/core');

import { Configurator } from './configurators/configurator'

export class Stack2 extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const configurator = new Configurator(scope, "Stack2");

    // later reuse vpc from configurator using configurator.vpc
  }
}

configurator.ts

import cdk = require('@aws-cdk/core');
import ec2 = require("@aws-cdk/aws-ec2");

export class Configurator {

  vpc: ec2.Vpc;

  constructor(scope: cdk.Construct, name: string) {
    this.vpc = new ec2.Vpc(scope, "MyVPC", {
      maxAzs: 3
    });
  }
}

完成后

cdk synth
cdk deploy Stack1
cdk deploy Stack2

这将创建2个VPC,并且不会像我想的那样重用1个VPC。我会将堆栈部署到相同的帐户和区域。

如何更改方法以实现所需的输出?我希望能够彼此独立地部署堆栈。

2 个答案:

答案 0 :(得分:6)

如果您打算在不同的堆栈中重复使用VPC,我建议将其放置在单独的堆栈中,因为您的VPC堆栈的生命周期与应用程序堆栈不同。

这就是我要做的。我希望你不要介意Python:)

首先,在VpcStack中定义您的VPC:

class VpcStack(core.Stack):
    def __init__(self, app: core.App, id: str, **kwargs) -> None:
        super().__init__(app, id, **kwargs)
        aws_ec2.Vpc(self, 'MyVPC', max_azs=3)

然后在另一个堆栈中查找它:

class Stack1(core.Stack):
    def __init__(self, app: core.App, id: str, **kwargs) -> None:
        super().__init__(app, id, **kwargs)
        # Lookup the VPC named 'MyVPC' created in stack 'vpc-stack'
        my_vpc = aws_ec2.Vpc.from_lookup(self, 'MyVPC', vpc_name=f'vpc-stack/MyVPC')
        # You can now use the VPC in ECS cluster, etc.

这将是您的cdk_app.py

app = core.App()
vpc = VpcStack(app, 'vpc-stack')
stack1 = Stack1(app, 'stack1')

答案 1 :(得分:1)

我尝试了0x32e0edfb答案,但遇到了一些问题。 所以我这样修复。

VPC堆栈

class VpcStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        self.eks_vpc = ec2.Vpc(self, 'eks-vpc',
            cidr='10.1.0.0/16',
            max_azs=2
        )

将VPC共享到其他堆栈

class EksClusterStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, props: ec2.Vpc, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        cluster = eks.Cluster(self, 'eks-control-plane',
            vpc=props,
            default_capacity=0
        )

然后是app.py个文件

app = core.App()

vpc_stack = VpcStack(app, 'vpc-stack')
eks_cluster_stack = EksClusterStack(app, 'eks-cluster', vpc_stack.eks_vpc)

eks_cluster_stack.add_dependency(vpc_stack)

app.synth()

from_lookup在现有的VPC上要好得多。

所以我选择使用share-vpcs共享VPC信息。

from_lookup仅调用一次API-然后,数据被缓存在cdk.context.json文件中,该文件应提交给源代码管理

那个问题是当我重新创建相同的VPC时。

cdk.context.json尚未更新为最新版本。因此,当我使用from_lookup时,始终会获得旧的vpc-id。

我需要使用cdk context --clear命令,然后再次部署。 cdk.context.json将获得最新版本的vpc-id。

最后,它可以在from_lookup方法上正常工作。

参考: https://github.com/aws/aws-cdk/blob/master/packages/%40aws-cdk/aws-eks/test/integ.eks-kubectl.lit.ts

https://docs.aws.amazon.com/cdk/latest/guide/context.html