如何将默认 VPC 导入 CloudFormation 堆栈并使用 AWS CDK 重新创建它?
How to import default VPC into CloudFormation stack and recreate it with AWS CDK?
我想用我所有的网络资源创建一个 AWS CloudFormation 堆栈。所以我也想包括我的默认 VPC。我使用 AWS CDK 创建了我的堆栈,并希望使用 CDK 配置我的所有资源。
为了导入我的默认 VPC,我使用了管理控制台和堆栈操作“将资源导入堆栈”。我使用此模板导入我的默认 VPC:
Resources:
VPC:
Type: AWS::EC2::VPC
DeletionPolicy: Retain
Properties:
CidrBlock: 172.31.0.0/16
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
InstanceTenancy: default
导入向导需要 VPC ID,我使用了我的默认 VPC ID。导入成功后得到了一个和上面内容相同的栈的CloudFormation模板。
现在我想用 AWS CDK 重新创建我的默认 VCP。我不想使用 Vpc.fromLookup
或 fromVpcAttributes
。我想使用 AWS CDK 创建一个新的 VPC,这是我的默认 VPC。所以我写道:
const vpc = new ec2.Vpc(this, 'VPC', {
cidr: "172.31.0.0/16",
enableDnsSupport: true,
enableDnsHostnames: true,
defaultInstanceTenancy: DefaultInstanceTenancy.DEFAULT
});
但是当我调用 cdk diff
时它显示:
[-] AWS::EC2::VPC VPC orphan
[+] AWS::EC2::VPC VPC VPCXYZ12345
所以它想创建一个新的 VPC 而我导入的默认 VPC 是孤立的。
我也试过覆盖逻辑ID。所以它与我的默认 VPC 的 ID 匹配:
const cfnVpc = vpc.node.defaultChild as cdk.CfnResource;
cfnVpc.overrideLogicalId('vpc-abcd1234');
但 cdk diff
的输出与上面类似,但现在使用我的默认 VPC 的 VPC ID。
甚至可以将默认 VPC 导入 CloudFormation 堆栈并使用 AWS CDK 重新创建它吗?
您不能将非默认VPC 标记为默认VPC,也不能自行重构默认VPC。来自 docs:
You cannot restore a previous default VPC that you deleted, and you cannot mark an existing nondefault VPC as a default VPC.
您必须使用 AWS 控制台、SDK 或 CLI 专用调用 来创建默认 VPC:
虽然您保持堆栈名称相同,但导入的cloudformation 和cdk 生成的cloudformation 中vpc 资源的逻辑id 不同。 VPC 与 VPCXYZ12345。
这就是cdk diff显示删除和重建的原因。
理想情况下,我们可以这样做:
- 删除现有的 cloudformation
- 创建 cloudformation
cdk --no-version-reporting synth
- 从 cdk.out
中获取模板
- 在 cloudformation 控制台中导入它,就像您的常规模板一样。
这个过程应该可以帮助您将现有的 vpc 导入到 cdk 中。 是在 cdk 中导入 DynamoDB table 的类似答案。
我想用我所有的网络资源创建一个 AWS CloudFormation 堆栈。所以我也想包括我的默认 VPC。我使用 AWS CDK 创建了我的堆栈,并希望使用 CDK 配置我的所有资源。
为了导入我的默认 VPC,我使用了管理控制台和堆栈操作“将资源导入堆栈”。我使用此模板导入我的默认 VPC:
Resources:
VPC:
Type: AWS::EC2::VPC
DeletionPolicy: Retain
Properties:
CidrBlock: 172.31.0.0/16
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
InstanceTenancy: default
导入向导需要 VPC ID,我使用了我的默认 VPC ID。导入成功后得到了一个和上面内容相同的栈的CloudFormation模板。
现在我想用 AWS CDK 重新创建我的默认 VCP。我不想使用 Vpc.fromLookup
或 fromVpcAttributes
。我想使用 AWS CDK 创建一个新的 VPC,这是我的默认 VPC。所以我写道:
const vpc = new ec2.Vpc(this, 'VPC', {
cidr: "172.31.0.0/16",
enableDnsSupport: true,
enableDnsHostnames: true,
defaultInstanceTenancy: DefaultInstanceTenancy.DEFAULT
});
但是当我调用 cdk diff
时它显示:
[-] AWS::EC2::VPC VPC orphan
[+] AWS::EC2::VPC VPC VPCXYZ12345
所以它想创建一个新的 VPC 而我导入的默认 VPC 是孤立的。
我也试过覆盖逻辑ID。所以它与我的默认 VPC 的 ID 匹配:
const cfnVpc = vpc.node.defaultChild as cdk.CfnResource;
cfnVpc.overrideLogicalId('vpc-abcd1234');
但 cdk diff
的输出与上面类似,但现在使用我的默认 VPC 的 VPC ID。
甚至可以将默认 VPC 导入 CloudFormation 堆栈并使用 AWS CDK 重新创建它吗?
您不能将非默认VPC 标记为默认VPC,也不能自行重构默认VPC。来自 docs:
You cannot restore a previous default VPC that you deleted, and you cannot mark an existing nondefault VPC as a default VPC.
您必须使用 AWS 控制台、SDK 或 CLI 专用调用 来创建默认 VPC:
虽然您保持堆栈名称相同,但导入的cloudformation 和cdk 生成的cloudformation 中vpc 资源的逻辑id 不同。 VPC 与 VPCXYZ12345。
这就是cdk diff显示删除和重建的原因。
理想情况下,我们可以这样做:
- 删除现有的 cloudformation
- 创建 cloudformation
cdk --no-version-reporting synth
- 从 cdk.out 中获取模板
- 在 cloudformation 控制台中导入它,就像您的常规模板一样。
这个过程应该可以帮助您将现有的 vpc 导入到 cdk 中。