我有一个相当简单的任务,无法使用 AWS CDK 完成:创建子网并使用现有 VPC 在其中启动实例。
现有的VPC是我使用
cdk migrate
命令获取的CfnVpc。这是:
class Lab(Stack):
@property
def vpc(self) -> ec2.CfnVPC:
return self._vpc
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(
scope, construct_id, description="Nat instance with two subnets", **kwargs
)
self._vpc = ec2.CfnVPC(
self,
"VPC",
enable_dns_support=True,
enable_dns_hostnames=True,
cidr_block=subnetConfig["VPC"]["CIDR"],
tags=[
{
"key": "Application",
"value": self.stack_name,
},
{
"key": "Network",
"value": "PublicA",
},
],
)
这是我的新资源:
class MyResources(Lab):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
vpc = ec2.Vpc.from_lookup(
self, "L2VPC", tags={"aws:cloudformation:logical-id": "VPC"}
)
publicSubnetB = ec2.Subnet(
self,
"PublicSubnetB",
availability_zone="us-east-1b",
cidr_block="10.0.2.0/24",
vpc_id=vpc.vpc_id,
)
cdk.Tags.of(publicSubnetB).add("Application", self.stack_name)
cdk.Tags.of(publicSubnetB).add("Network", "PublicB")
# These are also exposed from the cdk migrate command via properties.
ec2.CfnSubnetRouteTableAssociation(
self,
"PublicSubnetBRouteTableAssociation",
subnet_id=publicSubnetB.subnet_id,
route_table_id=self.publicRouteTable.ref,
)
ec2.CfnSubnetNetworkAclAssociation(
self,
"PublicSubnetBNetworkAclAssociation",
subnet_id=publicSubnetB.subnet_id,
network_acl_id=self.publicNetworkAcl.ref,
)
最后,这是失败的实例:
instanceB = ec2.Instance(
self,
"InstanceB",
instance_type=ec2.InstanceType.of(
instance_class=ec2.InstanceClass.BURSTABLE3,
instance_size=ec2.InstanceSize.MICRO,
),
machine_image=ec2.AmazonLinuxImage(
generation=ec2.AmazonLinuxGeneration.AMAZON_LINUX_2
),
vpc=vpc,
vpc_subnets=ec2.SubnetSelection(
subnet_type=ec2.SubnetType.PUBLIC, availability_zones=["us-east-1b"]
),
user_data=ec2.UserData.custom(userDataB),
private_ip_address="10.0.2.119",
associate_public_ip_address=True,
security_group=sg,
user_data_causes_replacement=True,
)
AWS CDK 表示 az us-east-1b 中没有公共子网 - 尽管我之前创建了它。唯一可行的方法是,我注释掉实例代码,运行它,清除上下文,再次运行它,然后在实例代码中注释掉。一定有更好的方法!
听起来您需要向 CFN 明确表示该实例依赖于正在创建的子网。你可以做类似的事情,
instanceB.node.add_dependency(publicSubnetB)
如果它们在同一个堆栈中或
the_instance_stack.node.add_dependency(MyResources)
如果实例和子网位于不同的堆栈中。