创建AWS Lambda层时,执行AWS Lambda时,我的zip文件的所有内容/模块都将转到<mat-checkbox #checkbox [checkboxValue]="checkbox" trueValue="Yes" falseValue="No" [checked]="true">
Check me!
</mat-checkbox>
。这很容易变得麻烦和令人沮丧,因为我必须在所有lambda上使用绝对导入。示例:
/opt/
所以我想知道,是否可以事先通过serverless.yml将这些/ opt / paths添加到PATH环境变量中?这样,我只能import json
import os
import importlib.util
spec = importlib.util.spec_from_file_location("dynamodb_layer.customer", "/opt/dynamodb_layer/customer.py")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
def fetch(event, context):
CustomerManager = module.CustomerManager
customer_manager = CustomerManager()
body = customer_manager.list_customers(event["queryStringParameters"]["acquirer"])
response = {
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": "*"
},
"body": json.dumps(body)
}
return response
,而不是那种怪异的丑陋。
答案 0 :(得分:1)
我拥有适用于Python3.6运行时的Lambda层。我的my_package.zip结构为:
my_package.zip
- python
- lib
- python3.6
- site-packages
- customer
所有依赖项都位于项目根目录的build
文件夹中:
例如build/python/lib/python3.6/site-packages/customer
serverless.yml的相关部分
layers:
my_package:
path: build
compatibleRuntimes:
- python3.6
在Lambda中,我像导入其他任何软件包一样导入我的软件包:
import customer
答案 1 :(得分:0)
您是否尝试过设置PYTHONPATH env var? https://stackoverflow.com/a/5944201/6529424
您是否尝试过添加sys.path? https://stackoverflow.com/a/12257807/6529424
答案 2 :(得分:0)
在zip归档文件中,需要将模块放置在python
子目录中,以便在将其提取为Lambda中的图层时,它位于/opt/python
中。这样一来,您就可以直接导入模块,而无需使用importlib
。
它是documented here或请参阅AWS开发人员的this detailed blogpost。
答案 3 :(得分:0)
只要将项目正确放置在zip文件中,就不需要设置PYTHONPATH变量。
简单模块和程序包目录,应将它们放置在目录“ python”内,然后将整个python /放置在zip文件中,以作为层上传到AWS。不要忘记为图层添加“兼容的运行时”设置(例如Python 3.6、3.7、3.8 ...)。
举个例子:
python/
- my_module.py
- my_package_dir
-- __init__.py
-- package_mod_1.py
-- package_mod_2.py
然后将其包含在zip文件中。
zip -r my_layer_zip.zip python/
当作为一个层进行访问时,模块可以立即导入:
....
import my_module
from my_package.package_mod_2 import mod_2_function
....
如果您查看'/ opt / python /',它将显示lambda内的包结构,其中将显示my_module.py,my_package /等。使用AWS Lambda测试功能(假设该层)可以轻松对其进行测试附加到该函数(否则代码将出错)
import json
import os
def lambda_handler(event, context):
# TODO implement
dir_list = os.listdir('/opt/python/')
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!'),
'event': json.dumps(event),
'/opt/python/': dir_list
}