Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AWS Lambda-S3 put_对象参数体的类型无效_Python_Amazon Web Services_Amazon S3_Aws Lambda_Boto3 - Fatal编程技术网

Python AWS Lambda-S3 put_对象参数体的类型无效

Python AWS Lambda-S3 put_对象参数体的类型无效,python,amazon-web-services,amazon-s3,aws-lambda,boto3,Python,Amazon Web Services,Amazon S3,Aws Lambda,Boto3,我在路由53中有一个托管区域,并且希望将hostzone对象的内容存储在S3中,但我得到一个错误。我认为Body是正确的参数,但这可能是因为对象是JSON格式的 import boto3 import json def allwork(): client = boto3.client('route53') hostzone = client.list_hosted_zones() bucket_name = "testlambda" file_name = "r

我在路由53中有一个托管区域,并且希望将hostzone对象的内容存储在S3中,但我得到一个错误。我认为Body是正确的参数,但这可能是因为对象是JSON格式的

import boto3
import json

def allwork():
    client = boto3.client('route53')
    hostzone = client.list_hosted_zones()
    bucket_name = "testlambda"
    file_name = "r53data.txt"
    lambda_path = "/tmp/" + file_name
    s3_path = "10102018/" + file_name 

    s3 = boto3.resource("s3")
    s3.Bucket(bucket_name).put_object(Key=s3_path, Body=hostzone)

allwork()
以下是错误:

module initialization error: Parameter validation failed:
Invalid type for parameter Body, value: {u'HostedZones': 
[{u'ResourceRecordSetCount': 7, u'CallerReference': '814E3.........

tkausl回答了评论中的问题:

Looks like it returns a dict, so you need to json encode it manually before passing it to put_object 
更新:

import boto3
import json

def allwork():
client = boto3.client('route53')
hostzone = client.list_hosted_zones()
bucket_name = "testlambda"
file_name = "r53data.txt"
lambda_path = "/tmp/" + file_name
s3_path = "10102018/" + file_name 

hostzone2=json.dumps(hostzone, ensure_ascii=False)

s3 = boto3.resource("s3")
s3.Bucket(bucket_name).put_object(Key=s3_path, Body=hostzone2)

allwork()

你确定这是JSON格式的而不是对象吗?不是100%,查看这里的文档:看起来它返回了一个dict,所以你需要在将其传递给put_对象之前手动对其进行JSON编码。谢谢它工作了,更新以包含你的建议!请不要将答案编辑到问题中。未来的访问者看到这个问题时会假设您正在展示的代码会生成错误,当然不会,因为它已经被修复了。在问题中留下不正确的代码,并在答案中填入答案。