すらいむがあらわれた

こまんど >  たたかう  にげる

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>