首页 > 解决方案 > 如何在 lambda 函数中创建图层

问题描述

创建的步骤

  1. 创建一个虚拟环境并激活它
  2. 点安装弹性搜索
  3. 压缩 site-packages.zip 中的文件夹

4.在AWS中创建层(比如名字是elastic

  1. 在 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!')
    }

我还是得到了 "errorMessage": "Unable to import module 'lambda_function': No module named 'elasticsearch'",

标签: pythonamazon-web-servicesaws-lambda

解决方案


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

因此,对于这个问题,我使用以下方法对其进行了验证elasticsearch

  1. 创建空文件夹,例如mylayer.

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

elasticsearch
  1. 运行以下 docker 命令(可以根据需要调整 python 版本):
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
  1. 将图层创建为 zip:
zip -r elastic.zip python > /dev/null
  1. elastic.zip在 AWS 控制台中创建 lambda 层。不要忘记指定Compatible runtimesto python3.8

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

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']

推荐阅读