Python AWS 函数无法通过 Lambda return ELB 数据 - 在控制台上工作

Python AWS function failing to return ELB data through Lambda - works on console

这应该很简单,所以我希望有人能很快帮助解决这个问题。

我有以下基本 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()

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

{
  "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']])

正如您在上面的命令中注意到的那样,我指定了负载均衡器而不是所有负载均衡器,我也尝试过使用其他功能但没有成功。

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

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

Whosebug - 455580

Whosebug - 11875770

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

Creating a Deployment Package (Python)

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