小编gil*_*lch的帖子

是否可以在AWS Lambda环境中正确指向Python Shapely库的LIBGEOS_C?

我正在尝试编写一个 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

6
推荐指数
1
解决办法
1139
查看次数

如何将`lambda`对象转换为`function`对象以在Python中进行酸洗?

我一直在处理有关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)

python lambda function object functools

6
推荐指数
1
解决办法
3230
查看次数

将文件从一个 s3 存储桶复制到另一个存储桶的最简单 lambda 函数

我完全是一个不喜欢使用 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)

python amazon-s3 amazon-web-services aws-lambda

6
推荐指数
1
解决办法
2万
查看次数

如何在 AWS Lambda 上使用 Python 从 Zappa 获取堆栈跟踪

我在 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)

python flask zappa aws-lambda

5
推荐指数
1
解决办法
2065
查看次数

在 AWS Lambda 上使用 Pyenchant,可以加载包但不能加载提供程序字典,已在 EC2 上从源代码进行编译并提取 .so 文件

我正在尝试在 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 文件夹中:

  • libaspell.so
  • libenchant_aspell.so
  • libenchant_ispell.so
  • libenchant_myspell.so
  • libenchant.so

我很确定 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)

python aspell pyenchant enchant aws-lambda

5
推荐指数
1
解决办法
647
查看次数

如何使用 boto3 从外部调用在 zappa 中设置的 @app.route 函数?

我在 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)

python amazon-web-services zappa aws-lambda

5
推荐指数
1
解决办法
433
查看次数

AttributeError:模块“__main__”没有属性“text_process”

语境

我正在 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)

python machine-learning zappa aws-lambda

5
推荐指数
0
解决办法
1038
查看次数

如何使用 aws CDK 和 Python 部署图层并将其附加到 aws lambda 函数

如何使用 aws CDK 部署层并将其附加到 aws lambda 函数?

我需要一个简单的 cdk 代码来部署并将一个层附加到 aws lambda 函数。

python amazon-web-services aws-lambda aws-cdk

5
推荐指数
1
解决办法
6155
查看次数