为什么Amazon Web Services无法解析我的CloudFront失效批处理请求XML文档?

1 投票
1 回答
776 浏览
提问于 2025-04-17 09:44

我正在尝试通过亚马逊CloudFront的无效化API来使我上传的一些对象失效。

根据他们的文档,我发送了一个POST请求,内容是一个XML文档。这个XML文档里指定了要失效的路径。

但是,亚马逊返回的错误是:

<Error>
    <Type>Sender</Type>
    <Code>MalformedInput</Code>
    <Message>Could not parse XML</Message>
</Error>

从我看到的情况来看,我的XML文档和他们的文档是一致的。

他们的文档链接:

我的XML文档是:

<InvalidationBatch xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/">
    <Path>/-o-replace.css</Path>
    <Path>/-o-set-link-source.css</Path>

    ...16 other path elements, each containing only letters, numbers, hyphens and periods

    <CallerReference>fixing-accidental-setting-of-gzip-header</CallerReference>
</InvalidationBatch>

我尝试过按照他们的响应格式包含XML的开头部分,调整空格,甚至去掉xmlns属性,但都没有效果。

我是在用Python手动发送这个POST请求的。这里是用来发送请求的Python代码。我已经确认文件内容读取得很正确。

from httplib import HTTPSConnection
from datetime import datetime
from hashlib import sha1
import hmac

conneck = HTTPSConnection('cloudfront.amazonaws.com')

invalidation_file = file('invalidation.xml')
invalidation = unicode(invalidation_file.read()).encode('utf-8')

now_as_string = datetime.now().strftime('%a, %d %b %Y %H:%M:%S GMT')
signature = hmac.new('MY_SECRET_KEY', now_as_string, sha1).digest().encode('base64')

conneck.request('POST', '/2010-11-01/distribution/MY_DISTRIBUTION_ID/invalidation', invalidation, {
     'Content-Type': 'text/xml',
    'Authorization': 'AWS MY_ACCESS_KEY_ID' + ':' + signature,
       'x-amz-date': now_as_string,
})

response = conneck.getresponse()

有没有人能看出我哪里做错了?

1 个回答

1

我对CF API不是很专业,但我觉得你在做base64编码的时候可能搞错了,看看这个例子:

>>> 'xyz'.encode('base64')
'eHl6\n'
>>> base64.b64encode('xyz')
'eHl6'

撰写回答