Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why can't docker find my own package when deploying via serverless?

I want to deploy my python package to Amazon and make it available via lambda. For this I'm trying serverless.

When I try to deploy my package I get the following error message:

SLS_DEBUG=* serverless deploy --stage dev --aws-profile default
Serverless: Load command config
Serverless: Load command config:credentials
Serverless: Load command create
Serverless: Load command install
Serverless: Load command package
Serverless: Load command deploy
Serverless: Load command deploy:function
Serverless: Load command deploy:list
Serverless: Load command deploy:list:functions
Serverless: Load command invoke
Serverless: Load command invoke:local
Serverless: Load command info
Serverless: Load command logs
Serverless: Load command login
Serverless: Load command logout
Serverless: Load command metrics
Serverless: Load command print
Serverless: Load command remove
Serverless: Load command rollback
Serverless: Load command rollback:function
Serverless: Load command slstats
Serverless: Load command plugin
Serverless: Load command plugin
Serverless: Load command plugin:install
Serverless: Load command plugin
Serverless: Load command plugin:uninstall
Serverless: Load command plugin
Serverless: Load command plugin:list
Serverless: Load command plugin
Serverless: Load command plugin:search
Serverless: Load command config
Serverless: Load command config:credentials
Serverless: Load command rollback
Serverless: Load command rollback:function
Serverless: Load command requirements
Serverless: Load command requirements:clean
Serverless: Load command requirements:install
Serverless: Load command requirements:cleanCache
Serverless: Invoke deploy
Serverless: Invoke package
Serverless: Invoke aws:common:validate
Serverless: Invoke aws:common:cleanupTempDir
Serverless: Generated requirements from /home/ola/projects/lambda/tagdoc/requirements.txt in /home/ola/projects/lambda/tagdoc/.serverless/requirements.txt...
Serverless: Installing requirements from /home/ola/projects/lambda/tagdoc/.serverless/requirements/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.6
Requirement 'pkgg-0.1.0.tar.gz' looks like a filename, but the file does not exist
Processing ./pkgg-0.1.0.tar.gz
Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory: '/var/task/pkgg-0.1.0.tar.gz'


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

  null

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

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

Error: null
    at installRequirements (/home/ola/projects/lambda/tagdoc/node_modules/serverless-python-requirements/lib/pip.js:262:11)
    at installRequirementsIfNeeded (/home/ola/projects/lambda/tagdoc/node_modules/serverless-python-requirements/lib/pip.js:448:3)
    at ServerlessPythonRequirements.installAllRequirements (/home/ola/projects/lambda/tagdoc/node_modules/serverless-python-requirements/lib/pip.js:527:29)
From previous event:
    at PluginManager.invoke (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:390:22)
    at PluginManager.spawn (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:408:17)
    at Deploy.BbPromise.bind.then.then (/usr/lib/node_modules/serverless/lib/plugins/deploy/deploy.js:123:50)
From previous event:
    at Object.before:deploy:deploy [as hook] (/usr/lib/node_modules/serverless/lib/plugins/deploy/deploy.js:113:10)
    at BbPromise.reduce (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:390:55)
From previous event:
    at PluginManager.invoke (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:390:22)
    at PluginManager.run (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:421:17)
    at variables.populateService.then.then (/usr/lib/node_modules/serverless/lib/Serverless.js:157:33)
    at runCallback (timers.js:810:20)
    at tryOnImmediate (timers.js:768:5)
    at processImmediate [as _immediateCallback] (timers.js:745:5)
From previous event:
    at Serverless.run (/usr/lib/node_modules/serverless/lib/Serverless.js:144:8)
    at serverless.init.then (/usr/lib/node_modules/serverless/bin/serverless:43:50)
    at <anonymous>

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com

  Your Environment Information -----------------------------
     OS:                     linux
     Node Version:           8.15.0
     Serverless Version:     1.30.1

my serverless.yml file looks like this:

# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
#    docs.serverless.com
#
# Happy Coding!

service: tagdoc # NOTE: update this with your service name

# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"

provider:
  name: aws
  runtime: python3.6
  region: eu-central-1
# you can overwrite defaults here
#  stage: dev

plugins:
  - serverless-python-requirements

# You need to have Docker installed to be able to set dockerizePip:
# true or dockerizePip: non-linux. Alternatively, you can set
# dockerizePip: false, and it will not use Docker packaging. But,
# Docker packaging is essential if you need to build native packages
# that are part of your dependencies like Psycopg2, NumPy, Pandas, etc
custom:
  pythonRequirements:
    dockerizePip: true

# you can define service wide environment variables here
#  environment:
#    variable1: value1

# you can add packaging information here
package:
  include:
    - ./nltk_data/*

functions:
  ttxt:
    handler: handler.ttxt
    events:
      - http:
          path: /ttxt
          method: get
          integration: lambda
          request:
            template:
              application/json: '{ "txt" : "$input.params(''txt'')" }'
          response:
            headers:
  turl:
    handler: handler.turl
    events:
      - http:
          path: /turl
          method: get
          integration: lambda
          request:
            template:
              application/json: '{ "url" : "$input.params(''url'')" }'
          response:
            headers:
              Content-Type: "'application/json'"

and of top the directory includes all the required files, in particular the built python package:

tree -L 2 lambda/
lambda/
└── tagdoc
    ├── pkgg-0.1.0.tar.gz
    ├── handler.py
    ├── nltk_data
    ├── node_modules
    ├── package.json
    ├── package-lock.json
    ├── README.md
    ├── requirements.txt
    ├── serverless.yml
    └── srv

4 directories, 8 files

I'm currently running Debian 9.5. I've also shared the code with a friend running the same OS via Github and it seems he can deploy the package. Therefore, it looks it has to do with my local setup of serverless / docker. But I can't figure out how to resolve this. Any help would be really appreciated.

The requirements.txt just contains one line:

cat requirements.txt 
pkgg-0.1.0.tar.gz

Now the package itself has some dependency. By including only the package it takes the dependencies in the setup.py file from the package.

EDIT

as asked in one of the comments. This is my .gitignore

#Compiled source#
#################
*.pyc

# no data files #
################
*.csv

#Log files#
#################
*.log

#swap files#
###############
*.swp
*.*~
\#*\#
.\#*

#django migration directory#
############################
venv*
srv*
theme
collectedstatic
stunnel

# Elastic Beanstalk Files
.elasticbeanstalk/*
!.elasticbeanstalk/*.cfg.yml
!.elasticbeanstalk/*.global.yml

#Serverless package
.serverless

and this is how my .serverless looks like. All the requirements.txt have exactly the same content as the one above.

tree -L 3 .serverless/
.serverless/
├── cloudformation-template-create-stack.json
├── requirements
│   └── requirements.txt
└── requirements.txt

1 directory, 3 files
like image 901
math Avatar asked Sep 29 '18 15:09

math


1 Answers

The issue seems to be within serverless-python-requirements. As it looks like with version 4.1.1 it works flawless while with 4.2.5 it doesn't. I raised an issue on github

like image 94
math Avatar answered Sep 28 '22 16:09

math