如何使用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
相关产品推荐
相关产品推荐

