AWS Lambda: ModuleNotFoundError: Нет модуля с именем ‘_cffi_backend’

#python-3.x #aws-lambda #amazon-kinesis #amazon-aurora #amazon-kms

Вопрос:

Я создал пакет развертывания для AWS Lambda с помощью своего файла python для мониторинга потоков DBActivityStreams в соответствии с документацией AWS.

 from __future__ import print_function
import json
import boto3
import base64
import zlib
import os 
import aws_encryption_sdk
from aws_encryption_sdk import CommitmentPolicy
from aws_encryption_sdk.internal.crypto import WrappingKey
from aws_encryption_sdk.key_providers.raw import RawMasterKeyProvider
from aws_encryption_sdk.identifiers import WrappingAlgorithm, EncryptionKeyType
import datetime

REGION_NAME = 'ca-central-1'
RESOURCE_ID = '<Cluster -ABC>'

enc_client = aws_encryption_sdk.EncryptionSDKClient(commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT)
kms = boto3.client('kms', region_name=REGION_NAME)
todays_date = datetime.datetime.now()

class MyRawMasterKeyProvider(RawMasterKeyProvider):
    provider_id = "BC"
    def __new__(cls, *args, **kwargs):
        obj = super(RawMasterKeyProvider, cls).__new__(cls)
        return obj
    def __init__(self, plain_key):
        RawMasterKeyProvider.__init__(self)
        self.wrapping_key = WrappingKey(wrapping_algorithm=WrappingAlgorithm.AES_256_GCM_IV12_TAG16_NO_PADDING,
                                        wrapping_key=plain_key, wrapping_key_type=EncryptionKeyType.SYMMETRIC)
    def _get_raw_key(self, key_id):
        return self.wrapping_key

def decrypt_payload(payload, data_key):  
    my_key_provider = MyRawMasterKeyProvider(data_key)
    my_key_provider.add_master_key("DataKey")
    #Decrypt the records using the master key.
    decrypted_plaintext, header = enc_client.decrypt(
        source=payload,
        materials_manager=aws_encryption_sdk.materials_managers.default.DefaultCryptoMaterialsManager(master_key_provider=my_key_provider))
    return decrypted_plaintext

def decrypt_decompress(payload, key):   
    decrypted = decrypt_payload(payload, key)
    #Decompress the records using zlib library.
    decrypted = zlib.decompress(decrypted, zlib.MAX_WBITS   16)
    return decrypted

#Lambda Handler entry point
def lambda_handler(event, context):
    output = []
    print("Received event: "   json.dumps(event, indent=2))
    for dasRecord in event['Records']:
        kinesis = dasRecord['kinesis']
        data = base64.b64decode(kinesis["data"])
        # Do processing here
        val = processDASRecord(data)
        if len(val)>0:
            output_record = {
                #'recordId': dasRecord['recordId'],
                'result': 'Ok',
                'data': base64.b64encode(json.dumps(val).encode("utf-8"))
            }
        else:
            output_record = {
                'recordId': dasRecord['recordId'],
                'result': 'Dropped',
                'data': base64.b64encode(b'this is a dropped event')
            }
        output.append(output_record)

    print('Successfully processed {} records.'.format(len(event['records'])))
    return {'records': output}

def processDASRecord(rec):
    record = json.loads(rec)
    if record['type'] == 'DatabaseActivityMonitoringRecords':
        dbEvents = record["databaseActivityEvents"]
        dataKey = base64.b64decode(record["key"])
        try:
            #Decrypt the envelope master key using KMS
            data_key_decrypt_result = kms.decrypt(CiphertextBlob=dataKey, EncryptionContext={'aws:rds:dbc-id':RESOURCE_ID})
        except Exception as e:
            print(e)
            raise e

        try:
            plaintextEvents = decrypt_decompress(base64.b64decode(dbEvents), data_key_decrypt_result['Plaintext'])
        except Exception as e:
            print(e)
            raise e
        
        retObj = []
        #parse thru all activity and categorize it.
        try:
            events = json.loads(plaintextEvents)
            for dbEvent in events['databaseActivityEventList']:
                print(dbEvent)
              
            retObj.append(dbEvent)
        except Exception as e:
            print (e)
            raise e
        
        return retObj
 

ZIP — файл содержит зависимости для криптографии и cffi. Моя почтовая папка с пакетом содержит ниже.
введите описание изображения здесь

Код работает без проблем при локальном запуске. Но когда я импортировал этот zip-файл в AWS lambda, я получаю следующую ошибку. Пакет python создан в среде AWS Linux EC2. Версия Python 3.7. Среда выполнения AWS python 3.9(если я дойду до 3.7, функция вообще не запустится)

 File "/var/task/aws_encryption_sdk/__init__.py", line 194, in decrypt
    plaintext = decryptor.read()
  File "/var/task/aws_encryption_sdk/streaming_client.py", line 260, in read
    self._prep_message()
  File "/var/task/aws_encryption_sdk/streaming_client.py", line 792, in _prep_message
    self._header, self.header_auth = self._read_header()
  File "/var/task/aws_encryption_sdk/streaming_client.py", line 830, in _read_header
    decryption_materials = self.config.materials_manager.decrypt_materials(request=decrypt_materials_request)
  File "/var/task/aws_encryption_sdk/materials_managers/default.py", line 150, in decrypt_materials
    data_key = self.master_key_provider.decrypt_data_key_from_list(
  File "/var/task/aws_encryption_sdk/key_providers/base.py", line 315, in decrypt_data_key_from_list
    data_key = self.decrypt_data_key(encrypted_data_key, algorithm, encryption_context)
  File "/var/task/aws_encryption_sdk/key_providers/base.py", line 268, in decrypt_data_key
    data_key = master_key.decrypt_data_key(encrypted_data_key, algorithm, encryption_context)
  File "/var/task/aws_encryption_sdk/key_providers/base.py", line 529, in decrypt_data_key
    decrypted_data_key = self._decrypt_data_key(
  File "/var/task/aws_encryption_sdk/key_providers/raw.py", line 180, in _decrypt_data_key
    plaintext_data_key = self.config.wrapping_key.decrypt(
  File "/var/task/aws_encryption_sdk/internal/crypto/wrapping_keys.py", line 105, in decrypt
    return decrypt(
  File "/var/task/aws_encryption_sdk/internal/crypto/encryption.py", line 150, in decrypt
    decryptor = Decryptor(algorithm, key, associated_data, encrypted_data.iv, encrypted_data.tag)
  File "/var/task/aws_encryption_sdk/internal/crypto/encryption.py", line 111, in __init__
    algorithm.encryption_algorithm(key), algorithm.encryption_mode(iv, tag), backend=default_backend()
  File "/var/task/cryptography/hazmat/backends/__init__.py", line 16, in default_backend
    from cryptography.hazmat.backends.openssl.backend import backend
  File "/var/task/cryptography/hazmat/backends/openssl/__init__.py", line 6, in <module>
    from cryptography.hazmat.backends.openssl.backend import backend
  File "/var/task/cryptography/hazmat/backends/openssl/backend.py", line 82, in <module>
    from cryptography.hazmat.bindings.openssl import binding
  File "/var/task/cryptography/hazmat/bindings/openssl/binding.py", line 14, in <module>
    from cryptography.hazmat.bindings._openssl import ffi, lib
ModuleNotFoundError: No module named '_cffi_backend'
 

Любая помощь была бы очень признательна. Я не смог найти никакого успешного решения в своем поиске.

Комментарии:

1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

2. Как уже упоминалось @Community — не могли бы вы, пожалуйста, добавить какой-нибудь минимальный код, достаточный для воспроизведения проблемы?

3. @Сообщество,@Ermiya Eskandary Я также добавил фрагмент кода. Это тот же код, который содержится в документации AWS(ссылка в сообщении).