我正在努力解决如何创建可重用的VPC的问题,该VPC可使用AWS CDK跨多个堆栈使用。我希望能够为每个项目创建不同的堆栈,然后能够导入应分配给不同堆栈的VPC。我还想使用一个良好的结构来创建它,在这里我可以在不同的时间部署不同的堆栈(这意味着:我不想一次部署所有堆栈)。
我尝试了以下方法,但是这将为每个堆栈创建一个新的VPC,这不是我想要实现的,而是我想一次创建我的VPC,然后如果已经存在,它将简单地重用先前创建的VPC。
应用程序
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");
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
配置器
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
});
}
}
Run Code Online (Sandbox Code Playgroud)
做完之后
cdk synth
cdk deploy Stack1
cdk deploy Stack2
Run Code Online (Sandbox Code Playgroud)
这将创建2个VPC,而不会像我想的那样重用1个VPC。我将堆栈部署到相同的帐户和区域。
如何更改我的方法以获得所需的输出?我希望能够彼此独立地部署堆栈。
如果您打算在不同的堆栈中重用VPC,建议您将其放在单独的堆栈中,因为VPC堆栈的生命周期与应用程序堆栈的生命周期不同。
这就是我要做的。我希望你不要介意Python :)
首先,在中定义您的VPC VpcStack:
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)
Run Code Online (Sandbox Code Playgroud)
然后在另一个堆栈中查找:
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.
Run Code Online (Sandbox Code Playgroud)
这将是您的cdk_app.py:
app = core.App()
vpc = VpcStack(app, 'vpc-stack')
stack1 = Stack1(app, 'stack1')
Run Code Online (Sandbox Code Playgroud)
我尝试了 0x32e0edfb 答案并遇到了一些问题。所以我是这样修复的。
专有网络堆栈
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
)
Run Code Online (Sandbox Code Playgroud)
将 VPC 共享给其他 Stack
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
)
Run Code Online (Sandbox Code Playgroud)
然后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()
Run Code Online (Sandbox Code Playgroud)
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
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |