2016-02-11 6 views
35

Я создаю пакет развертывания AWMS Lambda python. Я использую один внешний запрос зависимостей. Я установил внешнюю зависимость, используя документацию AWS http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html. Ниже приведен код моего питона.Ошибка модуля импорта AWMS в 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 

создание почтового индексу содержания проект-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 

Просьба помочь мне отладить ошибку.

+0

Это ваш полный код? По ошибке кажется, что что-то захочет «импортировать lambda_function», который не найден. Возможно, вы хотите «из будущего импорта lambda_function»? Или просто * pip install lambda_function * на строке cmd. – Berci

+0

@Berci Запустил эту платформу AWS python codein. Я не могу использовать pip. где-нибудь в моем коде, используя lambda_function. ЕСЛИ i скопировать вставку того же кода в AWS-консоли, он будет работать –

+0

Посмотреть последний комментарий к этой теме (https://gist.github.com/kapilt/770bdf5d2a55b7385a9c) - может быть, относится к вам? – kwinkunks

ответ

50

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

Ниже приведен снимок. enter image description here

+1

Мой код только в лямбда как код - не как файл. –

+0

@BenWheeler: Даже если это встроенный код, это файл, который вы на самом деле его пишете. Вы можете увидеть имя файла и всю структуру каталогов слева от окна. – Vineeth

10

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

просмотровых эти значения:

  1. Имя функции lambda_handler в вашем питоне скрипт. Имя , используемое в примерах AWS, это «lambda_handler», смотрящий как «def lambda_handler (событие, контекст)». В этом случае значение равно «lambda_handler»
  2. В панели приборов Lambda найдите имя обработчика в текстовом поле «Обработчик» в разделе «Конфигурация» на лямбда-панели для . Функция (показана в Скриншот Нитина). Мое имя по умолчанию было «lambda_function.lambda_handler».
  3. Имя вашего скрипта python. Предположим, что это «cool.py»

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

+0

Мой код только в лямбда как код - не как файл. –

17

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

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

chmod u=rwx,go=r 
+4

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

+1

Второй. Я получил его работу, установив права доступа к файлам, используя метод, показанный здесь: http://stackoverflow.com/a/434689/931277 – dokkaebi

4

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

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

Hassle-Free Python Lambda Deployment [Tutorial + Script]

10

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

1

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

2

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

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

zip -r ../lambda.zip ./* 
+0

запустите zip внутри вашей папки с кодом. мой случай здесь, cd lambda && zip -r ../lambda.zip ./* – Joe

Смежные вопросы