Ric*_*ard 7 aws-lambda aws-lambda-layers
我是 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 工作。
(我在标准的 hello world 应用程序中添加了 import numpy、scipy.ndimage 和 skimage.draw,并为每个应用程序包含了一些测试函数调用)
要求.txt:
requests
scikit-image
Run Code Online (Sandbox Code Playgroud)
之后,一切正常(在本地和/或 AWS 上运行)。
但是,我现在想将 skimage 模块移出我的应用程序并移到一个新的自定义层中(我想将 skimage 放在一个层中以重新用于一些功能)
为了进行设置,我创建了一个依赖项目录并将 requirements.txt 移动到那里(在应用程序目录中留下空的 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
Run Code Online (Sandbox Code Playgroud)
目录结构:
? dependencies/
requirements.txt (responses and scikit-image)
? events/
? hello_world/
__init__.py
app.py
requirements.txt (now empty)
? tests/
README.md
template.yaml
Run Code Online (Sandbox Code Playgroud)
但是,当我sam build -u使用该模板文件运行时,没有为template.yml 文件中./dependencies:SkimageLayer中指定的层构建任何内容。但是HelloWorldFunction仍然可以正确构建(现在当然没有任何包含的模块)
从SAM Cli 版本 v0.50.0 开始,它正在构建层作为sam build.
设计文档可能是了解其工作原理的良好起点。
基本上,您必须BuildMethod使用 lambda 的目标运行时设置自定义:
MyLayer:
Type: AWS::Serverless::LayerVersion
Properties:
ContentUri: my_layer
CompatibleRuntimes:
- python3.8
Metadata:
BuildMethod: python3.8 (or nodejs8.10 etc..)
Run Code Online (Sandbox Code Playgroud)
警告:对于像 Java 这样的编译语言,它有一个问题,它试图在函数之前构建层。预计将在下一个版本中修复它(PR 已经打开)。
| 归档时间: |
|
| 查看次数: |
5573 次 |
| 最近记录: |