如何在AWS CDK中跨Python文件传递Stack类内的变量?
在AWS CDK中跨类跨文件调用变量的正确方法
问题场景
我在Python文件apppythonfile.py的appstack(cdk.Stack)类中定义了若干变量,需要在另一个Python文件Genpythonfile.py的GenStack(cdk.Stack)类中使用这些变量。尝试两种方法均报错:
- 在
GenStack的__init__中传入appstack实例并调用appstack.SGnode,报错:TypeError: __init() takes from 1 to 3 positional arguments but 4 positional arguments ( and 1 keyword-only argument) were given - 通过
from apppythonfile import *导入后直接调用SGnode,报错:NameError: name 'SGnode' is not defined
apppythonfile.py中SGnode的定义代码:
class appstack(cdk.Stack): def __init__(self, scope:cdk.Construct, construct_id: str, **kwargs) -> None: super().__init__(scope,construct_id, **kwargs) # 定义后续使用的变量 vpcID=vpc-6895xxxxxx vpc_declared=ec2.Vpc.from_lookup(self,"vpctouse",vpc_id=vpcID) SGnode = ec2.SecurityGroup(self,"securitygroup of nodes", vpc=vpc_declared, securirt_group_name="prod-node-sg", allow_all_outbound=True)
错误原因
- 第一种方法报错:
GenStack的__init__方法未声明接收appstack实例的参数,且SGnode是appstack类__init__内的局部变量,不属于实例属性,即便传入实例也无法访问。 - 第二种方法报错:
SGnode是类方法内的局部变量,并非模块级变量,直接导入模块无法获取。
正确实现步骤
步骤1:将变量改为appstack的实例属性
在apppythonfile.py中,把需要跨类访问的变量改为实例属性(添加self.前缀),同时修正代码拼写错误:
class appstack(cdk.Stack): def __init__(self, scope:cdk.Construct, construct_id: str, **kwargs) -> None: super().__init__(scope,construct_id, **kwargs) # VPC ID是字符串,需添加引号 vpcID = "vpc-6895xxxxxx" self.vpc_declared = ec2.Vpc.from_lookup(self,"vpctouse",vpc_id=vpcID) # 改为实例属性,供外部访问 self.SGnode = ec2.SecurityGroup(self,"securitygroup of nodes", vpc=self.vpc_declared, security_group_name="prod-node-sg", allow_all_outbound=True)
步骤2:修改GenStack的构造方法接收实例
在Genpythonfile.py中,导入appstack类,修改GenStack的__init__方法,添加接收appstack实例的参数,之后通过实例访问属性:
from aws_cdk import Stack, Construct import aws_cdk.aws_ec2 as ec2 from apppythonfile import appstack class GenStack(Stack): # 添加app_stack参数,接收appstack实例 def __init__(self, scope: Construct, construct_id: str, app_stack: appstack, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # 访问app_stack的实例属性 # 示例:创建实例时引用目标安全组 example_instance = ec2.Instance(self, "ExampleInstance", vpc=app_stack.vpc_declared, instance_type=ec2.InstanceType("t2.micro"), security_group=app_stack.SGnode )
步骤3:在CDK入口文件传递实例
在CDK入口文件(如app.py)中,先创建appstack实例,再将其传入GenStack:
from aws_cdk import App, Construct from apppythonfile import appstack from Genpythonfile import GenStack app = App() # 创建appstack实例 my_app_stack = appstack(app, "MyAppStack") # 传入实例创建GenStack GenStack(app, "MyGenStack", app_stack=my_app_stack) app.synth()
注意事项
- 所有需要跨类访问的变量,必须定义为类的实例属性(
self.xxx),不能是局部变量。 - CDK中传递资源引用时,优先通过实例属性传递,而非字符串ID,CDK会自动处理资源依赖,避免部署时出现资源未就绪的问题。
内容的提问来源于stack exchange,提问作者saffron
相关产品推荐
相关产品推荐

