Помилка модуля імпорту AWS Lambda в python


92

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

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 і завантажив у лямбда-адресу (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

Будь ласка, допоможіть мені виправити помилку.


Це ваш повний код? Помилкою здається, десь щось хочеться, import lambda_functionчого не знайдено. Можливо, ти хочеш from future import lambda_function? Або просто встановіть lambda_function на рядок cmd.
Берсі

@Berci Я запускаю цю платформу коду python AWS. Я не можу використовувати pip. в будь-якому місці мого коду я використовую функцію lambda_function. ЯКЩО скопіювати той самий код в консоль AWS, він буде працювати
Nithin K Anil

Дивіться останній коментар до цієї теми - можливо, це стосується вас?
kwinkunks

@kwinkunks Я спробував це. Насправді я стискаю вміст, а не каталог !!
Nithin K Anil

2
Я припускаю, що параметр "обробника" у вашій функції неправильний. Переконайтеся , що ім'я файл під назвою «lambda_function.py» і методи обробника «lambda_handler»
Злодій

Відповіді:


110

Помилка сталася через ім’я файлу лямбда-функції. Під час створення лямбда-функції вона запитає обробник функції Лямбда. Ви повинні назвати його своїм іменем Python_File_Name.Method_Name . У цьому сценарії я назвав його як lambda.lambda_handler (lambda.py - це ім'я файлу).

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


1
Мій код просто в лямбда-коді як код, а не як файл.
Бен Вілер,

4
@BenWheeler: Незважаючи на те, що це вбудований код, це файл, який ви фактично пишете. Ви можете побачити ім'я файлу та всю структуру каталогу зліва від вікна.
Vineeth

Отже, я назвав свій код як "lambda_function.py", чи слід називати обробник як Python_lambda_function.lambda_handler?
RB17,

@RahulBanerjee No. ви б назвали це як lambda_function.lambda_handler
Dinesh


24

Іншим джерелом цієї проблеми є дозволи на файл, який заархівовано. Це ПОВИННО бути принаймні у всьому світі для читання. (хв chmod 444)

Я запустив наступне у файлі python, перш ніж його заархівувати, і він працював нормально.

chmod u=rwx,go=r

4
Це. Я використовував ZipFile Python для програмного упаковки лямбда-функцій у ZIP, за замовчуванням це має, 0600чого, як ви згадали, недостатньо. Крім того, інтегрований редактор вихідного коду Lambda (на веб-сторінці Amazon) із задоволенням прочитає файл без попередження про проблеми з дозволами.
cjhanks

2
По-друге. Я отримав це працює, встановлюючи права доступу до файлів , використовуючи метод , показаний тут: stackoverflow.com/a/434689/931277
dokkaebi

15

Я знайшов відповідь Нітіна дуже корисним. Ось конкретна інструкція:

Знайдіть ці значення:

  1. Ім'я функції lambda_handler у вашому скрипті python. У прикладах AWS використовується ім'я "lambda_handler", що виглядає як "def lambda_handler (подія, контекст)". У цьому випадку значенням є "lambda_handler"
  2. На інформаційній панелі лямбда знайдіть ім'я обробника в текстовому полі "Обробник" у розділі "Конфігурація" на панелі лямбда-панелі для функції (показано на скріншоті Nithin). Моє ім’я за замовчуванням було "lambda_function.lambda_handler".
  3. Ім'я вашого сценарію python. Скажімо, це "cool.py"

За допомогою цих значень вам потрібно буде перейменувати обробник (показано на скріншоті) у "cool.lambda_handler". Це один із способів позбутися помилки повідомлення "Неможливо імпортувати модуль 'lambda_function'". Якщо вам потрібно було перейменувати обробник у вашому сценарії python на "sup", то вам потрібно було б перейменувати обробник на панелі лямбда-панелі в "cool.sup"


11

При створенні пакетів розгортання для AWS Lambda (для Python) існує стільки прийомів . Я витрачав години та години на сеанси налагодження, поки не знайшов формулу, яка рідко дає збій.

Я створив сценарій, який автоматизує весь процес і, отже, робить його менш схильним до помилок. Я також написав підручник, який пояснює, як все працює. Ви можете перевірити це:

Безпроблемне розгортання Python Lambda [Підручник + Сценарій]


2
Чудовий пост, але я пропускаю подробиці про найскладнішу частину - як упакувати рідні бібліотеки. Це насправді не нормально, наскільки це складно
Джон Ендрюс

10

Ось короткий крок.

Припустимо, у вас є папка з назвою 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у прикладі вище.


1
Крім того, НЕ стискайте всю папку, як zip -r deploy.zip deploy. Це створить папку розгортання у файлі zip.
openwonk

8

Я знайшов цей важкий спосіб, спробувавши всі наведені вище рішення. Якщо ви використовуєте підкаталоги у файлі zip, переконайтеся, що ви включили __init__.pyфайл у кожен із підкаталогів, який працював у мене.


7

У мене теж була помилка. Виявилось, що мій zip-файл містить батьківську папку з кодом. Коли я unzipперевіряю zip-файл, lambda_functionфайл знаходиться в батьківській папці ./lambda.

Скористайтеся zipкомандою, виправте помилку:

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

1
запустіть zip всередині папки з кодом. my case here, cd lambda && zip -r ../lambda.zip ./*
Джо

4

У lambda_handlerформаті повинен бути lambda_filename.lambda_functionName. Якщо припустити, що ви хочете запустити lambda_handlerфункцію і вона працює lambda_fuction.py, тоді ваш формат обробника єlambda_function.lambda_handler .

Ще однією причиною отримання цієї помилки є залежності модулів.

Ви lambda_fuction.pyповинні бути в кореневому каталозі zip-файлу.


2

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


1

Я зіткнувся з тим самим питанням, це була вправа в рамках підручника на lynda.com, якщо я не помиляюся. Помилкою, яку я зробив, було не вибір часу роботи як Python 3.6, що є опцією у функціональній консолі lamda.


1

Перспектива з 2019 року:

Тепер AWS Lambda підтримує Python 3.7, який багато людей (включаючи мене) вирішили використовувати як час виконання вбудованих лямбд.

Потім мені довелося імпортувати зовнішню залежність, і я слідував Документам AWS, як згадано в OP. (локальна установка -> zip -> завантаження).

У мене сталася помилка модуля імпорту, і я зрозумів, що на моєму локальному ПК Python 2.7 був Python за замовчуванням. Коли я викликав pip, він встановив мою залежність для Python 2.7.

Тому я перейшов локально на версію Python, яка відповідає вибраній версії середовища виконання в лямбда-консолі, а потім перевстановив зовнішні залежності. Це вирішило проблему для мене. Наприклад:

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

1

Проблема тут у тому, що версія Python, яка використовувалася для побудови залежностей функції Lambda (на вашій машині), відрізняється від вибраної версії Python для вашої функції Lambda. Цей випадок є загальним, особливо якщо бібліотека Numpy є частиною ваших залежностей.

Приклад: Версія python на вашій машині: 3.6 ---> Лямбда-версія python 3.6


0

Вам потрібно заархівувати всі вимоги, скористайтеся цим сценарієм

#!/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>

0

Поділіться своїм рішенням для тієї ж проблеми, про всяк випадок, якщо це комусь допоможе.

Проблема: Помилка: "[ПОМИЛКА] 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 / блоги / великі дані / аналіз-vpc-flow-logs-with-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight /


Для мене все було навпаки (2,7 -> 3,8)
demonicdaron

0

Ви можете налаштувати свою функцію лямбда для введення додаткового коду та вмісту у вигляді шарів. Шар - це ZIP-архів, який містить бібліотеки, власний час виконання або інші залежності. З шарами ви можете використовувати бібліотеки у своїй функції без необхідності включати їх у свій пакет розгортання. Шари дозволяють вам зменшити пакет розгортання, що полегшує розробку.

Список літератури: -

  1. https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
  2. https://towardsdatascience.com/introduction-to-amazon-lambda-layers-and-boto3-using-python3-39bd390add17


0

Моя проблема полягала в тому, що файл .py та залежності не знаходились у кореневому каталозі zip. наприклад, шлях до бібліотек та лямбда-функції .py повинен бути:

<lambda_function_name>.py
<name of library>/foo/bar/

ні

/foo/bar/<name of library>/foo2/bar2

Наприклад:

drwxr-xr-x  3.0 unx        0 bx stor 20-Apr-17 19:43 boto3/ec2/__pycache__/
-rw-r--r--  3.0 unx      192 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/__init__.cpython-37.pyc
-rw-r--r--  3.0 unx      758 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/deletetags.cpython-37.pyc
-rw-r--r--  3.0 unx      965 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/createtags.cpython-37.pyc
-rw-r--r--  3.0 unx     7781 tx defN 20-Apr-17 20:33 download-cs-sensors-to-s3.py

0

Насправді перейдіть до головної папки (пакету розгортання), яку потрібно заархівувати,

Всередині цієї папки виберіть усі файли, а потім створіть zip-файл і завантажте цей zip-файл


0

Будь ласка, додайте нижче один після Import requests

import boto3

Що я бачу, чого не вистачає у вашому коді.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.