Ошибка модуля импорта 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
Пожалуйста, помогите мне отладить ошибку.
Ответы
Ответ 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/