【问题标题】:How to create VPC that can be shared across stacks?如何创建可以跨栈共享的 VPC?
【发布时间】:2019-09-05 19:12:04
【问题描述】:

我正在努力思考如何使用 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。我会将堆栈部署到相同的帐户和区域。

如何改变我的方法以实现我正在寻找的输出?我希望能够独立部署我的堆栈。

【问题讨论】:

  • 不确定这是否是您要查找的内容:我不熟悉 AWS CDK,但我使用 CloudFormation。在那里,您可以创建一个堆栈来创建 VPC 并执行导出值。在所有不同的堆栈中,您可以执行“importValue”来导入 VPC 并在多个堆栈中重用 VPC。只要其他堆栈正在使用它,您就无法创建创建 VPC 的堆栈。 docs.aws.amazon.com/cdk/api/latest/docs/…

标签: aws-cdk


【解决方案1】:

如果您打算在不同的堆栈中重用 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')

【讨论】:

  • 我会避免使用fromLookup,因为这会使应用程序环境特定。最好直接将 VPC 对象的引用传递给其他堆栈,这样可以使应用程序与环境无关。
【解决方案2】:

我尝试了 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2020-01-06
    • 2015-06-28
    相关资源
    最近更新 更多