使用Lambda的过程中,需要在有文件上传到S3时,自动读取文件内容进行后续处理。
但是间歇性的遇到一些奇怪的问题,比如报NoSuchKey的问题。
很容易将问题原因导向到 Read after Write的 ConsistentRead 的方向。
解释一下,就是当文件上传后马上可以读取的功能。
然而加上延时并没有什么用。
仔细DIG才会发现,原来还是文件名编码的问题。上传的文件名中如果包括空格,则在S3 的Event里面会自动将空格替换为+号
也就是你明明 上传的 test 123.txt (中间有个空间)
但在Lamdba读取S3 event 时:
event['Records'][0]['s3']['object']['key']
返回给你的是 test+123.txt
你再用client去getObject的话,于是就报NoSuchKey了
既然如此,我们就故意也上传一个 test+123.txt 给它如何?
结果你会发现返回给你的是 test%2B123.txt + 号已经被URL编码了。
知道问题所在,解决起来就方便多了。
我想聪明的你应该懂了吧。已经写得这么明白了。就是涉及URL编码和解码的问题。