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:
我正在挖掘与 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)
这应该很简单,所以我希望有人能很快帮助解决这个问题。
我有以下基本 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:
我正在挖掘与 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)