是否可以通过serverless.yml将路径添加到PATH环境变量?

时间:2019-01-11 18:47:51

标签: python amazon-web-services serverless-framework serverless aws-serverless

创建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 ,而不是那种怪异的丑陋。

4 个答案:

答案 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
    }