You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的静态文件生成逻辑,之前两种尝试均失败:

  1. 将freeze.py代码移入my_stack.py后,无法导入Map.py模块
  2. 通过子进程运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:47:37