簡體   English   中英

python代碼可以部署在AWS lambda中,但不能部署在localstack中

[英]python code can be deployed in AWS lambda but not in localstack

我開發了一個python(v3.6)項目,該項目已部署並實際上在我的AWS生產平台中的無服務器lambda中工作。 該項目使用以下依賴項:

- awscli==1.16.10
- boto3==1.9.0
- botocore==1.12.0
- psycopg2==2.7.5
- SQLAlchemy==1.2.11
- SQLAlchemy-Utils==0.33.3
- jsonschema==2.6.0

現在,我想使用localstack在可以調用的lambda中部署該項目,以測試我的調用代碼(而不是我的項目代碼,該代碼實際上有效!)

要部署項目,首先我要安裝依賴項並創建一個zip文件:

pip install -r requirements.txt --upgrade -t ./
chmod -R 755 .
zip -r lambda.zip .

然后,我使用命令(運行本地堆棧):

aws lambda --region eu-east-1 --endpoint localhost:4574 \
    create-function --function-name mylambda \
    --zip-file fileb://lambda.zip

但是,它從localstack返回一個錯誤:

....
localstack_1  |     from functools32 import lru_cache
localstack_1  | ImportError: No module named functools32
....
localstack_1  |     raise Exception('Unable to get handler function from lambda code.', e)
localstack_1  | Exception: ('Unable to get handler function from lambda code.', ImportError('No module named functools32',))

jsonschema使用模塊functools32,僅適用於python 2.7或<= 3.2。 我正在使用python 3.6,所以無法安裝。 此外,當我在AWS生產平台中部署相同的lambda.zip時,我沒有出現此錯誤。

我真的不知道如何解決這個問題。 如果有人有想法要檢查,我將非常感謝。

問候,

除了創建lambda函數時,我的操作方式與我非常相似,我還附加了一些定義處理程序函數,運行時等的標志,所以我要說的是錯誤所在。 話雖如此,我可以在AWS和Localstack上成功運行lambda,因此這是我的方法:

  1. 首先制作一個將安裝需求的Dockerfile

     # Dockerfile FROM lambci/lambda:build-python3.7 ENV REQPATH /root/requirements.txt COPY ./requirements.txt /root/requirements.txt pip3 install -i https://pypi.douban.com/simple -r ${REQPATH} --target=/opt/python/lib/python3.7/site-packages/ RUN cd /opt && zip -r /root/lambda-layer.zip * 
  2. 現在,構建映像並從容器中獲取.zip文件:

     #!/bin/bash docker build -t lambda-layer:my_version ${NOCACHE} . id=$(docker create lambda-layer:my_version) docker cp $id:/root/lambda-layer.zip ~/lambda-layer.zip docker rm -v $id 
  3. 現在,該.zip文件可能是需要上載到AWS的文件,因為我直接在其網站上編寫了lambda函數,但是對於Localstack,我們需要制作一個新的.zip文件,其中包含與剛剛制作的內容相同,但為lambda添加python腳本。

  4. 在這種情況下,編寫一個依賴於某些第三方模塊的lambda腳本; requests

     # lambda.py import requests def handler(event, context): print("--- testing localstack lambda ---") print("event: ", event) print("context: ", context.__dict__) r = requests.get("http://192.168.xx.xx/path/") print("r: ", r) return {"foo": "bar"} 
  5. 使用上面的python腳本制作一個新的.zip文件:

     # shell $ cp lambda-layer.zip lambda-layer-localstack.zip $ zip -ur lambda-layer-localstack.zip lambda.py # Check contents on zip file contain the python # dependencies and lambda function script $ unzip -l lambda-layer-localstack.zip Archive: lambda-layer-localstack.zip Length Date Time Name --------- ---------- ----- ---- 0 2019-02-02 15:37 python/ 261 2019-02-02 15:43 lambda.py --------- ------- 261 2 files 
  6. 現在我們只需要在Localstack上創建該lambda函數

     $ awslocal --endpoint-url=http://192.168.xx.xx:4569 \\ lambda create-function \\ --function-name=function1 \\ --runtime=python3.7 \\ --role=r1 \\ --handler=lambda.handler --zip-file fileb://lambda-layer-localstack.zip 
  7. 最后,測試它是否有效

     $ awslocal --endpoint-url=http://192.168.2.75:4569 \\ lambda invoke --function-name function1 result1.log { "StatusCode": 200 } # On docker-compose logs (docker-compose logs -f) localstack_1 | --- testing localstack lambda --- localstack_1 | ('event: ', None) localstack_1 | ('context: ', {..}) localstack_1 | ('r: ', <Response [200]>) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM