Python 如何在lambda函数中创建图层

Python 如何在lambda函数中创建图层,python,amazon-web-services,aws-lambda,Python,Amazon Web Services,Aws Lambda,创建所遵循的步骤 创建并激活虚拟环境 pip安装elasticsearch 将文件夹压缩到site-packages.Zip中 4.在AWS中创建图层(名称为elastic) 在lambda_handler中添加下面的代码,并添加层elastic 下面是代码 import json from elasticsearch import Elasticsearch, RequestsHttpConnection def lambda_handler(event, context): # TO

创建所遵循的步骤

  • 创建并激活虚拟环境
  • pip安装elasticsearch
  • 将文件夹压缩到site-packages.Zip中
  • 4.在AWS中创建图层(名称为
    elastic

  • 在lambda_handler中添加下面的代码,并添加层
    elastic
  • 下面是代码

    import json
    from elasticsearch import Elasticsearch, RequestsHttpConnection
    def lambda_handler(event, context):
        # TODO implement
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from Lambda!')
        }
    

    我仍然收到了“错误消息”:“无法导入模块‘lambda_函数’:没有名为‘elasticsearch’的模块”,

    如果可以的话,我想推荐一种从未失败过的替代技术。该技术包括最近AWS博客中描述的docker工具:

    因此,对于这个问题,我使用
    elasticsearch
    验证了它,如下所示:

  • 创建空文件夹,例如
    mylayer

  • 转到文件夹并创建包含以下内容的
    requirements.txt
    文件:

  • 运行以下docker命令(可以根据需要调整python版本):
  • 将图层创建为zip:
  • 基于AWS控制台中的
    elastic.zip
    创建lambda层。别忘了将
    兼容运行时指定给
    python3.8

  • 使用以下lambda函数在lambda中测试层:

  • 该函数正确执行:

    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bulk', 'clear_scroll', 'close', 'count', 'create', 'delete', 'delete_by_query', 'delete_by_query_rethrottle', 'delete_script', 'exists', 'exists_source', 'explain', 'field_caps', 'get', 'get_script', 'get_script_context', 'get_script_languages', 'get_source', 'index', 'info', 'mget', 'msearch', 'msearch_template', 'mtermvectors', 'ping', 'put_script', 'rank_eval', 'reindex', 'reindex_rethrottle', 'render_search_template', 'scripts_painless_execute', 'scroll', 'search', 'search_shards', 'search_template', 'termvectors', 'update', 'update_by_query', 'update_by_query_rethrottle']
    

    @Marcin已经提到了一个选项,要求在目标机器上安装Docker。若你们想跳过docker,那个么你们可以使用下面的脚本来创建图层并发布到AWS

    你需要的一切

    ./creater_layer.sh <package_name> <layer_name>
    
    ./creater_layer.sh elasticsearch my-layer
    
    

    Sir如何在windows机器中操作?您可以在windows中使用git bash,不需要在脚本中进行任何更改。您可以回答以下问题吗?无法在本地找到图像“lambci/lambda:build-python3.8”我已安装docker并已启动dockerdesktop@aysh似乎是一个新问题。也许可以用相关信息和错误信息提出新问题?
    zip -r elastic.zip python > /dev/null
    
    import json
    
    from elasticsearch import Elasticsearch, RequestsHttpConnection
    
    def lambda_handler(event, context):
        # TODO implement
        
        print(dir(Elasticsearch))
        
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from Lambda!')
        }
    
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bulk', 'clear_scroll', 'close', 'count', 'create', 'delete', 'delete_by_query', 'delete_by_query_rethrottle', 'delete_script', 'exists', 'exists_source', 'explain', 'field_caps', 'get', 'get_script', 'get_script_context', 'get_script_languages', 'get_source', 'index', 'info', 'mget', 'msearch', 'msearch_template', 'mtermvectors', 'ping', 'put_script', 'rank_eval', 'reindex', 'reindex_rethrottle', 'render_search_template', 'scripts_painless_execute', 'scroll', 'search', 'search_shards', 'search_template', 'termvectors', 'update', 'update_by_query', 'update_by_query_rethrottle']
    
    ./creater_layer.sh <package_name> <layer_name>
    
    ./creater_layer.sh elasticsearch my-layer
    
    
    path="app"
    package="${1}"
    layername="${2}"
    mkdir -p $path
    pip3 install "${package}" --target "${path}/python/lib/python3.8/site-packages/"
    cd $path && zip -r ../lambdalayer.zip .
    aws lambda publish-layer-version --layer-name "${layername}" --description "My layer" --license-info "MIT" --zip-file "fileb://../lambdalayer.zip" --compatible-runtimes python3.8