AWS SDK fot .NET で CloudFrontのInvalidationを使う
Amazon Cloud Frontにはキャッシュ情報を強制削除するInvalidationという機能があります。
Cloud Frontで指定できる最短キャッシュ時間は1時間ですが、そんなに待てないという場合はInvalidationを使えば10〜15分程度の時間でキャッシュを削除できます(さすがに即時消去とはいかないようだ)。
エッジロケーションからオブジェクトを無効化 無効リクエストに含める各オブジェクトに対して Amazon CloudFront 料金を負担します。毎月、無料で1,000オブジェクトを無効にできます。それ以上の量は、無効にする各追加オブジェクトに対して課金されます。さらに、Amazon S3 がオリジンの場合、Amazon S3 バケットからオブジェクトを削除しない場合、これらのオブジェクトに対して通常の Amazon S3 ストレージに課金されます。
http://aws.amazon.com/jp/cloudfront/#details
Cloud BuddyやCloud BerryといったツールでInvalidationを行えば便利ですが、処理をプログラムで自動したい場合も多いと思います。
InvalidationのAPIはこちら。
Amazon CloudFront Developer Guide (API Version 2010-11-01)
Object Invalidation
http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html
ここではAWS SDK for .NET
http://aws.amazon.com/jp/sdkfornet/
を使ってInvalidation APIを使う例を紹介します。
GET Invalidation List
指定したDistribution IDのInvalidationの一覧を取得します。
/// <summary> /// GET Invalidation List /// http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/index.html?ListInvalidation.html /// </summary> static void GetObjectInvalidationList() { try { GetInvalidationListRequest request = new GetInvalidationListRequest(); request.WithDistributionId("YOUR_DISTRIBUTION_ID"); GetInvalidationListResponse response = cfClient.GetInvalidationList(request); String resultXml = response.XML; Console.WriteLine(resultXml); } catch (AmazonCloudFrontException cfEx) { Console.WriteLine("An Error, number {0}, occurred when create cloud distribution with the message '{1}", cfEx.ErrorCode, cfEx.Message); } catch (Exception ex) { Console.WriteLine("UnknownError:{0}", ex.Message); } }
結果
<?xml version="1.0"?> <InvalidationList xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/"><Marke r></Marker><MaxItems>100</MaxItems><IsTruncated>false</IsTruncated><Invalidation Summary><Id>XXXXXXXXXXX</Id><Status>InProgress</Status></InvalidationSummary> </InvalidationList>
GET Invalidation
指定したInvalidationの情報を取得します。
/// <summary> /// GET Invalidation /// http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/index.html?GetInvalidation.html /// </summary> static void GetObjectInvalidation() { try { GetInvalidationRequest request = new GetInvalidationRequest(); request.WithDistributionId("YOUR_DISTRIBUTION_ID") .WithInvalidationId("YOUR_INVARIDATION_ID"); GetInvalidationResponse response = cfClient.GetInvalidation(request); String resultXml = response.XML; Console.WriteLine(resultXml); } catch (AmazonCloudFrontException cfEx) { Console.WriteLine("An Error, number {0}, occurred when create cloud distribution with the message '{1}", cfEx.ErrorCode, cfEx.Message); } catch (Exception ex) { Console.WriteLine("UnknownError:{0}", ex.Message); } }
結果
<?xml version="1.0"?> <Invalidation xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/"><Id>XXXXXXXXX</Id><Status>InProgress</Status><CreateTime>2011-11-30T06:03:08.500Z</Cr eateTime><InvalidationBatch><Path>/test.txt</Path><CallerReference>6345826218367 77745</CallerReference></InvalidationBatch></Invalidation>
POST Invalidation
static void PostObjectInvalidation() { try { InvalidationBatch batch = new InvalidationBatch(); batch.WithPaths(new string[] { "test.txt" }); batch.CallerReference = DateTime.Now.Ticks.ToString(); PostInvalidationRequest request = new Amazon.CloudFront.Model.PostInvalidationRequest(); request.WithDistribtionId("XXXXXXXXX") .WithInvalidationBatch(batch); PostInvalidationResponse response = cfClient.PostInvalidation(request); String resultXml = response.XML; Console.WriteLine(resultXml); } catch (AmazonCloudFrontException cfEx) { Console.WriteLine("An Error, number {0}, occurred when create cloud distribution with the message '{1}", cfEx.ErrorCode, cfEx.Message); } catch (Exception ex) { Console.WriteLine("UnknownError:{0}", ex.Message); } }
結果
<?xml version="1.0"?> <Invalidation xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/"><Id>XXXXXXXXXXX</Id><Status>InProgress</Status><CreateTime>2011-11-30T06:03:08.500Z</Cr eateTime><InvalidationBatch><Path>/test.txt</Path><CallerReference>6345826218367 77745</CallerReference></InvalidationBatch></Invalidation>