SAM 构建 - 它还构建层吗?

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仍然可以正确构建(现在当然没有任何包含的模块)

gus*_*ues 5

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 已经打开)。