Я создаю пакет развертывания AWS Lambda python. Я использую один запрос внешней зависимости. Я установил внешнюю зависимость, используя документацию 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
Пожалуйста, помогите мне отладить ошибку.
python
amazon-web-services
aws-lambda
Нитин К Анил
источник
источник
import lambda_function
чего- то, чего не найдено. Может, хочешьfrom future import lambda_function
? Или просто установите lambda_function в строке cmd.Ответы:
Ошибка возникла из-за имени файла лямбда-функции. При создании лямбда-функции он запросит обработчик лямбда-функции. Вы должны назвать его своим Python_File_Name.Method_Name . В этом сценарии я назвал его lambda.lambda_handler (lambda.py - это имя файла).
Ниже приведен снимок.
источник
Если вы загружаете zip-файл. Убедитесь, что вы архивируете содержимое каталога, а не сам каталог.
источник
Другой источник этой проблемы - права доступа к заархивированному файлу. Он ДОЛЖЕН быть доступен для чтения по крайней мере во всем мире. (мин
chmod 444
)Я запустил следующее в файле python перед его архивированием, и он работал нормально.
источник
0600
этого недостаточно. Кроме того, встроенный редактор исходного кода Lambda (на веб-странице Amazon) с радостью прочитает файл без предупреждения о проблемах с разрешениями.Я нашел ответ Нитина очень полезным. Вот конкретное пошаговое руководство:
Найдите эти значения:
С этими значениями вам нужно будет переименовать обработчик (показанный на скриншоте) в "cool.lambda_handler". Это один из способов избавиться от сообщения об ошибке «Невозможно импортировать модуль lambda_function». Если бы вы переименовали обработчик в скрипте python на «sup», тогда вам нужно было бы переименовать обработчик на панели лямбда-анализа в «cool.sup»
источник
При создании пакетов развертывания для AWS Lambda (для Python) существует так много ошибок . Я потратил часы и часы на сеансы отладки, пока не нашел формулу, которая редко дает сбой.
Я создал сценарий, который автоматизирует весь процесс и, следовательно, делает его менее подверженным ошибкам. Я также написал учебник, в котором объясняется, как все работает. Вы можете проверить это:
Беспроблемное развертывание Python Lambda [Учебное пособие + сценарий]
источник
Вот быстрый шаг.
Предположим, у вас есть папка с именем
deploy
с вашим лямбда-файлом внутри calllambda_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
папки.Как только вы это сделаете, вот как должна выглядеть ваша структура.
Наконец, вам нужно преобразовать
zip
все содержимоеdeploy
папки в сжатый файл. На Mac или Linux команда будет выглядетьzip -r ../deploy.zip *
внутриdeploy
папки. Обратите внимание, что этот-r
флаг предназначен для рекурсивных вложенных папок.Структура ZIP-файла должна отражать исходную папку.
Загрузите zip-файл и укажите, как
<file_name>.<function_name>
Lambda будет использоваться в вашем процессе, какlambda_function.lambda_handler
в примере выше.источник
zip -r deploy.zip deploy
. Это создаст папку развертывания в zip-файле.Я нашел этот трудный путь после попытки всех вышеперечисленных решений. Если вы используете подкаталоги в zip-файле, убедитесь, что вы включили
__init__.py
файл в каждый из подкаталогов, и это сработало для меня.источник
У меня тоже была ошибка. Оказалось, что мой zip-файл включает родительскую папку code. Когда я
unzip
просматриваю zip-файл, онlambda_function
находится в родительской папке./lambda
.Воспользуйтесь
zip
командой, исправьте ошибку:zip -r ../lambda.zip ./*
источник
В
lambda_handler
формате должно бытьlambda_filename.lambda_functionName
. Предположим, вы хотите запуститьlambda_handler
функцию, и она находится вlambda_fuction.py
, тогда ваш формат обработчикаlambda_function.lambda_handler
.Еще одна причина появления этой ошибки - зависимости модулей.
Вы
lambda_fuction.py
должны находиться в корневом каталоге zip-файла.источник
@nithin, AWS выпустила
layers
концепцию внутриLambda
функций. Вы можете создать свой слой и загрузить туда столько же библиотек, а затем связать слой с лямбда-функциями. Подробнее: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html.источник
Взгляд с 2019 года:
AWS Lambda теперь поддерживает Python 3.7, который многие люди (включая меня) предпочитают использовать в качестве среды выполнения для встроенных лямбда-выражений.
Затем мне пришлось импортировать внешнюю зависимость, и я последовал за Документами AWS в качестве OP. (локальная установка -> zip -> загрузить).
У меня была ошибка модуля импорта, и я понял, что на моем локальном компьютере Python 2.7 установлен по умолчанию. Когда я вызвал pip, он установил мою зависимость для Python 2.7.
Поэтому я локально переключился на версию Python, которая соответствует выбранной версии среды выполнения в лямбда-консоли, а затем повторно установил внешние зависимости. Это решило проблему для меня. Например:
источник
Я столкнулся с той же проблемой, если я не ошибаюсь, это было упражнение в рамках учебного курса на lynda.com. Ошибка, которую я сделал, заключалась в том, что я не выбрал среду выполнения как Python 3.6, которая является опцией в консоли функций lamda.
источник
Проблема здесь в том, что версия Python, используемая для построения зависимостей вашей лямбда-функции (на вашем собственном компьютере), отличается от выбранной версии Python для вашей лямбда-функции. Этот случай распространен, особенно если библиотека Numpy входит в ваши зависимости.
Пример: версия python для вашего компьютера: 3.6 ---> Lambda python версии 3.6
источник
Вам нужно заархивировать все требования, используйте этот скрипт
#!/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
использовать с:
источник
Делюсь своим решением той же проблемы, на всякий случай, если это кому-то поможет.
Проблема: возникла ошибка: «[ОШИБКА] 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 / analysis-vpc-flow-logs-with-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight /
источник
Вы можете настроить свою лямбда-функцию для получения дополнительного кода и содержимого в виде слоев. Слой - это ZIP-архив, содержащий библиотеки, настраиваемую среду выполнения или другие зависимости. Со слоями вы можете использовать библиотеки в своей функции без необходимости включать их в пакет развертывания. Слои позволяют сохранить небольшой размер пакета развертывания, что упрощает разработку.
Ссылки:-
источник
Убедитесь, что вы заархивировали все зависимости в структуре папок как python / [Your All Dependencies], чтобы она работала в соответствии с этой документацией.
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
источник
Моя проблема заключалась в том, что файл .py и зависимости не находились в «корневом» каталоге zip-архива. например, путь к библиотекам и лямбда-функции .py должен быть:
не
/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
источник
Фактически перейдите в основную папку (пакет развертывания), которую вы хотите заархивировать,
Внутри этой папки выберите все файлы, затем создайте zip и загрузите этот zip
источник
Пожалуйста, добавьте ниже один после
Import requests
import boto3
То, что я вижу, отсутствует в вашем коде.
источник
Не нужно делать такой беспорядок.
использовать python-lambda
https://github.com/nficano/python-lambda
с помощью одной команды
pylambda deploy
он автоматически развернет вашу функциюисточник