【问题标题】:AWS Lambda - S3 put_object Invalid type for parameter BodyAWS Lambda - S3 put_object 参数正文的类型无效
【发布时间】:2018-11-11 12:53:05
【问题描述】:

我在路由 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.........

【问题讨论】:

  • 你确定这是 JSON 格式而不是对象吗?
  • 看起来它返回一个dict,所以你需要在将它传递给put_object之前手动对其进行json编码。
  • 感谢它的工作,更新以包括您的推荐!

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


【解决方案1】:

tkausl 回答了 cmets 中的问题:

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()

【讨论】:

  • 请不要将解决方案编辑到问题中。将来查看该问题的访问者会假设您显示的代码会产生错误,当然不会,因为它已被修复。将不正确的代码留在问题中,并将解决方案放在答案中。
猜你喜欢
  • 2021-05-20
  • 2021-02-08
  • 2021-10-30
  • 2018-08-02
  • 2019-05-26
  • 2016-12-24
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多