AWS CDK 通过Docker镜像创建Lambda函数TypeError报错解决方案
AWS CDK 使用Docker镜像构建多Lambda函数部署问题及解决方案
背景
我是AWS生态的新手,正在开发一款无服务器应用,目前已完成4个可正常运行的Lambda函数开发。接下来计划通过CDK搭建部署流水线,需实现以下需求:
- 构建包含所有Lambda代码的Docker镜像
- 基于同一个镜像创建4个不同的Lambda函数,仅通过覆盖Docker镜像的CMD参数指定对应的Lambda handler
我已在本地完成CDK环境搭建,可正常创建栈。
初始代码片段
创建Docker镜像代码
asset_img = aws_ecr_assets.DockerImageAsset( self, "test_image", directory=os.path.join(os.getcwd(), "../mysrc") )
从Docker镜像创建Lambda的代码
aws_lambda.DockerImageFunction( self, function_name="gt_from_image", code=_lambda.DockerImageCode.from_ecr( self, repository=asset_img.repository, tag="latest") )
报错信息
运行时收到如下报错:
TypeError: from_ecr() got multiple values for argument 'repository'
问题原因
DockerImageCode.from_ecr方法不需要传入CDK栈实例self作为第一个参数,多余传入的self会被识别为repository参数的第一个取值,和后续显式声明的repository参数冲突,因此触发参数重复报错DockerImageAsset构建的镜像默认不会使用latest作为标签,而是以source_hash作为镜像标签,硬编码latest会导致部署时找不到对应镜像
最终解决代码
asset_img = _asset.DockerImageAsset(self, "test_image", directory=os.path.join(os.getcwd(), "../gt")) _lambda.DockerImageFunction(self, id='gt_from_image', function_name="gt_from_image_Fn", code=_lambda.DockerImageCode.from_ecr( repository=asset_img.repository, tag=asset_img.source_hash))
多Lambda函数扩展实现
如果要基于同一个镜像创建4个不同handler的Lambda,只需要在DockerImageCode.from_ecr配置中新增cmd参数覆盖镜像默认CMD即可,示例如下:
# 第一个Lambda,指定对应handler _lambda.DockerImageFunction(self, id='lambda_fn1', function_name="fn1", code=_lambda.DockerImageCode.from_ecr( repository=asset_img.repository, tag=asset_img.source_hash, cmd=["app.handler1"] ) ) # 第二个Lambda,指定不同handler _lambda.DockerImageFunction(self, id='lambda_fn2', function_name="fn2", code=_lambda.DockerImageCode.from_ecr( repository=asset_img.repository, tag=asset_img.source_hash, cmd=["app.handler2"] ) ) # 剩余两个函数按相同逻辑修改id、函数名、cmd参数即可
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

