任何人都对这个错误有任何想法。我正在使用 AWS translate、boto3 和 Zappa,并制作了一个脚本来转换在本地工作正常的语言,并在 AWS lambda 上抛出此错误。我真的不知道为什么?以前有人遇到过这个错误吗?
这是我的代码:
from flask import Flask, jsonify, Blueprint, request, current_app
import os
import boto3
app = Flask(__name__)
translate = boto3.client(service_name='translate')
s3 = boto3.resource('s3')
s3_data = boto3.client('s3')
def check_file(file_name):
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('output-file1')
for s3_filename in my_bucket.objects.all():
if s3_filename.key == file_name:
return True
else:
return False
def convert_data():
BUCKET_NAME = 'output-file1'
my_bucket = s3.Bucket('input-file1')
for s3_object in my_bucket.objects.all():
data = check_file(s3_object.key)
if data == False or data is None:
body = s3_object.get()['Body'].read()
file_data = bytearray(body)
response = translate.translate_text(Text=str(file_data), SourceLanguageCode="en", TargetLanguageCode="fr")
# response = translate.translate_text(Text=str(file_data), TerminologyNames=["testing"],
# SourceLanguageCode="en", TargetLanguageCode="fr")
print("Translated text: " + response.get('TranslatedText'))
with open('/tmp/' + s3_object.key, 'w') as txtfile:
txtfile.write(str(response.get('TranslatedText')))
txtfile.close()
s3_data.upload_file(Bucket='output-file1',
Key=s3_object.key, Filename='/tmp/' + s3_object.key)
print('========Upload The File===========')
# convert_data()
def convert_langauge():
with app.app_context():
convert_data()
return True
if __name__ == "__main__":
app.run()
如果脚本在本地运行并且不适用于 lambda,则可能的原因是您的 boto3 库版本在本地和 lambda 上不同。AWS 不经常更新他们的 boto3,我在使用cognito 对象锁定时遇到了类似的问题。
要解决此问题,您可以将 lambda 函数下载(导出)到本地计算机。 接下来,使用以下方法获取您在本地运行的 boto3 版本:
pip install boto3==<your_local_version> -t lib/
其中lib/
是将安装这些文件的目录的名称。
接下来,复制 lib 文件夹中的所有文件(不要复制文件夹 iteself)并将它们粘贴到您下载(导出)的 zip 中。不要提取 zip 并重新打包,只需在 winzip 或 winrar 中打开它,然后将 lib 文件夹中的文件/文件夹粘贴到 lambda 函数 zip 中。接下来,您在控制台中转到您的 lambda 并再次上传 zip。它将替换由 zappa 创建的 lambda,并且不会更改您的 api 路径。您还将安装正确的 boto3 版本。