Как исправить ошибку «Невозможно импортировать модуль» в AWS lambda - PullRequest
0 голосов
/ 04 января 2019

Я написал скрипт, который поможет мне автоматизировать создание новых микро-сервисов.Он работает, принимая URI хранилища битовых ящиков и учетные данные AWS.Он клонирует репозиторий, добавляет файл bitbucket-pipelines.yml.Создает новую лямбда-функцию, вызывая CLI и используя шаблон zip в качестве базового кода.Он также устанавливает лямбда-обработчик на main.lambda_handler.Затем он добавляет необходимые переменные репозитория в bitbucket и фиксирует файлы проекта.Затем конвейер запускается и обновляет код в лямбде.Все выглядит нормально, пока я не попробую запустить Lambda.

Вот файл bitbucket-pipelines.yml

image: peteremil/zipaws

pipelines:
  default:
    - step:
        name: Deploy code to S3
        deployment: staging
        script:
          - mkdir packages
          - pip install -r requirements.txt --target=packages
          - chmod 777 -R *
          - zip -r $semver.zip .
          - aws s3 cp $semver.zip s3://{code_s3_bucket}/$staging_location/
          - aws lambda update-function-code --region $aws_region --function-name {function_name}-function --s3-bucket {code_s3_bucket} --s3-key $staging_location/$semver.zip

Вот файл main.py

import json
import os
import sys
import requests

packages_path = os.path.join(os.path.split(__file__)[0], "packages")
sys.path.append(packages_path)


def main(local_id):
    return {
        "success" : local_id
    }


def lambda_handler(event, context):
    local_id = event["queryStringParameters"]["local_id"]
    response = main(local_id)
    return {
        "statusCode": 200,
        "headers": {"content-type": "application/json"},
        "body": json.dumps(response)
    }


if __name__ == '__main__':
    local_id = sys.argv[-1]
    response = main(local_id)
    print(response)

Я создал следующее тестовое событие

{
    "queryStringParameters": {
        "local_id": "00000000"
    }
} 

Ожидаемый результат от созданного мною события должен быть

{
    "statusCode": 200,
    "headers" : {"content-type": "application/json"},
    "body" : {
        {
            "success" : "00000000"
    }
}

, но вместо этого лямбда не выполнится и выдаст мне

{
    "errorMessage": "Unable to import module 'main'"
}

Я попытался переименовать обработчик, получить настройки другой работающей лямбды (которая была создана вручную из консоли) и посмотреть, есть ли различия, но я всегда получаю ту же ошибку.Файл main.py хорошо отображается в редакторе встроенного кода.

Обновление 1 Я добавил строку import requests в main.py, поскольку выясняется, что это вызывает проблему.,Я думал, что это безвредно, поэтому я не включил его в исходное тело вопроса.

1 Ответ

0 голосов
/ 04 января 2019

Как оказалось, в моем коде у меня был установлен импорт библиотеки внутри папки packages\, но я импортировал ее до добавления папки в sys.path, поэтому решение было import requests после добавления packages_path путь к sys.path.

main.py теперь начинается следующим образом

import json
import os
import sys

packages_path = os.path.join(os.path.split(__file__)[0], "packages")
sys.path.append(packages_path)

import requests #moved this line down after adding packages_path to sys.path
...