Подтвердить что ты не робот

Ошибка модуля импорта AWS Lambda в python

Я создаю пакет развертывания python для платформы AMS AWS. Я использую один внешний запрос зависимостей. Я установил внешнюю зависимость, используя документацию AWS http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html. Ниже приведен код моего питона.

import requests

print('Loading function')

s3 = boto3.client('s3')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))

    # Get the object from the event and show its content type
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
    try:
        response = s3.get_object(Bucket=bucket, Key=key)
        s3.download_file(bucket,key, '/tmp/data.txt')
        lines = [line.rstrip('\n') for line in open('/tmp/data.txt')]
        for line in lines:
            col=line.split(',')
            print(col[5],col[6])
        print("CONTENT TYPE: " + response['ContentType'])
        return response['ContentType']
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

Создал Zip содержимое каталога project-dir и загрузился в lambda (Zip содержимое каталога, а не каталог). Когда я выполняю функцию, я получаю указанную ниже ошибку.

START RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Version: $LATEST
**Unable to import module 'lambda_function': No module named lambda_function**

END RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058
REPORT RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058  Duration: 19.63 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 9 MB

Пожалуйста, помогите мне отладить ошибку.

4b9b3361

Ответ 1

Ошибка произошла из-за имени файла лямбда-функции. При создании лямбда-функции он попросит обработчик функции Lambda. Вы должны назвать его как Python_File_Name.Method_Name. В этом сценарии я назвал его lambda.lambda_handler (lambda.py - это имя файла).

Ниже приведен снимок. введите описание изображения здесь

Ответ 2

Если вы загружаете ZIP файл. Убедитесь, что вы архивируете содержимое каталога, а не сам каталог.

Ответ 3

Другим источником этой проблемы являются разрешения на файл, который зашифрован. Он ДОЛЖЕН быть по крайней мере общедоступным для чтения. (мин chmod 444)

Я запустил следующее в файле python перед тем, как закрепить его, и он отлично работал.

chmod u=rwx,go=r

Ответ 4

Я нашел ответ Нитин очень полезным. Вот конкретное прохождение:

Посмотрите на эти значения:

  • Имя функции lambda_handler в вашем python script. имя, используемое в примерах AWS, - это "lambda_handler", смотрящий например "def lambda_handler (событие, контекст)". В этом случае значение равно "Lambda_handler"
  • На панели инструментов Lambda найдите имя обработчика в текстовом поле "Обработчик" в разделе "Конфигурация" в панели лямбда-панели для функция (показана на скриншоте Nithin). Мое имя по умолчанию было "Lambda_function.lambda_handler".
  • Имя вашего питона script. Скажем, это "cool.py"

С этими значениями вам нужно будет переименовать обработчик (показанный на скриншоте) в "cool.lambda_handler". Это один из способов избавиться от "Невозможно импортировать модуль lambda_function" errorMessage. Если вы переименовали обработчик в вашем python script в "sup", вам нужно будет переименовать обработчик в лямбда-панели на "cool.sup"

Ответ 5

Существует так много ошибок при создании пакетов развертывания для AWS Lambda (для Python). Я провел часы и часы на отладке сессий, пока не нашел формулу, которая редко терпит неудачу.

Я создал script, который автоматизирует весь процесс и, следовательно, делает его менее подверженным ошибкам. Я также написал учебник, в котором объясняется, как все работает. Вы можете проверить это:

Беспроблемное развертывание Lambda Python [Учебное пособие + Script]

Ответ 6

Я нашел этот трудный путь, попробовав все вышеперечисленные решения. Если вы используете подкаталоги в zip файле, убедитесь, что вы включили файл __init__.py в каждый из подкаталогов и который работал у меня.

Ответ 7

У меня тоже была ошибка. Оказывается, что мой zip файл включает родительскую папку кода. Когда я unzip и проверьте zip файл, файл lambda_function находится в родительской папке ./lambda.

Используйте команду zip, исправьте ошибку:

zip -r ../lambda.zip ./*

Ответ 8

Здесь быстрый шаг.

Предположим, у вас есть папка с именем deploy с вашим лямбда файлом внутри вызова lambda_function.py. Предположим, этот файл выглядит примерно так. (p1 и p2 представляют сторонние пакеты.)

import p1
import p2

def lambda_handler(event, context):
    # more code here

    return {
        "status": 200,
        "body" : "Hello from Lambda!",
    }

Для каждой сторонней зависимости вам нужно pip install <third-party-package> --target . из папки deploy.

pip install p1 --target .
pip install p2 --target .

Как только вы это сделаете, вот как должна выглядеть ваша структура.

deploy/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

Наконец, вам нужно zip переместить все содержимое в папке deploy в сжатый файл. На Mac или Linux команда будет выглядеть как zip -r ../deploy.zip * из папки deploy. Обратите внимание, что флаг -r предназначен для рекурсивных подпапок.

Структура zip файла должна соответствовать исходной папке.

deploy.zip/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

Загрузите zip файл и укажите <file_name>.<function_name> для Lambda для входа в ваш процесс, например lambda_function.lambda_handler для приведенного выше примера.

Ответ 9

Я столкнулся с той же проблемой, это было упражнение как часть учебного пособия на lynda.com, если я не ошибаюсь. Ошибка, которую я сделал, заключалась не в выборе среды выполнения в качестве Python 3.6, которая является опцией в консоли функций lamda.

Ответ 10

в lambda_handler формат должен быть lambda_filename.lambda_functionName Предположим, что если вы хотите запустить функцию lambda_handler и если она находится в lambda_fuction.py, то ваш формат обработчика - "lambda_function.lambda_handler". Другая причина получения ошибки - зависимости модуля.  ваш lambda_fuction.py должен находиться в корневом каталоге zip.

Ответ 11

Нет необходимости делать этот беспорядок.

использовать python-lambda

https://github.com/nficano/python-lambda

с помощью одной команды pylambda deploy она автоматически развернет вашу функцию

Ответ 12

Вам нужно сжать все требования, используйте этот скрипт

#!/usr/bin/env bash
rm package.zip
mkdir package
pip install -r requirements.txt --target package
cat $1 > package/lambda_function.py
cd package
zip -r9 "../package.zip" .
cd ..
rm -rf package

использовать с:

package.sh <python_file>

Ответ 13

@nithin, AWS выпустила концепцию layers внутри Lambda функций. Вы можете создать свой слой, и там вы можете загрузить столько же, сколько библиотек, а затем вы можете соединить слой с лямбда-функциями. Для получения более подробной информации: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

Ответ 14

Перспектива с 2019 года:

AWS Lambda теперь поддерживает Python 3.7, который многие люди (включая меня) выбирают в качестве среды выполнения для встроенных лямбд.

Затем мне пришлось импортировать внешнюю зависимость, и я следовал Документам AWS, как упоминалось в OP. (локальная установка → zip → upload).

У меня была ошибка модуля импорта, и я понял, что мой локальный ПК имел Python 2.7 в качестве Python по умолчанию. Когда я вызвал pip, он установил мою зависимость для Python 2.7.

Поэтому я переключился локально на версию Python, которая соответствует выбранной версии времени выполнения в лямбда-консоли, а затем переустановил внешние зависимости. Это решило проблему для меня. Например.:

$ python3 -m pip install --target path/to/lambda_file <external_dependency_name>

Ответ 15

Поделиться своим решением для той же проблемы, на всякий случай, если это кому-нибудь поможет.

Выпуск: Я получил ошибку: "[ОШИБКА] Runtime.ImportModuleError: Невозможно импортировать модуль 'lambda_function': нет модуля с именем 'StringIO'" при выполнении кода aws-big-data-blog [1], предоставленного в статье AWS [2].

Решение: Изменено время выполнения с Python 3.7 до Python 2.7

[1] - https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/CloudwatchLogsToFirehose/lambdacode.py [2] - https://aws.amazon.com/blogs/big-data/analyzing-vpc-flow-logs-with-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight/