【问题标题】:Error while using confluent-kafka python library with AWS lambda将 confluent-kafka python 库与 AWS lambda 一起使用时出错
【发布时间】:2022-05-19 04:41:16
【问题描述】:

我正在尝试使用 confluent-kafka python 库通过 lambda 函数管理我的集群,但该函数失败并出现错误:

"Unable to import module 'Test': No module named 'confluent_kafka.cimpl'"

我的要求.txt

requests
confluent-kafka

为了创建 zip 文件,我将代码移动到虚拟环境的站点包位置并压缩了所有内容。

Python 代码:

import confluent_kafka.admin
import requests
def lambda_handler(event, context):
    print("Hello World")

我使用的是 macOS 10.X。在 Linux 上,我注意到 pip install 创建了一个单独的 confluent_kafka.libs,它不会在 mac 上创建

【问题讨论】:

    标签: python amazon-web-services aws-lambda confluent-kafka-python


    【解决方案1】:

    我创建了所需的图层,并且可以验证它是否有效

    使用的技术包括最近 AWS 博客中描述的 docker 工具

    因此对于这个问题,我验证如下:

    1. 创建空文件夹,例如mylayer.

    2. 转到文件夹并创建requirements.txt文件,内容为

    echo requests > requirements.txt
    echo confluent-kafka >> requirements.txt
    
    1. 运行以下 docker 命令:
    docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
    
    1. 将层创建为 zip:
    zip -r mylayer.zip python > /dev/null
    
    1. 在 AWS 控制台中基于 mylayer.zip 创建 lambda 层。不要忘记将Compatible runtimes 指定为python3.8

    2. 使用以下 lambda 函数在 lambda 中测试层:

    import confluent_kafka.admin
    import requests
    
    def lambda_handler(event, context):
        print(dir(confluent_kafka.admin))
        print(dir(requests))
        print("Hello World")
    
    

    函数正确执行:

    ['AdminClient', 'BrokerMetadata', 'CONFIG_SOURCE_DEFAULT_CONFIG', 'CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG', 'CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG', 'CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG', 'CONFIG_SOURCE_STATIC_BROKER_CONFIG', 'CONFIG_SOURCE_UNKNOWN_CONFIG', 'ClusterMetadata', 'ConfigEntry', 'ConfigResource', 'ConfigSource', 'Enum', 'KafkaException', 'NewPartitions', 'NewTopic', 'PartitionMetadata', 'RESOURCE_ANY', 'RESOURCE_BROKER', 'RESOURCE_GROUP', 'RESOURCE_TOPIC', 'RESOURCE_UNKNOWN', 'TopicMetadata', '_AdminClientImpl', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'concurrent', 'functools']
    ['ConnectTimeout', 'ConnectionError', 'DependencyWarning', 'FileModeWarning', 'HTTPError', 'NullHandler', 'PreparedRequest', 'ReadTimeout', 'Request', 'RequestException', 'RequestsDependencyWarning', 'Response', 'Session', 'Timeout', 'TooManyRedirects', 'URLRequired', '__author__', '__author_email__', '__build__', '__builtins__', '__cached__', '__cake__', '__copyright__', '__description__', '__doc__', '__file__', '__license__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__title__', '__url__', '__version__', '_check_cryptography', '_internal_utils', 'adapters', 'api', 'auth', 'certs', 'chardet', 'check_compatibility', 'codes', 'compat', 'cookies', 'delete', 'exceptions', 'get', 'head', 'hooks', 'logging', 'models', 'options', 'packages', 'patch', 'post', 'put', 'request', 'session', 'sessions', 'ssl', 'status_codes', 'structures', 'urllib3', 'utils', 'warnings']
    Hello World
    

    【讨论】:

    • 在 macOS 和 Linux 上安装 confluent-kafka 的方式似乎有所不同。正如我在问题中提到的,在 Linux pip install 上创建了一个单独的 confluent_kafka.libs 并且因为 Lambda 在 Amazon Linux 上运行,所以它需要一个单独的库。但是,由于我是在 mac 上创建 zip 的,所以它没有。当我使用 linux 机器上的虚拟环境时,我能够运行代码。
    • 我已经尝试过了,使用平台 linux/amd64 安装了 pip confluent-kafka,但它仍然给我一个导入错误。您能提供更多指导吗?
    【解决方案2】:

    即使在正确设置图层后我也遇到了这个问题。我可以通过将层和函数设置为使用 x86_64 架构来解决这个问题

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 2016-07-08
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多