Как создать слой в лямбда-функции - PullRequest
3 голосов
/ 09 июля 2020

Шаги, которые были выполнены для создания

  1. Создайте виртуальную среду и активируйте ее
  2. pip install elasticsearch
  3. Заархивируйте папку внутри 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!')
    }

Тем не менее, я получил "errorMessage": "Unable to import module 'lambda_function': No module named 'elasticsearch'",

Ответы [ 2 ]

4 голосов
/ 09 июля 2020

Если можно, я бы порекомендовал альтернативную технику, которая меня никогда не подводила. Техника включает в себя docker инструмент , описанный в недавнем AWS блоге :

Таким образом, для этого вопроса я проверил его , используя elasticsearch следующим образом:

  1. Создайте пустую папку, например mylayer.

  2. Go, в папку и создайте файл requirements.txt с содержимым

elasticsearch
Выполните следующую команду 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"
Создать слой как zip:
zip -r elastic.zip python > /dev/null

Создайте слой лямбда на основе elastic.zip в AWS Console. Не забудьте указать Compatible runtimes на python3.8.

Протестируйте слой в лямбда-выражении, используя следующую лямбда-функцию:

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']
0 голосов
/ 09 июля 2020

Как уже упоминалось @Marcin, одна опция, которая требуется Docker для установки на целевой машине. Если вы хотите пропустить docker, вы можете использовать приведенный ниже сценарий для создания и публикации слоя sh в AWS.

Все, что вам нужно

./creater_layer.sh <package_name> <layer_name>

./creater_layer.sh elasticsearch my-layer

script creater_layer.sh

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
...