2010-09-03 2 views

Répondre

8

La réponse acceptée ne fonctionne plus comme de la dernière version du SDK AWS pour .NET (1.5.8.0). Cela devrait faire l'affaire:

using Amazon; 
using Amazon.CloudFront.Model; 

...

var client = AWSClientFactory.CreateAmazonCloudFrontClient(accessKey, secretKey); 
client.CreateInvalidation(new CreateInvalidationRequest { 
    DistributionId = distributionID, 
    InvalidationBatch = new InvalidationBatch { 
     Paths = new Paths { 
      Quantity = arrayofpaths.Length, 
      Items = arrayofpaths.ToList() 
     }, 
     CallerReference = DateTime.Now.Ticks.ToString() 
    } 
}); 
+2

+1 bien pour garder les choses à jour (triste ma réponse n'est pas plus-;-) – Myster

7

Ça marche, c'est ici si quelqu'un d'autre le trouve utile.

public static void InvalidateContent(string distributionId, string fileName) 
    { 
     string httpDate = Helpers.GetHttpDate(); 

     ASCIIEncoding encoding = new ASCIIEncoding(); 
     string postData = @"<InvalidationBatch>" + 
          " <Path>/" + fileName + "</Path>" + 
          " <CallerReference>" + httpDate + "</CallerReference>" + 
          "</InvalidationBatch>"; 
     byte[] data = encoding.GetBytes(postData); 

     // Prepare web request... 
     HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://cloudfront.amazonaws.com/2010-08-01/distribution/" + distributionId + "/invalidation"); 
     webRequest.Method = "POST"; 
     webRequest.ContentType = "text/xml"; 
     webRequest.Headers.Add("x-amz-date", httpDate); 

     Encoding ae = new UTF8Encoding(); 
     HMACSHA1 signature = new HMACSHA1(ae.GetBytes(GlobalSettings.AWSSecretAccessKey.ToCharArray())); 
     string b64 = Convert.ToBase64String(signature.ComputeHash(ae.GetBytes(webRequest.Headers["x-amz-date"].ToCharArray()))); 
     webRequest.Headers.Add(HttpRequestHeader.Authorization, "AWS" + " " + GlobalSettings.AWSAccessKeyId + ":" + b64); 

     webRequest.ContentLength = data.Length; 

     Stream newStream = webRequest.GetRequestStream(); 
     // Send the data. 
     newStream.Write(data, 0, data.Length); 
     newStream.Close(); 
    } 

    /// <summary> 
    /// Gets a proper HTTP date 
    /// </summary> 
    public static string GetHttpDate() 
    { 
     // Setting the Culture will ensure we get a proper HTTP Date. 
     string date = System.DateTime.UtcNow.ToString("ddd, dd MMM yyyy HH:mm:ss ", System.Globalization.CultureInfo.InvariantCulture) + "GMT"; 
     return date; 
    } 
+1

D'ailleurs ce qui suit vous donnera la même date format 'DateTime.UtcNow.ToString ("R");' –

4

Voici une version python de ce qui précède, si quelqu'un juge utile

from datetime import datetime 
import urllib2, base64, hmac, hashlib 

def getHTTPDate(): 
    return datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S UTC") 

def submitInvalidationRequest(fileName,distributionId): 
    url = "https://cloudfront.amazonaws.com/2010-08-01/distribution/" + distributionId + "/invalidation" 
    httpDate = getHTTPDate(); 
    postData = "<InvalidationBatch>" +"<Path>/" + fileName + "</Path>" +"<CallerReference>" + httpDate + "</CallerReference>" +"</InvalidationBatch>"; 
    sig = hmac.new(AWSSecretAccessKey, unicode(httpDate), hashlib.sha1) 

    headers = {"ContentType": "text/xml", 
      "x-amz-date": httpDate, 
      "Authorization":"AWS " + AWSAccessKeyId + ":" + base64.b64encode(sig.digest())} 

    req = urllib2.Request(url,postData,headers) 
    return urllib2.urlopen(req).read() 
+0

Merci pour ça - c'est bien de le mettre en place. – user47892

1

Voici perl:

use warnings; 
use strict; 
use HTTP::Date; 
use Digest::SHA qw(hmac_sha1); 
use LWP::UserAgent; 
use MIME::Base64; 
use Encode qw(encode_utf8); 

@ARGV == 4 || die "usage: $0 url distribution_id accesskey secretkey\n"; 

my $invalid_url = $ARGV[0]; 
my $distribution_id = $ARGV[1]; 
my $accesskey = $ARGV[2]; 
my $secretkey = $ARGV[3]; 

my $url = "https://cloudfront.amazonaws.com/2010-11-01/distribution/$distribution_id/invalidation"; 
my $date = time2str; 

my $post_data = <<HERE; 
<?xml version="1.0" encoding="UTF-8"?> 
<InvalidationBatch> 
    <Path>$invalid_url</Path> 
    <CallerReference>$date</CallerReference> 
</InvalidationBatch> 
HERE 

my $sig = encode_base64(hmac_sha1(encode_utf8($date),encode_utf8($secretkey))); 

my $browser = LWP::UserAgent->new; 
my $res = $browser->post($url, 
         "Content" => $post_data, 
         "ContentType" => "text/xml", 
         "x-amz-date" => $date, 
         "Authorization" => "AWS $accesskey:$sig"); 

print $res->status_line, "\n", $res->content; 
+0

Il n'a pas demandé perl, n'est-ce pas? – Rob

+0

^^ Rob: Il n'a pas demandé Python non plus (par Alex Hofsteede), n'est-ce pas? –

2

en utilisant la AWSSDK .net api wrapper from amazon rend cette tâche encore plus facile.

using Amazon.CloudFront.Model; 

...

var client = Amazon.AWSClientFactory.CreateAmazonCloudFrontClient(ConfigurationManager.AppSettings["Aws.AccessKey"], 
                   ConfigurationManager.AppSettings["Aws.SecretKey"]); 
var request = new PostInvalidationRequest(); 
request.DistributionId = ConfigurationManager.AppSettings["Cdn.DistributionId"]; 
request.InvalidationBatch = new InvalidationBatch(); 
request.InvalidationBatch.CallerReference = new Guid().ToString(); 
request.InvalidationBatch.Paths = PathsInput.Text.Split(new[]{'\n','\r'},StringSplitOptions.RemoveEmptyEntries).ToList(); 
var response = client.PostInvalidation(request); 
+0

Cela ne semble plus fonctionner, à partir de la dernière mise à jour d'AWS SDK pour .NET (version 1.5.8.0). J'essaye de trouver le remplaçant et le posterai ici, à moins que quelqu'un puisse me battre dessus. :) –

Questions connexes