Python AWS函数无法通过Lambda返回ELB数据-在控制台上运行
这应该很简单,所以我希望一些人能很快帮上忙 我有以下基本python脚本:Python AWS函数无法通过Lambda返回ELB数据-在控制台上运行,python,amazon-web-services,amazon-elb,boto3,aws-lambda,Python,Amazon Web Services,Amazon Elb,Boto3,Aws Lambda,这应该很简单,所以我希望一些人能很快帮上忙 我有以下基本python脚本: import boto3 elb = boto3.client('elb') print(elb.describe_load_balancers()) 当我通过命令行上的python脚本执行此命令时,它工作得非常好,返回所有负载平衡器的所有信息 CLI命令在命令行中也可以正常工作: aws elb describe-load-balancers 但是,当我将脚本添加到AWS的Lambda函数中时,它失败了。 以下是A
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']])
正如您在上面的命令中所注意到的,我指定了负载平衡器而不是所有的负载平衡器,我也尝试了其他函数,但没有成功。这看起来可能是特定于“python”的,它在本地机器上工作的原因可能是您的lambda函数中没有包含python库
描述错误的几篇文章:
以及关于为Lambda Python创建部署包的文档:
这看起来可能是特定于“python”的,它在本地机器上工作的原因可能是您有一个不包含在lambda函数中的python库
描述错误的几篇文章:
以及关于为Lambda Python创建部署包的文档:
我在和Jim.p挖掘相同的参考资料,并尝试使用我的帐户。通过正确的实施为我提供了正确的结果:
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)
我在和Jim.p.挖同样的参考资料,并试着用我的账户。通过正确的实施为我提供了正确的结果:
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)
看起来它只是无法将返回值序列化为JSON。它在本地运行良好,因为您没有像Lambda那样将最终响应转换为JSON。您可能需要添加一些代码来将响应转换为可以序列化为JSON的内容(看起来它在datetime值上失败了)。看起来它只是无法将返回值序列化为JSON。它在本地运行良好,因为您没有像Lambda那样将最终响应转换为JSON。您可能需要添加一些代码来将响应转换为可以序列化为JSON的内容(看起来它在日期时间值上失败了)。很好!多走一英里的路!;-)谢谢你们,这真的帮了我大忙。我现在可以研究很多好东西:Dnice!多走一英里的路!;-)谢谢你们,这真的帮了我大忙。我现在可以研究很多好东西:D