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

如何在Docker环境的CDK中构建并部署Docker镜像版AWS Lambda?

解决方案:在Docker内运行CDK时自动构建Lambda镜像部署

问题根源

CDK运行在Docker容器内时,默认无法访问宿主机的Docker守护进程(docker.sock),导致执行docker build命令失败,无法自动构建Lambda所需的镜像。以下是三种可行的解决方式:


方案1:挂载宿主机Docker套接字到CDK容器

让CDK容器共享宿主机的Docker守护进程,直接调用宿主机的Docker环境完成镜像构建。

  • 启动CDK容器时添加挂载参数:
    docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/app your-cdk-image-name
    
  • 验证:进入容器后执行docker ps,若能看到宿主机的容器列表,说明挂载成功。之后执行cdk deploy即可自动构建镜像。
  • 注意:需确保宿主机已安装并运行Docker,且CDK容器内已预装Docker CLI(若镜像未包含,需提前安装)。此方式存在安全风险(容器获得宿主机root权限),需符合公司安全政策。

方案2:用AWS CodeBuild远程构建镜像

将镜像构建任务交给AWS CodeBuild完成,避免在本地容器内操作Docker,更适合企业安全环境。

  • 修改CDK代码,启用CodeBuild远程构建:
    from aws_cdk import aws_codepipeline_actions as codepipeline_actions
    from aws_cdk import aws_codebuild as codebuild
    
    lambdaFunction = _lambda.DockerImageFunction(
        self, f'{client_id}-prefect-lambda-handler',
        code=_lambda.DockerImageCode.from_image_asset(
            directory="cumulus_devops_cdk/prefect-lambda-handler",
            build_options=_lambda.DockerImageBuildOptions(
                code_build_options=codepipeline_actions.CodeBuildOptions(
                    build_environment=codebuild.BuildEnvironment(
                        # 若构建需要Docker-in-Docker,开启特权模式
                        privileged=True
                    )
                )
            )
        )
    )
    
  • 原理:CDK自动创建CodeBuild项目,将本地代码上传至S3,由CodeBuild在AWS环境中构建镜像并推送到ECR,最后Lambda引用该ECR镜像。
  • 要求:CDK执行环境需具备调用CodeBuild的权限,且CodeBuild服务角色拥有ECR推送权限。

方案3:CI/CD预构建镜像+CDK引用ECR

在CI/CD流程中提前构建并推送镜像到ECR,CDK直接引用已存在的ECR镜像,实现半自动化部署。

  • 修改CDK代码,直接引用ECR镜像:
    from aws_cdk import aws_ecr as ecr
    
    # 引入已有的ECR仓库
    ecr_repo = ecr.Repository.from_repository_name(
        self, "PrefectLambdaRepo",
        repository_name="your-ecr-repo-name"
    )
    
    lambdaFunction = _lambda.DockerImageFunction(
        self, f'{client_id}-prefect-lambda-handler',
        code=_lambda.DockerImageCode.from_ecr(
            repository=ecr_repo,
            tag="latest"  # 建议使用CI/CD生成的版本标签替代latest
        )
    )
    
  • 流程:CI/CD中先执行docker build和docker push将镜像推送到ECR,再执行cdk deploy完成Lambda部署。适合已有成熟CI/CD流程的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:30:53