如何在AWS CDK栈部署时自动执行Python脚本?
解决AWS CDK部署时自动运行Frozen-Flask生成静态文件的问题
问题背景
项目结构如下:
- project根目录:
app.py、site_staging文件夹、my_stack目录 my_stack目录:my_stack.py、app子目录my_stack/app目录:app.py(Flask应用)、Map.py、freeze.py(手动运行生成静态文件)
目标是执行cdk deploy时自动触发freeze.py的静态文件生成逻辑,之前两种尝试均失败:
- 将
freeze.py代码移入my_stack.py后,无法导入Map.py模块 - 通过子进程运行
freeze.py时出现500错误,疑似Flask环境配置问题
解决方案1:调整Python路径,直接在Stack中调用冻结逻辑
之前导入失败的核心原因是my_stack.py的Python路径未包含my_stack/app目录,导致无法找到Map.py等子模块。通过添加路径到sys.path即可解决:
# my_stack/my_stack.py import sys from pathlib import Path from aws_cdk import Stack, Construct from app import app as flask_app from flask_frozen import Freezer # 将app目录添加到Python搜索路径 app_dir = Path(__file__).parent / "app" sys.path.append(str(app_dir.resolve())) def generate_static_files(): # 配置Frozen-Flask输出目录(根据你的实际路径调整) flask_app.config["FREEZER_DESTINATION"] = "../../site_staging" # 禁用自动启动服务器,避免端口绑定问题 flask_app.config["FREEZER_RUN_AS_SERVER"] = False freezer = Freezer(flask_app) freezer.freeze() class MyStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # 先生成静态文件,再定义CDK资源 generate_static_files() # 此处添加你的CDK资源定义(比如S3静态网站托管、CloudFront等) # ...
解决方案2:修复子进程调用,指定正确工作目录
之前子进程运行报错的原因大概率是工作目录错误,导致Flask应用无法加载依赖模块或静态资源。通过指定子进程的工作目录为my_stack/app即可解决:
# my_stack/my_stack.py import subprocess from pathlib import Path from aws_cdk import Stack, Construct class MyStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # 获取app目录的绝对路径 app_dir = Path(__file__).parent / "app" # 运行freeze.py,指定工作目录为app目录 proc = subprocess.run( ["python", "freeze.py"], cwd=app_dir.resolve(), capture_output=True, text=True, check=True # 命令失败时直接抛出异常 ) # 此处添加你的CDK资源定义 # ...
额外注意事项
- 确保CDK虚拟环境已安装所有依赖:
pip install flask flask-frozen - 若
freeze.py中有自定义配置(比如输出目录、路由规则),需保证配置与CDK资源的路径匹配 - 若不想每次
cdk synth都生成静态文件,可通过环境变量或命令行参数添加条件判断,仅在deploy时执行生成逻辑
内容的提问来源于stack exchange,提问作者Anthony Townsend
相关产品推荐
相关产品推荐

