FunctionApp не импортирует модуль python - PullRequest
0 голосов
/ 14 июля 2020

Я целыми днями пытался развернуть приложение-функцию с помощью Terraform. Он использует модуль запросов python.

Я сузил проблему до Azure без импорта модулей python в файл requirements.txt. файл.

Для проверки я создал простое приложение-функцию httptrigger, которое просто возвращает параметр URL. Мой сценарий развертывания сжимает каталоги и развертывает приложение с помощью terraform. Все в порядке и все работает, как ожидалось.

Но, если изменить мой python скрипт (__init__.py) на импорт python модулей «urllib3» и / или «запросов», функция не сработает, хотя простой сценарий python на самом деле не использует никаких методов или классов из модулей. При развертывании функции ошибок нет. Он не работает при вызове с URL-адреса.

Я проверил, что модули перечислены в файле requirements.txt.

И, чтобы быть уверенным, если я закомментирую запросы на импорт и urllib3, все работает.

Любые советы или предложения были бы очень признательны.

Простой тестовый скрипт (__init__.py):

import logging
import azure.functions as func
# function fails with the following line.  Works if commented out.
import urllib3



def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    target = req.params.get('target')
    if target:
        return func.HttpResponse("Pretending to use " + target, status_code = 503)
    else:
        return func.HttpResponse("No Taget Specified", status_code = 400)

requirements.txt (Обновлено 15.07 )

azure-functions==1.2.1
future==0.18.2
pefile==2019.4.18
PyInstaller==3.6
pylint==2.5.3
pywin32-ctypes==0.2.0
PyYAML==5.3.1
urllib3==1.25.9
requests==2.24.1

Обновление 7/16: Файл Terraform:

variable "prefix" {
    type = "string"
    default = "jis"
}

variable "location" {
    type = "string"
    default = "eastus"
}

variable "environment" {
    type = "string"
    default = "dev"
}

variable "functionapp" {
    type = "string"
    default = "./testit.zip"
}

resource "random_string" "storage_name" {
    length = 24
    upper = false
    lower = true
    number = true
    special = false
}

provider "azurerm" {
  version = "~>2.1.0"
  features {}
}

# Create Storage Account

resource "azurerm_resource_group" "rg" {
    name = "${var.prefix}-${var.environment}"
    location = "${var.location}"
}

resource "azurerm_storage_account" "storage" {
    name = "${random_string.storage_name.result}"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    location = "${var.location}"
    account_tier = "Standard"
    account_replication_type = "LRS"
}

resource "azurerm_storage_container" "deployments" {
    name = "function-releases"
    storage_account_name = "${azurerm_storage_account.storage.name}"
    container_access_type = "private"
}

# upload zip file

resource "azurerm_storage_blob" "appcode" {
    name = "functionapp.zip"
    storage_account_name = "${azurerm_storage_account.storage.name}"
    storage_container_name = "${azurerm_storage_container.deployments.name}"
    type = "Block"
    source = "${var.functionapp}"
}

# Create function app

data "azurerm_storage_account_sas" "sas" {
    connection_string = "${azurerm_storage_account.storage.primary_connection_string}"
    https_only = true
    start = "2020-07-10"
    expiry = "2023-12-31"
    resource_types {
        object = true
        container = false
        service = false
    }
    services {
        blob = true
        queue = false
        table = false
        file = false
    }
    permissions {
        read = true
        write = false
        delete = false
        list = false
        add = false
        create = false
        update = false
        process = false
    }
}

resource "azurerm_app_service_plan" "asp" {
    name = "${var.prefix}-plan"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    location = "${var.location}"
    kind = "Linux"
    reserved = true
    sku {
        tier = "Dynamic"
        size = "Y1"
    }
}

resource "azurerm_function_app" "functions" {
    name = "${var.prefix}-${var.environment}"
    location = "${var.location}"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    app_service_plan_id = "${azurerm_app_service_plan.asp.id}"
    storage_connection_string = "${azurerm_storage_account.storage.primary_connection_string}"
    version = "~2"

    app_settings = {
        https_only = true
        FUNCTIONS_WORKER_RUNTIME = "python"
        WEBSITE_NODE_DEFAULT_VERSION = "~10"
        FUNCTION_APP_EDIT_MODE = "readonly"
        HASH = "${base64encode(filesha256("${var.functionapp}"))}"
        WEBSITE_RUN_FROM_PACKAGE = "https://${azurerm_storage_account.storage.name}.blob.core.windows.net/${azurerm_storage_container.deployments.name}/${azurerm_storage_blob.appcode.name}${data.azurerm_storage_account_sas.sas.sas}"
    }
}

# 

Ответы [ 2 ]

0 голосов
/ 16 июля 2020

После некоторой борьбы я понял проблему. Спасибо @HuryShen и @AnkitKumar за то, что они указали мне правильное направление.

Я не включил модули urllib3 и запросы в zip-файл функции. Их необходимо установить в <funcname>.python_packages/lib/site-packages directory. Самый простой способ сделать это (из файла requirements.txt):

pip install  --target="azure/.python_packages/lib/site-packages"  -r requirements.txt

После загрузки модулей их можно включить в zip-файл. После этого скрипт terraform работает нормально.

0 голосов
/ 14 июля 2020

Это может быть проблема совместимости версий.

Версии urllib3 и запросов, которые вы используете, датируются июнем 2018 года, остальные (не проверяли все), похоже, являются последними версиями.

Есть ли причина, по которой вам нужно использовать более старые версии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...