我对 lambda 和 SAM 都是新手 - 所以如果我搞砸了任何简单的事情,请不要大喊:D。
摘要:我无法sam build
构建中指定的层template.yaml
,它只构建 lambda 函数。
背景:我正在尝试在 python3.7 中构建一个使用 skimage ( scikit-image
) 模块的 lambda 函数。为此,我正在尝试使用 SAM 来构建和部署它。 ...这是工作
我正在尝试将 scikit-image 模块部署为一个层(并且还使用 SAM 构建),而不是将其包含在 lambda 函数方向 中......这不起作用
首先,我只是扩展了标准的 SAMHello World
应用程序。
我只需将 skimage 添加到requirements.txt
,然后使用sam build -u
,然后从构建的包目录中手动删除 numpy/scipy 依赖项(我已经包含了 AWS scipy/numpy 层),就可以让 skimage 正常工作。
(我将 import numpy、scipy.ndimage 和 skimage.draw 添加到标准的 hello world 应用程序中,并为每个应用程序添加了一些测试函数调用)
要求.txt:
requests
scikit-image
之后,一切正常(在本地和/或 AWS 上运行)。
但是,我现在想将 skimage 模块从我的应用程序中移出并移到一个新的自定义层中(我想将 skimage 放在一个层中以重新用于一些功能)
为了设置它,我创建了一个依赖目录并将 requirements.txt 移到那里(在 app 目录中留下空的 requirements.txt)。然后我更新了 template.yaml 以指定新层:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-app
Sample SAM Template for sam-app
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.7
Layers:
- arn:aws:lambda:us-west-2:420165488524:layer:AWSLambda-Python37-SciPy1x:2
- !Ref SkimageLayer
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
SkimageLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: Skimage
Description: Skimage module layer
ContentUri: dependencies/
CompatibleRuntimes:
- python3.7
RetentionPolicy: Retain
DependsOn:
- Skimage
目录结构:
▾ dependencies/
requirements.txt (responses and scikit-image)
▸ events/
▾ hello_world/
__init__.py
app.py
requirements.txt (now empty)
▸ tests/
README.md
template.yaml
但是,当我使用该模板文件运行时,不会为 template.yml 文件中:中sam build -u
指定的层构建任何内容。但是仍然可以正确构建(现在当然没有任何包含的模块)./dependencies
SkimageLayer
HelloWorldFunction