如何使用AWS SAM打包单仓库中多个基于Docker镜像的AWS Lambda函数?
多容器化AWS Lambda函数的SAM构建方案
核心思路
利用AWS SAM的多镜像批量构建能力,在同一个SAM模板中定义所有容器化Lambda函数,通过sam build自动完成所有镜像的构建与ECR推送,再配合sam package完成部署包的最终打包。
步骤1:更新SAM模板(template.yml)
在模板中添加第二个容器化Lambda函数,每个函数需明确配置镜像构建规则和启动命令:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Parameters: AccountId: Type: String AwsRegion: Type: String DockerImagePrefix: Type: String Resources: # 第一个容器化Lambda函数 LambdaFunction1: Type: AWS::Serverless::Function Properties: PackageType: Image ImageUri: !Sub "${AccountId}.dkr.ecr.${AwsRegion}.amazonaws.com/${DockerImagePrefix}-lambda1:latest" ImageConfig: Command: ["lambdas.lambda1.index.handler"] Metadata: Dockerfile: Dockerfile.lambda1 # 第一个函数专属的Dockerfile路径 DockerContext: ./lambda1 # 第一个函数的代码目录(Docker构建上下文) # 第二个容器化Lambda函数 LambdaFunction2: Type: AWS::Serverless::Function Properties: PackageType: Image ImageUri: !Sub "${AccountId}.dkr.ecr.${AwsRegion}.amazonaws.com/${DockerImagePrefix}-lambda2:latest" ImageConfig: Command: ["lambdas.lambda2.index.handler"] Metadata: Dockerfile: Dockerfile.lambda2 # 第二个函数专属的Dockerfile路径 DockerContext: ./lambda2 # 第二个函数的代码目录(Docker构建上下文)
步骤2:修改buildspec.yml
替换原有单一sam package命令,增加ECR登录、SAM批量构建步骤:
version: 0.2 phases: pre_build: commands: # 登录ECR,获取镜像推送权限 - aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com build: commands: # 批量构建所有容器化Lambda的镜像并推送到ECR - sam build --use-container --image-repository ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${DOCKER_IMAGE_PREFIX} # 打包SAM模板并上传到指定S3桶 - sam package --template template.yml --s3-bucket "$S3_BUCKET" --output-template-file template-export.yml --region ${AWS_REGION}
关键说明
sam build --use-container会自动识别模板中每个Lambda函数的Metadata配置,找到对应的Dockerfile和构建上下文,完成镜像构建与ECR推送,无需手动逐个处理。- 每个Lambda的
ImageUri需保持唯一,建议用函数名作为镜像后缀,避免镜像覆盖。 - 若两个函数的镜像基础结构相似,可通过共享自定义基础镜像来减少重复构建时间,只需各自指定不同的启动命令即可。
内容的提问来源于stack exchange,提问作者RedPen
相关产品推荐
相关产品推荐

