2012-01-07 1 views
0

J'essaie d'invalider certains objets que j'ai téléchargés sur Amazon CloudFront en utilisant leur API d'invalidation.Pourquoi Amazon Web Services ne peut-il pas analyser mon document XML de demande de traitement par lots CloudFront?

Selon leur documentation, j'envoie une requête POST avec un document XML comme contenu. Le document XML spécifie les chemins à invalider.

L'erreur Je reviens d'Amazon est:

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

Pour autant que je peux voir, mon document XML correspond à leur documentation.

Leur documentation:

Mon document 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> 

J'ai essayé, y compris le Prolog XML comme ils le font dans leur réponse, en gardant et en supprimant les espaces et en omettant l'attribut xmlns, le tout sans effet.

J'envoie la requête POST manuellement en utilisant Python. Voici le code Python utilisé pour l'envoyer. J'ai confirmé que le contenu du fichier est correctement lu.

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

Quelqu'un peut-il voir ce que je fais mal?

Répondre

1

pas un expert avec les API des FC, mais je pense que vous faites l'encodage base64 mal, voir par exemple:

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