当我的 SAM 模板文件在本地 zip 文件中包含具有依赖关系的层时,我在本地调用 lambda 时遇到问题。调用成功,但函数引发错误,指出缺少依赖项。
在阅读有关 的文档时AWS::Serverless::LayerVersion
,它指出如果ContentUri
是本地 zip 文件,我应该首先运行sam package
. 这将正确地转换图层。我应该在sam package
之前运行sam build
,还是改为运行?这似乎很奇怪,因为sam package
需要一个 S3 存储桶,这会破坏本地构建/调用工作流程
这是我正在运行的步骤(和模板文件)
模板.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 ,
package succeeds and return back template yaml with layer
ContentUri: s3://<my_bucket_name>/28d65cb9855cad7b8b41de3558c17baa`
我尝试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
具有上述图层的模板的本地工作流程是什么?