当我的SAM模板文件在本地zip文件中包含具有依赖性的Layer时,我在本地调用lambda时遇到麻烦。调用成功,但函数引发错误并指出缺少依赖项。
在阅读有关AWS::Serverless::LayerVersion
的文档时,它指出如果ContentUri
是本地zip文件,则应该首先运行sam package
。这将正确转换图层。我应该在sam package
之前运行sam build
吗?
由于sam package
需要一个S3存储桶,这似乎很奇怪,这会破坏本地的构建/调用工作流程
这是我正在运行的步骤(和模板文件)
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
Simple SAM Template
Globals:
Function:
Timeout: 10
Resources:
SimpleLambda:
Type: AWS::Serverless::Function
Properties:
Handler: simple_app.simple_test
Runtime: python3.7
CodeUri: .
Layers:
- !Ref DepsLibs
DepsLibs:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: DepsLibsPackage
ContentUri: ./layers/deps.zip
CompatibleRuntimes:
- python3.7
simple_app.py(my_service
中压缩了./layers/deps.zip
包)
import json
import logging
from my_service.client.my_service_client import MyServiceClient
def simple_test(event, context):
try:
MyServiceClient.create_plan(request=None)
except Exception as err:
logging.getLogger().info('Something happened: {err}'.format(err=err))
response = {
"statusCode": 200 ,
"body": json.dumps(event)
}
return response
运行以下命令时无法执行我的功能:
sam build --template sam_template.yaml --use-container
sam local invoke SimpleLambda --template sam_template.yaml --skip-pull-image
错误:[ERROR] Runtime.ImportModuleError: Unable to import module 'simple_app': No module named 'my_service'
->依赖项不存在如果我运行sam package --s3-bucket <my_bucket_name> --template sam_template.yaml instead (or before
sam build ,
程序包succeeds and return back template yaml with layer
ContentUri:s3://
我尝试将模板中的ContentUri: ./layers/deps.zip
替换为ContentUri: s3://<my_bucket_name>/28d65cb9855cad7b8b41de3558c17baa
,但打印出这样的消息:Lambda function 'DepsLibs' has specified S3 location for CodeUri which is unsupported. Using default value of '.' instead
具有上述图层的模板的本地工作流程是什么?