我正在使用Raspberry Pi和python学习AWS IoT。我遇到的问题如下:
在事件检测的主要功能中,拍摄了一张照片并保存在Pi上。保存图片后,调用函数store_to_bucket,我传递两个参数:存储图片的路径和日期字符串。第一次一切正常。第二个函数调用给出了以下错误:
ClientError:调用PutObject操作时发生错误(AuthorizationHeaderMalformed):授权标头格式错误;必须在凭证中提供非空的访问密钥(AKID)。
代码
ACCESS_KEY_ID = open("/mykey/path/key.txt", "r")
ACCESS_SECRET_KEY = open("/mykey/path/skey.txt", "r")
BUCKET_NAME = open("/mykey/path/bucket.txt", "r").read()
data = open(path, 'rb')
ext = '.jpg'
s3 = boto3.resource(
's3',
aws_access_key_id=ACCESS_KEY_ID.read(),
aws_secret_access_key=ACCESS_SECRET_KEY.read(),
config=Config(signature_version='s3v4')
)
def store_to_bucket(path, date):
s3.Bucket(BUCKET_NAME).put_object(Key=date+ext, Body=data)
print ("Done")
不确定凭据有什么问题?有没有人遇到类似的问题或知道如何解决它?
通过修复一些代码找到我的问题的解决方案。以下更新版本:
import boto3
from botocore.client import Config
ACCESS_KEY_ID = open("/home/pi/Desktop/pythonForAWS/certs/key.txt",
"r").read()
ACCESS_SECRET_KEY = open("/home/pi/Desktop/pythonForAWS/certs/skey.txt",
"r").read()
BUCKET_NAME = open("/home/pi/Desktop/pythonForAWS/certs/bucket.txt",
"r").read()
def store_to_bucket(path, date):
data = open(path, 'rb')
ext = '.jpg'
s3 = boto3.resource(
's3',
aws_access_key_id=ACCESS_KEY_ID,
aws_secret_access_key=ACCESS_SECRET_KEY,
config=Config(signature_version='s3v4')
)
s3.Bucket(BUCKET_NAME).put_object(Key=date+ext, Body=data)
print ("Done")
答案 0 :(得分:0)
如果通过重写可以理解,您正在函数内部创建s3
对象,那么不工作的原因可能是您正在调用read()
多个在同一个文件对象上的次数。
第一个调用返回文件的全部内容,但移动"位置"文件对象的结尾,所以后续调用相同的函数不会返回任何内容 - 因为没有什么可读的。
仅读取一次值,就像seek()
回到文件的开头并每次再次读取一样。我建议只读取一次值,以避免不必要的I / O和相关的开销。