如何在AWS CDK中导入现有的VPC?

39

嗨,我正在使用 AWS CDK。我试图获取现有的非默认 VPC。我尝试了以下选项。

vpc = ec2.Vpc.from_lookup(self, id = "VPC", vpc_id='vpcid', vpc_name='vpc-dev')

这导致以下错误

[Error at /LocationCdkStack-cdkstack] Request has expired.
[Warning at /LocationCdkStack-cdkstack/TaskDef/mw-service] Proper policies need to be attached before pulling from ECR repository, or use 'fromEcrRepository'.
Found errors

我尝试过的另一种方法是

vpc = ec2.Vpc.from_vpc_attributes(self, 'VPC', vpc_id='vpc-839227e7', availability_zones=['ap-southeast-2a','ap-southeast-2b','ap-southeast-2c'])
这导致了
[Error at /LocationCdkStack-cdkstack] Request has expired.
[Warning at /LocationCdkStack-cdkstack/TaskDef/mw-service] Proper policies need to be attached before pulling from ECR repository, or use 'fromEcrRepository'.
Found errors

我尝试的另一种方法是

vpc = ec2.Vpc.from_lookup(self, id="VPC", is_default=True) // 这将获取默认 VPC 并且可以工作

有人能帮我在 AWS CDK 中获取非默认 VPC 吗?任何帮助都将不胜感激。谢谢

4个回答

68

请查看aws_cdk.aws_ec2文档CDK运行时上下文

如果您的VPC是在CDK应用程序之外创建的,您可以使用Vpc.fromLookup()。CDK CLI将在堆栈的区域和帐户中搜索指定的VPC,并导入子网配置。可以通过VPC ID进行查找,但更灵活的方法是通过搜索VPC上的特定标签来进行查找。

用法:

# Example automatically generated. See https://github.com/aws/jsii/issues/826
from aws_cdk.core import App, Stack, Environment
from aws_cdk import aws_ec2 as ec2

# Information from environment is used to get context information
# so it has to be defined for the stack
stack = MyStack(
    app, "MyStack", env=Environment(account="account_id", region="region")
)

# Retrieve VPC information
vpc = ec2.Vpc.from_lookup(stack, "VPC",
    # This imports the default VPC but you can also
    # specify a 'vpcName' or 'tags'.
    is_default=True
)

用相关的例子进行更新:

vpc = ec2.Vpc.from_lookup(stack, "VPC",
    vpc_id = VPC_ID
)

使用 TypeScript 示例进行更新:

import ec2 = require('@aws-cdk/aws-ec2');
const getExistingVpc = ec2.Vpc.fromLookup(this, 'ImportVPC',{isDefault: true});

更多信息请查看此处。


嗨,感谢您的回答。VPC是在CDK应用程序之外创建的,这是非默认VPC。from_lookup用于获取默认VPC,对吗? - Niranjan
然后只需将 is_default 更改为 False 并提供 vpcName - Amit Baranes
vpc = ec2.Vpc.from_lookup(self, id="VPC", vpc_name='vpc-dev', is_default=False) 这个对我来说没有起作用。是的,我的CDK是用Python编写的。 - Niranjan
1
@AmitBaranes刚刚更新了答案并添加了额外的信息。请随意查看并希望它能帮助其他人。 - Romain
1
请注意,不设置isDefault与将其设置为false(或true)是不同的。我可以根据名称查找我的非默认VPC而不会出现错误,但返回的ID是随机的(不是正确的ID)。如果我将isDefault设置为false,则会给我正确的ID;如果我将其设置为true,则会抛出错误,告诉我这不是我的默认VPC。 - Michael
显示剩余3条评论

4

对于AWS CDK v2v1(最新版),您可以使用以下内容:

// You can either use vpcId OR vpcName and fetch the desired vpc
const getExistingVpc = ec2.Vpc.fromLookup(this, 'ImportVPC',{
      vpcId: "VPC_ID",
      vpcName: "VPC_NAME"
});

-1

如果很容易,请在您的评论中直接写下答案,而不是链接到可能随时消失或更改的另一页。 - Samuel Lindblom

-1

这是一个简单的例子

//get VPC Info form AWS account, FYI we are not rebuilding we are referencing 
const DefaultVpc = Vpc.fromVpcAttributes(this, 'vpcdev', {
    vpcId:'vpc-d0e0000b0',
    availabilityZones: core.Fn.getAzs(),
    privateSubnetIds: 'subnet-00a0de00',
    publicSubnetIds: 'subnet-00a0de00'
});

        const yourService = new lambda.Function(this, 'SomeName', {
        code: lambda.Code.fromAsset("lambda"),
        handler: 'handlers.your_handler',
        role: lambdaExecutionRole,
        securityGroup: lambdaSecurityGroup,
        vpc: DefaultVpc,
        runtime: lambda.Runtime.PYTHON_3_7,
        timeout: Duration.minutes(2),
    });

4
你正在硬编码VPC ID,这不是问题所要求的! - Ajak6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接