无服务器-脾气暴躁-无法找到良好的绑定路径格式 [英] Serverless - Numpy - Unable to find good bind path format

查看:85
本文介绍了无服务器-脾气暴躁-无法找到良好的绑定路径格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在这个问题上打了一个多星期,经历了各种论坛问题和帖子,无法解决.我正在尝试将numpy打包在一个函数中,分别构建需求(我有多个函数,我想将多个需求分开).

I've been beating on this for over a week and been through all sorts of forum issues and posts and cannot resolve. I'm trying to package numpy in a function, individually building requirements (I have multiple functions with multiple requirements that I'd like to keep separate).

环境:
Windows 10家庭版

Environment:
Windows 10 Home

适用于Windows的Docker工具箱:

Client:
Version:       18.03.0-ce
API version:   1.37
Go version:    go1.9.4
Git commit:    0520e24302


Built: Fri Mar 23 08:31:36 2018
 OS/Arch:       windows/amd64
 Experimental:  false
 Orchestrator:  swarm

Server: Docker Engine - Community
 Engine:
  Version:      18.09.0
  API version:  1.39 (minimum version 1.12)
  Go version:   go1.10.4
  Git commit:   4d60db4
  Built:        Wed Nov  7 00:52:55 2018
  OS/Arch:      linux/amd64
  Experimental: false

无服务器版本:

serverless version 6.4.1
serverless-python-requirements version 6.4.1

目录结构:

|-test
  |-env.yml
  |-serverless.yml
  |-Dockerfile
  |-functions
    |-f1
      |-index.py
      |-requirements.txt
      |-sub_function_1.py
      |-sub_function_2.py
    |-f2
      |-index.py
      |-requirements.txt
      |-sub_function_3.py
      |-sub_function_4.py

serverless.yml

service: test 
plugins:
  - serverless-python-requirements
custom:
  pythonRequirements:
    zip: true                  
    dockerFile: Dockerfile      
    dockerizePip: non-linux     
provider:
  name: aws
  runtime: python3.6
  stage: dev
  environment: ${file(./env.yml):${opt:stage, self:provider.stage}.env}
  region: ${file(./env.yml):${opt:stage, self:provider.stage}.aws.region}
  profile: ${file(./env.yml):${opt:stage, self:provider.stage}.aws.profile}
package:
  individually: true
functions:
  f1:
    handler:index.handler
    module:functions/f1
  f2:
    handler:index.handleer
    module:functions/f2

我的项目文件在C:\ Serverless \ test中.我先运行npm init,然后运行npm i --save serverless-python-requirements,接受所有默认值.我在sls deploy -v上获得了以下内容.即使我已将C:\添加到VirtualBox中运行的默认VM上的共享文件夹"中,并选择了自动挂载和永久安装.

I have my project files in C:\Serverless\test. I run npm init, followed by npm i --save serverless-python-requirements, accepting all defaults. I get the following on sls deploy -v. even though I've added C:\ to Shared Folders on the running default VM in VirtualBox, and selected auto-mount and permanent.

如果我同时注释掉dockerizePip和dockerFile,则会根据此处和其他SO帖子:

If I comment out both dockerizePip and dockerFile I get the following as expected based on here and other SO posts:

 Serverless: Invoke invoke
{
    "errorMessage": "Unable to import module 'index'"
}

如果我将dockerfile注释掉,则会得到:

If I comment out dockerfile I get:

Serverless: Docker Image: lambci/lambda:build-python3.6

      Error --------------------------------------------------

    error during connect: Get https://XXXXXX/v1.37/version: dial tcp
    XXXXXXXXXX: connectex: A connection attempt failed because the 
    connected party did not properly respond after a period of time, or
    established connection failed because connected host has failed to 
    respond.

    at dockerCommand (C:\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:20:11)
    at getBindPath (C:\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:100:3)

使用Dockerfile

# AWS Lambda execution environment is based on Amazon Linux 1
FROM amazonlinux:1

# Install Python 3.6
RUN yum -y install python36 python36-pip

# Install your dependencies
RUN curl -s https://bootstrap.pypa.io/get-pip.py | python3
RUN yum -y install python3-devel mysql-devel gcc

# Set the same WORKDIR as default image
RUN mkdir /var/task
WORKDIR /var/task

.

Serverless: Building custom docker image from Dockerfile...
Serverless: Docker Image: sls-py-reqs-custom

  Error --------------------------------------------------

  Unable to find good bind path format

     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

  Stack Trace --------------------------------------------

Error: Unable to find good bind path format
    at getBindPath (C:\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:142:9)
    at installRequirements (C:\Serverless\test\node_modules\serverless-python-requirements\lib\pip.js:152:7)
    at installRequirementsIfNeeded (C:\Serverless\test\node_modules\serverless-python-requirements\lib\pip.js:451:3)

如果我将项目移至C:\ Users \,则会得到以下信息:

If I move my project to C:\Users\, I get this instead:

Serverless: Docker Image: sls-py-reqs-custom
Serverless: Trying bindPath /c/Users/Serverless/test/.serverless/requirements (run,--rm,-v,/c/Users/Serverless/test/.serverless/req
uirements:/test,alpine,ls,/test/requirements.txt)
Serverless: /test/requirements.txt

  Error --------------------------------------------------

  docker: Error response from daemon: create "/c/Users/Serverless/test/.serverless/requirements": "\"/c/Users/Serverless/test/.serv
erless/requirements\"" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you in
tended to pass a host directory, use absolute path.
See 'docker run --help'.


     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

  Stack Trace --------------------------------------------

Error: docker: Error response from daemon: create "/c/Users/Serverless/test/.serverless/requirements": "\"/c/Users/Serverless/test/
.serverless/requirements\"" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If y
ou intended to pass a host directory, use absolute path.
See 'docker run --help'.

    at dockerCommand (C:\Users\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:20:11)
    at getDockerUid (C:\Users\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:162:14)

我从@brianz 这里获得了Makefile样式推荐,但是我不确定如何适应它(Makefile不是我的强项).我对下一步的工作有些茫然,建议将不胜感激. TIA.

I've seen the Makefile style recommendation from @brianz here, but I'm not sure how to adapt that to this (Makefiles are not my strong suit). I'm a bit at a loss as to what to do next and advice would be greatly appreciated. TIA.

推荐答案

我无法使插件正常工作,但是无论如何我都找到了更好的解决方案-Lambda Layers.这是一个好处,因为它减小了lambda的大小并允许代码/文件重用.有一个用于numpy和scipy的预先构建的lambda层,您可以使用,但是我建立了自己的lambda层,向我展示了它们如何工作.这是我的工作方式:

I was unable to make the plugin work but I found a better solution anyhow - Lambda Layers. This is a bonus because it reduces the size of the lambda and allows code/file reuse. There is a pre-built lambda layer for numpy and scipy that you can use, but I built my own to show myself how it all works. Here's how I made it work:

创建图层包:

  1. 打开EC2实例,Ubuntu或Linux或任何其他版本-这是必需的,以便我们可以正确地编译运行时二进制文件
  2. 制作一个依赖包zip-必须在运行时使用目录结构python/lib/python3.6/site-packages进行python查找

  1. Open an EC2 instance or Ubuntu or Linux or whatever - This is needed so we can compile the runtime binaries correctly
  2. Make a dependencies package zip - Must use the directory structure python/lib/python3.6/site-packages for python to find during runtime

mkdir -p tmpdir/python/lib/python3.6/site-packages 
pip install -r requirements.txt --no-deps -t tmpdir/python/lib/python3.6/site-packages 
cd tmpdir zip -r ../py_dependencies.zip . 
cd .. 
rm -r tmpdir

  • 将层zip推送到AWS-需要最新的awscli

  • Push layer zip to AWS - requires latest awscli

    sudo pip install awscli --upgrade --user
    sudo aws lambda publish-layer-version \
    --layer-name py_dependencies \
    --description "Python 3.6 dependencies [numpy=0.15.4]" \
    --license-info "MIT" \
    --compatible-runtimes python3.6 \
    --zip-file fileb://py_dependencies.zip \
    --profile python_dev_serverless
    

  • 要在需要numpy的任何功能中使用,只需使用控制台中或上面的上传过程中显示的arn

  • To use in any function that requires numpy, just use the arn that is shown in the console or during the upload above

    f1:
      handler: index.handler_f_use_numpy
      include:
        - functions/f_use_numpy.py
      layers:
        - arn:aws:lambda:us-west-2:XXXXX:layer:py_dependencies:1
    

  • 作为一项额外的好处,您还可以将诸如常量之类的常见文件推送到一层.这是我在Windows和Lambda上测试使用的方式:

  • As an added bonus, you can push common files like constants to a layer as well. Here's how I did it for testing use in windows and on the lambda:

    import platform
    
    \# Set common path
    COMMON_PATH = "../../layers/common/"
    if platform.system() == "Linux": COMMON_PATH = "/opt/common/"
    
    def handler_common(event, context):
        # Read from a constants.json file
        with open(COMMON_PATH + 'constants.json') as f:
            return text = json.load(f)
    

  • 这篇关于无服务器-脾气暴躁-无法找到良好的绑定路径格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆