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

底层Docker镜像更新时,如何强制重新部署Lambda函数?

问题:CDK部署后Lambda未随ECR镜像更新

用户的CDK代码如下:

self.image = DockerImageAsset(
    self,
    "my_image",
    directory="lambda",
)

repository = ecr.Repository(
    self,
    id="lambdas-repo",
    repository_name="myrepo",
    removal_policy=RemovalPolicy.DESTROY,
    image_scan_on_push=True,
    lifecycle_rules=[ecr.LifecycleRule(max_image_count=10)],
)

ecrdeploy.ECRDeployment(
    self,
    id="deploy_docker_image_latest",
    src=ecrdeploy.DockerImageName(self.image.image_uri),
    dest=ecrdeploy.DockerImageName(f"{repository.repository_uri}:latest"),
)

self.cleansing_lambda = _lambda.DockerImageFunction(
    self,
    "cleansing_lambda",
    function_name="FNAME",
    code=_lambda.DockerImageCode.from_ecr(
        repository, cmd=["handler"]
    ),
    timeout=Duration.seconds(60),
)

首次部署正常:镜像上传至ECR、Lambda创建并运行正常。但更新镜像重新部署后,ECR的latest标签已指向新镜像,Lambda却未同步更新。


解决方案

1. 避免使用latest标签,改用唯一标识的标签

Lambda识别镜像更新依赖镜像摘要而非标签,latest标签本身不会触发CDK的配置变更检测。可以用DockerImageAsset的asset_hash(基于镜像内容生成的唯一哈希)作为标签,确保每次镜像变化时标签也更新:

# 生成基于镜像内容的唯一标签
image_tag = self.image.asset_hash

# 部署镜像到ECR时使用该标签
ecrdeploy.ECRDeployment(
    self,
    id="deploy_docker_image",
    src=ecrdeploy.DockerImageName(self.image.image_uri),
    dest=ecrdeploy.DockerImageName(f"{repository.repository_uri}:{image_tag}"),
)

# Lambda引用带唯一标签的镜像
self.cleansing_lambda = _lambda.DockerImageFunction(
    self,
    "cleansing_lambda",
    function_name="FNAME",
    code=_lambda.DockerImageCode.from_ecr(
        repository, 
        cmd=["handler"],
        tag=image_tag  # 指定唯一标签
    ),
    timeout=Duration.seconds(60),
)

每次镜像内容变更,asset_hash会更新,CDK会识别到Lambda的镜像配置变化,自动触发Lambda重新部署。

2. 添加触发更新的环境变量

给Lambda添加一个随镜像变化的环境变量(比如asset_hash),CDK检测到环境变量变更时,会强制更新Lambda:

self.cleansing_lambda = _lambda.DockerImageFunction(
    self,
    "cleansing_lambda",
    function_name="FNAME",
    code=_lambda.DockerImageCode.from_ecr(
        repository, cmd=["handler"]
    ),
    timeout=Duration.seconds(60),
    # 添加随镜像变化的环境变量
    environment={
        "IMAGE_VERSION": self.image.asset_hash
    }
)

这种方法不需要修改ECR的标签策略,通过环境变量的变更触发Lambda重新拉取镜像。

3. 直接用DockerImageAsset作为Lambda代码来源

跳过手动创建ECR仓库和部署的步骤,让CDK自动管理镜像生命周期:

self.cleansing_lambda = _lambda.DockerImageFunction(
    self,
    "cleansing_lambda",
    function_name="FNAME",
    # 直接从本地目录构建镜像并关联Lambda
    code=_lambda.DockerImageCode.from_asset(
        directory="lambda",
        cmd=["handler"]
    ),
    timeout=Duration.seconds(60),
)

CDK会自动创建ECR仓库、上传镜像,并且在镜像内容变化时自动更新Lambda,无需额外配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:02:55