当我需要阅读有关API的信息,创建CSV文件并将其上传到SFTP服务器上时,我正在创建AWS Lambda函数。
我已经在Windows上使用Ubuntu在我的venv上安装了paramiko,并且cffi模块就像一个依赖项,但是当代码运行时,我收到此错误:
{
"errorMessage": "Unable to import module 'python_handler': No module named '_cffi_backend'",
"errorType": "Runtime.ImportModuleError"
}
遵循我的代码:
import paramiko
import requests
from random import randrange
from datetime import datetime
from datetime import timedelta
from requests.auth import HTTPBasicAuth
def lambda_handler(event, context):
# Lambda function
addZero = lambda x : '0' + str(x) if x < 10 else str(x)
# Actual datetime
ac_yr = datetime.utcnow().year
ac_mo = datetime.utcnow().month
ac_da = datetime.utcnow().day
ac_hh = datetime.utcnow().hour
ac_mi = datetime.utcnow().minute
ac_se = datetime.utcnow().second
# 24 hours ago
ag_yr = (datetime.utcnow() - timedelta(hours=24)).year
ag_mo = (datetime.utcnow() - timedelta(hours=24)).month
ag_da = (datetime.utcnow() - timedelta(hours=24)).day
ag_hh = (datetime.utcnow() - timedelta(hours=24)).hour
ag_mi = (datetime.utcnow() - timedelta(hours=24)).minute
ag_se = (datetime.utcnow() - timedelta(hours=24)).second
# API Infos
api_key = 'XYZ'
page_id = 'XYZ'
# Call API
param = {
'sort_order': 'asc',
'from': '{}-{}-{}T{}:{}:{}.000Z'.format(ag_yr, addZero(ag_mo), addZero(ag_da), addZero(ag_hh), addZero(ag_mi), addZero(ag_se)),
'to': '{}-{}-{}T{}:{}:{}.000Z'.format(ac_yr, addZero(ac_mo), addZero(ac_da), addZero(ac_hh), addZero(ac_mi), addZero(ac_se))
}
r = requests.get('https://api.unbounce.com/pages/{}/leads'.format(page_id), auth=HTTPBasicAuth(api_key, 'pass'), params=param)
# If connection it's ok
if r.status_code == 200:
# If has any result
if len(r.json()['leads']) > 0:
cont = ''
for lead in r.json()['leads']:
cont += lead['form_data']['cpf'][0] + ','
cont += lead['form_data']['nome_completo'][0] + ','
cont += lead['form_data']['email'][0]
else:
return 'Não há resultados no momento'
else:
return 'Falha na conexão'
# Write a CSV file
f = open('my_csv.csv','w')
f.write('PAC_ID, PAC_NAME, PAC_EMAIL\n')
f.write(cont)
f.close()
transport = paramiko.Transport(('host-info', 22))
transport.connect(None, 'user-info', 'password-info', None)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.chdir('Import')
sftpclient.put('my_csv.csv')
return 'OK'
有什么办法可以解决这个问题吗?
答案 0 :(得分:1)
可能会迟到,希望将来能对某人有所帮助。此答案特定于“ _cffi_backend .....”。另一件事可能会帮助您了解如何安装python。如果确实使用brew,则需要使用python创建虚拟环境。看到这里:
https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html
我在linux环境中进行了此操作,而没有下载与各种linux发行版兼容的wheel文件,并且可以正常工作
答案 1 :(得分:0)
这似乎是许多二进制程序包的常见问题。 我还没有通用的解决方案,但是您真正要做的是将二进制文件从真正安装的位置移动(符号链接)到软件包的根目录。
我通常使用Lambda的安装后脚本解决此问题。使用paramiko
的用户运行类似:
ln -s venv/MY_LAMBDA/lib/python3.6/site-packages/_cffi_backend.cpython-36m-x86_64-linux-gnu.so MY_LAMBDA/
ln -s venv/MY_LAMBDA/lib/python3.6/site-packages/.libs_cffi_backend/libffi-XXXXXXXX.so.6.0.4 MY_LAMBDA/
ln -s venv/MY_LAMBDA/lib/python3.6/site-packages/nacl MY_LAMBDA/
您将必须从virtualenv中识别libffi...
文件的确切名称。可能与您在其上编译库的机器不同。
答案 2 :(得分:0)
在Ubuntu上工作时,使用pysftp或paramiko到Lambda并没有成功。 因此,我在桌面上创建了一个EC2实例(并在使用Amazon Linux 2的VirtualBox之后),并使用相同的库开发了相同的代码。而且...行得通...
答案 3 :(得分:0)
最简单的解决方案是使用 lambci/lambda中所述的here容器。我写了一些详细的here.
简而言之,某些Python程序包(例如cffi
)具有操作系统级别的依赖性。由于打包代码的操作系统与Lambda使用的操作系统不同,因此脚本无法运行。