CloudFrontのキャッシュをPythonから無効化(Invalidate)する

2020.03.16

Amazon CloudFrontでキャッシュしたオブジェクトをTTLよりも早く削除したい場合、無効化する API(CloudFront::CreateInvalidation)を呼び出します。

この API を Python から呼び出す方法を紹介します。

ソースコード

先にソースコードを紹介します。

  • ディストリビューション(DistributionId)
  • 無効化するパスパターン(Paths)

を指定するだけです。

CallerReference について

CallerReference の使い方には注意が必要です。

この引数は無効リクエストの冪等性を担保するために存在し、無効リクエストごとにユニークである必要があります。

AWS CLI はタイムスタンプと乱数を組み合わせてユニークとなるように生成しており、上記サンプルコードはその実装を流用しています。

CallerReference とパスパターンの違いによって以下の様に動作します。

  • 新しい CallerReference を利用すると、新規無効リクエストを作成
  • 既知CallerReference同じパスパターンの場合、新規無効リクエストは作成されない
  • 既知CallerReference異なるパスパターンの場合、エラーが発生

この動作をAWS CLI から確認します。

無効パスパターン

次の無効パスパターンを用意します。

inv-batch.json

{
    "Paths": {
        "Quantity": 2,
        "Items": [
            "/example-path/example-file.jpg",
            "/example-path/example-file2.png"
        ]
    },
    "CallerReference": "cli-example"
}

新規リクエストの場合

新しい CallerReference でリクエストすると、新規無効ID(I3G4ULZQYDDX98)が発行され、無効ジョブがエンキューされます。

$ aws cloudfront create-invalidation \
  --distribution-id SAMPLE \
  --invalidation-batch file://inv-batch.json
{
    "Location": "https://cloudfront.amazonaws.com/2019-03-26/distribution/SAMPLE/invalidation/I3G4ULZQYDDX98",
    "Invalidation": {
        "Id": "I3G4ULZQYDDX98",
        "Status": "InProgress",
        "CreateTime": "2020-03-14T12:12:33.340Z",
        "InvalidationBatch": {
            "Paths": {
                "Quantity": 2,
                "Items": [
                    "/example-path/example-file2.png",
                    "/example-path/example-file.jpg"
                ]
            },
            "CallerReference": "cli-example"
        }
    }
}

重複リクエストの場合

CallerReference・パスパターンが同じパラメーターのまま再度リクエストすると、新規無効リクエストとはみなされず、同じIDが返ってきます。 レスポンスに含まれる CreateTime も、1回目のリクエスト時と同じですね。

$ aws cloudfront create-invalidation \
  --distribution-id SAMPLE \
  --invalidation-batch file://inv-batch.json
{
    "Location": "https://cloudfront.amazonaws.com/2019-03-26/distribution/SAMPLE/invalidation/I3G4ULZQYDDX98",
    "Invalidation": {
        "Id": "I3G4ULZQYDDX98",
        "Status": "InProgress",
        "CreateTime": "2020-03-14T12:12:33.340Z",
        "InvalidationBatch": {
            "Paths": {
                "Quantity": 2,
                "Items": [
                    "/example-path/example-file2.png",
                    "/example-path/example-file.jpg"
                ]
            },
            "CallerReference": "cli-example"
        }
    }
}

既知のCallerReferenceを異なるパスパターンに流用するとエラー

inv-batch.jsonファイルを修正し、既知の CallerReference のままパスパターンだけ変更すると InvalidArgument エラーが発生しました。

$ aws cloudfront create-invalidation \
  --distribution-id SAMPLE \
  --invalidation-batch file://inv-new-batch.json

An error occurred (InvalidArgument) when calling the CreateInvalidation operation: 
  Your request contains a caller reference that was used for a previous invalidation batch for the same distribution.

無効化に要する時間

AWS サポート - ナレッジセンターによると、 オブジェクトの無効化を完了するには、通常 60~300 秒かかります。

無効機能の使いすぎに注意

FAQ にあるように、無効機能は頻繁に呼び出されることを想定していません。

予想できない状況以外でも使用していることが判明した場合、キャッシュ戦略の見直しをご検討ください。

無効機能は、予想できない状況でのみ使用できます。前もって頻繁にファイルをキャッシュから削除する必要がある場合は、ファイルのバージョニングシステムの実行または失効期間の短縮 (あるいは両方) を行います。

https://aws.amazon.com/cloudfront/faqs/