我正在尝试编写一个 AWS python Lambda 函数,该函数利用 Shapely 进行简单的“多边形中的点”操作。我启动了一个 AWS linux EC2 实例,安装了 Shapely 并有一个工作脚本。然后,我从 EC2 实例下载了 Linux 特定的 libgeos_c.so.1 二进制文件,并将其(通过无服务器框架)捆绑到与 lambda 函数相同的目录中。但是,一旦我部署,脚本将不会执行,因为它会抛出“无法找到库或加载其任何变体...”错误。我什至尝试通过 GEOS_LIBRARY_PATH 环境变量显式指向 libgeos_c.so.1 路径,但没有效果。这是不可能的部署吗?
这是一个代码片段,它设置环境变量,然后调用实际导入和利用 shapely 的辅助脚本。
import sys
import os
import subprocess
here = os.path.dirname(os.path.realpath(__file__))
# Import installed packages (in site-packages)
site_pkgs = os.path.join(here, "venv", "lib", "python2.7", "site-packages")
sys.path.append(site_pkgs)
import json
def hello(event, context):
command = "GEOS_LIBRARY_PATH={} python test_geo_worker.py".format(here + "/libgeos_c.so.1")
foo = subprocess.check_output(command, shell=True)
print foo
Run Code Online (Sandbox Code Playgroud)
有人在 lambda 中成功部署过 shapely 吗?我的后备计划是回到旧的 postgres/postgis 而不是 shapely,但我肯定想尝试在 dynamo/lambda 堆栈中构建它。
python amazon-web-services shapely aws-lambda serverless-framework
我一直在处理有关lambda
函数及其无法成为pickled
. 我经常在运行中使用lambda
函数作为一次性使用函数,当我必须以函数形式单独重新创建简单的 lambda 函数以用于酸洗时,它会大大降低我的工作流程生产力。
有没有办法将 alambda
及其所有参数转换为 中的function
对象Python 3.6.1
?
lambda_func = lambda x: x.split(" ")
def func(x):
return x.split(" ")
input_string = "Darth Plagueis was a Dark Lord of the Sith"
# Function Version
func(input_string)
# ['Darth', 'Plagueis', 'was', 'a', 'Dark', 'Lord', 'of', 'the', 'Sith']
lambda_func(input_string)
# ['Darth', 'Plagueis', 'was', 'a', 'Dark', 'Lord', 'of', 'the', 'Sith']
def lambda2func(lambda_func):
#...
return func_version
Run Code Online (Sandbox Code Playgroud) 我完全是一个不喜欢使用 AWS 的菜鸟。我试图让一个非常简单和基本的操作工作。我想要做的是,将文件上传到一个 s3 存储桶后,我希望该上传触发一个 Lambda 函数,该函数将该文件复制到另一个存储桶。
我转到 AWS 管理控制台,在 us-west2 服务器上创建了一个名为“test-bucket-3x1”的 s3 存储桶作为我的“源”存储桶,另一个称为“test-bucket-3x2”作为我的“目标”存储桶. 创建这些存储桶时,我没有更改或修改任何设置。
在 Lambda 控制台中,我为“test-bucket-3x1”创建了一个 s3 触发器,将“事件类型”更改为“ObjectCreatedByPut”,并且没有更改任何其他设置。
这是我的实际 lamda_function 代码:
import boto3
import json
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket('test-bucket-3x1')
dest_bucket = s3.Bucket('test-bucket-3x2')
print(bucket)
print(dest_bucket)
for obj in bucket.objects():
dest_key = obj.key
print(dest_key)
s3.Object(dest_bucket.name, dest_key).copy_from(CopySource = {'Bucket': obj.bucket_name, 'Key': obj.key})
Run Code Online (Sandbox Code Playgroud)
当我使用 AWS Lambda 控制台提供的基本“HelloWorld”测试测试此函数时,我收到了“
{
"errorMessage": "'s3.Bucket.objectsCollectionManager' object is not callable",
"errorType": "TypeError",
"stackTrace": [
[
"/var/task/lambda_function.py",
12,
"lambda_handler",
"for obj in bucket.objects():"
] …
Run Code Online (Sandbox Code Playgroud) 我在 AWS Lambda 上使用 Zappa 框架https://github.com/Miserlou/Zappa和 Python 和 Flask。当它引发异常时,它会出现在 CloudWatch 日志中,但我无法辨认。但是,我确实在调试版本中从 HTTP GET 返回了一个正常的 Flask 堆栈跟踪。
我的问题是如何在日志/生产代码中获得合理的(Flask)堆栈跟踪?当生产中出现异常时,我所拥有的只是日志消息。
来自 HTTP GET 的良好堆栈跟踪:
Traceback (most recent call last):
File "/var/task/handler.py", line 96, in handler
response = Response.from_app(app, environ)
File "/private/var/folders/1j/5zcxjzkx29b8tfgrh2y90wt80000gn/T/pip-build-v6XvIH/Werkzeug/werkzeug/wrappers.py", line 865, in from_app
File "/private/var/folders/1j/5zcxjzkx29b8tfgrh2y90wt80000gn/T/pip-build-v6XvIH/Werkzeug/werkzeug/wrappers.py", line 57, in _run_wsgi_app
File "/private/var/folders/1j/5zcxjzkx29b8tfgrh2y90wt80000gn/T/pip-build-v6XvIH/Werkzeug/werkzeug/test.py", line 871, in run_wsgi_app
File "/private/var/folders/1j/5zcxjzkx29b8tfgrh2y90wt80000gn/T/pip-build-v6XvIH/zappa/zappa/middleware.py", line 78, in __call__
File "/private/var/folders/1j/5zcxjzkx29b8tfgrh2y90wt80000gn/T/pip-build-v6XvIH/flask/flask/app.py", line 1836, in __call__
File "/private/var/folders/1j/5zcxjzkx29b8tfgrh2y90wt80000gn/T/pip-build-v6XvIH/flask/flask/app.py", line 1820, in wsgi_app
File "/private/var/folders/1j/5zcxjzkx29b8tfgrh2y90wt80000gn/T/pip-build-jvEYWI/flask-restful/flask_restful/__init__.py", line 271, in error_router …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 AWS 上的 Lambda 函数中使用 Python 拼写检查库 Pyenchant。Pyenchant 是 C libenchant 库的包装器,而该库又依赖于来自 Aspell 等提供商的单词词典。
在 Lambda 上运行的 python 代码中,我能够成功导入已编译的 enchant 库以及 AWS Linux EC2 实例上的 C 库 (libenchant.so),并将输出复制到我的 Lambda 部署包。
然而,当 pyenchant 库在 Lambda 上运行时,它无法加载任何需要工作的单词词典。然后我使用以下命令在 EC2 实例上安装了 Aspell:
yum install aspell-en enchant-aspell
Run Code Online (Sandbox Code Playgroud)
然后,我将以下附加 .so 文件复制到部署包的 /lib 文件夹中:
我很确定 libenchant_aspell.so 是实际的字典,但它没有拾取它,我不知道下一步该去哪里。
下面是我的 lambda_handler python 代码:
from __future__ import print_function
import os
import sys
import re
import enchant
enchant.set_param("enchant.aspell.dictionary.path","/var/task/lib")
def lambda_handler(event, context):
print("# List available enchant dictionary …
Run Code Online (Sandbox Code Playgroud) 我在 arn:aws:lambda:us-east-1:xxxxx:function:xx-xx-prod 部署了一个 zappa lambda,它提供如下路线:
@app.route('/test', methods=['POST'])
def test():
response = app.response_class(
response=get_jsonstr({'test': 'OK'}),
status=200,
mimetype='application/json'
)
return response
Run Code Online (Sandbox Code Playgroud)
我想从另一个 lambda 函数调用上面的 test() 函数,如下所示:
client = boto3.client('lambda', region_name='us-east-1')
r = client.invoke(
FunctionName='arn:aws:lambda:us-east-1:xxxxx:function:xx-xx-prod',
InvocationType='RequestResponse',
LogType='None',
Payload='',
)
print(r)
print(json.loads(r['Payload'].read()))
Run Code Online (Sandbox Code Playgroud)
上面的调用成功如下:
{
'ResponseMetadata': {
'RequestId': '37ecc17b-03a9-11e9-9ea0-9dee231dfb79',
'HTTPStatusCode': 200,
'HTTPHeaders': {
'date': 'Wed, 19 Dec 2018 16:14:55 GMT',
'content-type': 'application/json',
'content-length': '4',
'connection': 'keep-alive',
'x-amzn-requestid': '37ecc17b-03a9-11e9-9ea0-9dee231dfb79',
'x-amzn-remapped-content-length': '0',
'x-amz-executed-version': '$LATEST',
'x-amzn-trace-id': 'root=1-5c1a6e7d-8063e5004eab150d6c967b0;sampled=0'
},
'RetryAttempts': 0
},
'StatusCode': 200,
'ExecutedVersion': '$LATEST',
'Payload': <botocore.response.StreamingBody object …
Run Code Online (Sandbox Code Playgroud) 我正在 lambda 上部署我的机器学习模型;成功部署后,当我点击网关 URL 时,我收到 500 响应,并且日志为
Traceback (most recent call last):
File "/tmp/serverless-ml/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/tmp/serverless-ml/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/tmp/serverless-ml/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/tmp/serverless-ml/flask/_compat.py", line 35, in reraise
raise value
File "/tmp/serverless-ml/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/tmp/serverless-ml/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/tmp/serverless-ml/api/app.py", line 35, in index
prediction = predict(data)
File "/tmp/serverless-ml/api/app.py", line 54, in predict …
Run Code Online (Sandbox Code Playgroud) 如何使用 aws CDK 部署层并将其附加到 aws lambda 函数?
我需要一个简单的 cdk 代码来部署并将一个层附加到 aws lambda 函数。