【问题标题】:Python AWS function failing to return ELB data through Lambda - works on consolePython AWS 函数无法通过 Lambda 返回 ELB 数据 - 在控制台上运行
【发布时间】:2016-09-05 16:16:43
【问题描述】:

这应该很简单,所以我希望有人能很快提供帮助。

我有以下基本 python 脚本:

import boto3
elb = boto3.client('elb')
print(elb.describe_load_balancers())

当我通过命令行上的 python 脚本执行此操作时,它可以完美运行,返回所有负载均衡器的所有信息。

CLI 命令也可以从命令行完美运行:

aws elb describe-load-balancers

但是,当我将脚本添加到 AWS 的 Lambda 函数中时,它会失败。 这是脚本在 AWS lambda 中的样子:

import boto3

def lambda_handler(event, context):
    elb = boto3.client('elb')
    return elb.describe_load_balancers()

这应该像其他返回所有负载均衡器数据一样工作,但是它返回此错误:

{
  "stackTrace": [
    [
      "/usr/lib64/python2.7/json/__init__.py",
      250,
      "dumps",
      "sort_keys=sort_keys, **kw).encode(obj)"
    ],
    [
      "/usr/lib64/python2.7/json/encoder.py",
      207,
      "encode",
      "chunks = self.iterencode(o, _one_shot=True)"
    ],
    [
      "/usr/lib64/python2.7/json/encoder.py",
      270,
      "iterencode",
      "return _iterencode(o, 0)"
    ],
    [
      "/var/runtime/awslambda/bootstrap.py",
      41,
      "decimal_serializer",
      "raise TypeError(repr(o) + \" is not JSON serializable\")"
    ]
  ],
  "errorType": "TypeError",
  "errorMessage": "datetime.datetime(2013, 7, 26, 15, 35, 57, 690000, tzinfo=tzlocal()) is not JSON serializable"
}

到目前为止,我一直在为此烦恼一整天,无法找出问题所在,因此我们将不胜感激。

作为一个额外的说明,我能够让这个函数在 AWS lambda 中正常工作:

import boto3

def lambda_handler(event, context):
    elb = boto3.client('elb')
    return elb.describe_tags(LoadBalancerNames=[event['loadBalancer']])

您可能会注意到,在上面的命令中我指定了负载均衡器而不是全部,我也尝试过使用其他功能,但没有运气。

【问题讨论】:

  • 看起来它只是无法将返回值序列化为 JSON。它在本地运行良好,因为您没有像 Lambda 那样将最终响应转换为 JSON。您可能需要添加一些代码来将响应转换为可以序列化为 JSON 的内容(看起来它在日期时间值上失败了)。

标签: python amazon-web-services amazon-elb boto3 aws-lambda


【解决方案1】:

我正在挖掘与 Jim.P 相同的参考资料并尝试使用我的帐户。 this answer 通过正确的实施给了我正确的结果:

import boto3
import json
import datetime
from time import mktime

class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return int(mktime(obj.timetuple()))
        return json.JSONEncoder.default(self, obj)

def lambda_handler(event, context):
    elb = boto3.client('elb')
    return json.dumps(elb.describe_load_balancers(), cls = MyEncoder)

【讨论】:

  • 不错!加倍努力的方法! ;-)
  • 谢谢大家,这真的帮助了我。我现在可以研究很多好东西:D
【解决方案2】:

这看起来可能是特定于“python”的,它可能在您的本地机器上工作的原因是您有一个未包含在您的 lambda 函数中的 python 库。

描述您的错误的几篇文章:

StackOverflow - 455580

StackOverflow - 11875770

以及有关为 Lambda Python 创建部署包的文档:

Creating a Deployment Package (Python)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 2023-02-24
    • 2017-05-29
    • 2017-06-23
    • 2016-10-27
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多