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

如何使用Python让AWS CDK保留Lambda旧版本?

问题原因及解决方案

你的问题出在手动创建Lambda Version的方式上:当前代码里手动实例化的Version资源不会随Lambda函数代码(Docker镜像)的更新自动重建,导致每次部署后版本号不变。而Serverless Framework默认会自动处理版本发布,CDK则需要显式配置才能实现相同行为。

修复步骤

1. 开启Lambda自动版本发布

在创建DockerImageFunction时添加publish=True参数,CDK会自动在代码变更时生成新版本。

2. 用函数的自动版本替代手动创建的Version

删除手动创建的Version资源,直接通过函数的currentVersion属性获取自动生成的版本,再绑定到Alias上。

修改后的完整代码

from aws_cdk import CfnOutput, Duration, RemovalPolicy, Size, Stack
from aws_cdk import aws_iam as iam
from aws_cdk import aws_lambda as _lambda
from constructs import Construct


class VsConverterStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, stage: str, **kwargs) -> None:  # type: ignore
        super().__init__(scope, construct_id, **kwargs)

        s3_buckets = {
            "test": {"full": "arn:aws:s3:::mgq-data-test", "name": "mgq-data-test"},
            "beta": {"full": "arn:aws:s3:::mgq-data-beta", "name": "mgq-data-beta"},
            "prod": {"full": "arn:aws:s3:::mgq-data-prod", "name": "mgq-data-prod"},
        }

        if stage not in s3_buckets:
            raise ValueError(f"Invalid stage: {stage}. Must be 'test', 'beta' or 'prod'.")

        # Define Docker image for Lambda using the Dockerfile from the repo root
        docker_image = _lambda.DockerImageCode.from_image_asset(
            directory="../"  # Path to your Dockerfile directory
        )

        # Define the Lambda function with the Docker image - 添加publish=True开启自动版本发布
        vs_convert_function = _lambda.DockerImageFunction(
            self,
            "converter",
            function_name=f"vs-converter-{stage}",
            code=docker_image,
            timeout=Duration.seconds(900),
            memory_size=10240,
            ephemeral_storage_size=Size.gibibytes(1),
            environment={"BUCKET": s3_buckets[stage]["name"]},
            publish=True  # 关键配置:自动发布新版本
        )

        # 直接使用函数的currentVersion,无需手动创建Version资源
        vs_convert_function_alias = _lambda.Alias(
            self, 
            "ConverterAlias", 
            alias_name="current", 
            version=vs_convert_function.currentVersion
        )

        # IAM permissions for the S3 bucket
        bucket_policy = iam.PolicyStatement(
            effect=iam.Effect.ALLOW,
            actions=[
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
            ],
            resources=[f"{s3_buckets[stage]['full']}", f"{s3_buckets[stage]['full']}/*"],
        )
        vs_convert_function.add_to_role_policy(bucket_policy)

        # Add CfnOutput to display the Lambda function name and version
        CfnOutput(self, "LambdaFunctionName", value=vs_convert_function.function_name)
        CfnOutput(self, "LambdaVersion", value=vs_convert_function.currentVersion.version)
        CfnOutput(self, "LambdaAlias", value=vs_convert_function_alias.alias_name)

关键改动说明

  • publish=True:告诉CDK每次函数代码(Docker镜像)变更时,自动创建新的Lambda版本,和Serverless Framework的默认行为一致。
  • 移除手动创建的Version资源:改用vs_convert_function.currentVersion获取CDK自动生成的版本,确保Alias始终指向最新的代码版本。
  • 更新输出的版本号:从原来的手动version.version改为currentVersion.version,保证输出的是最新版本号。

现在执行cdk deploy后,每次修改Python代码或Dockerfile,都会生成新的Lambda版本号,Alias也会自动指向新版本。

内容的提问来源于stack exchange,提问作者alanwilter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:16:04