CloudFrontのキャッシュをクリアする実践的な3つの方法

CloudFrontにキャッシュされたコンテンツを削除したい場合、Invalidationを使用することが一般的です。このガイドでは、AWS管理コンソール、AWS CLI、プログラムから即座に実装できるキャッシュクリア方法を解説します。

CloudFrontキャッシュクリアが必要な場面

CloudFrontは高速配信のためにエッジロケーションでコンテンツをキャッシュします。しかし以下のような場面では、キャッシュを即座にクリアする必要があります。

  • 本番環境に緊急修正をデプロイした時
  • 誤ったバージョンのファイルがキャッシュされている場合
  • セキュリティリスクのあるコンテンツを削除した際
  • 大規模なコンテンツ更新を一括反映させたい時

逆に、キャッシュをクリアすべきでない場面は、アクセス数が少ないステージング環境での頻繁な更新です。不要なInvalidation料金が発生します。

方法1: AWS管理コンソールでワンクリッククリア

最も直感的で初心者向けの方法です。CloudFront管理画面から数クリックでキャッシュをクリアできます。

手順

  1. AWSマネジメントコンソールにログイン
  2. CloudFrontダッシュボードを開く
  3. 対象のディストリビューションIDをクリック
  4. 「Invalidations」タブを選択
  5. 「Create invalidation」をクリック
  6. クリア対象のパスを指定(例:/*で全削除、/index.htmlで個別削除)
  7. 「Create invalidation」を確定

数秒〜数分でInvalidationが完了し、全エッジロケーションのキャッシュが削除されます。

パスパターンの実例


# 全ファイルをクリア
/*

# 特定ファイルのみクリア
/index.html
/api/data.json

# ディレクトリ配下をクリア
/images/*
/static/css/*

# 複数パターンの組み合わせ
/index.html
/api/*
/static/js/main.*.js

方法2: AWS CLIで自動化・スクリプト化

CIパイプラインやデプロイスクリプトにインテグレーションする場合、AWS CLIが最適です。

基本的なコマンド


# 全ファイルをクリア
aws cloudfront create-invalidation \
  --distribution-id E1234ABCD5678 \
  --paths "/*"

# 特定ファイルをクリア
aws cloudfront create-invalidation \
  --distribution-id E1234ABCD5678 \
  --paths "/index.html" "/api/config.json"

# ステータス確認
aws cloudfront list-invalidations \
  --distribution-id E1234ABCD5678

# 特定のInvalidationステータスを確認
aws cloudfront get-invalidation \
  --distribution-id E1234ABCD5678 \
  --id I123456ABC789

デプロイスクリプトに組み込む実例


#!/bin/bash
# デプロイ後、自動的にキャッシュクリア

set -e

DISTRIBUTION_ID="E1234ABCD5678"
PATHS_TO_INVALIDATE="/index.html /api/* /static/*"

echo "Deploying to S3..."
aws s3 sync ./build s3://my-bucket/ --delete

echo "Creating CloudFront invalidation..."
INVALIDATION_ID=$(aws cloudfront create-invalidation \
  --distribution-id $DISTRIBUTION_ID \
  --paths $PATHS_TO_INVALIDATE \
  --query 'Invalidation.Id' \
  --output text)

echo "Invalidation ID: $INVALIDATION_ID"
echo "Waiting for invalidation to complete..."

# ステータス確認ループ(最大300秒待機)
for i in {1..60}; do
  STATUS=$(aws cloudfront get-invalidation \
    --distribution-id $DISTRIBUTION_ID \
    --id $INVALIDATION_ID \
    --query 'Invalidation.Status' \
    --output text)
  
  if [ "$STATUS" = "Completed" ]; then
    echo "✓ Invalidation completed successfully"
    exit 0
  fi
  
  echo "Status: $STATUS... ($i/60)"
  sleep 5
done

echo "✗ Invalidation timeout"
exit 1

よくあるハマりポイント

エラー:InvalidationBatch constraint violation

1回のInvalidationで3000パス以上を指定すると発生します。大量のファイルをクリアする場合は、/*(全削除)を使うか、複数回に分割してください。


# ❌ NGパターン:3000個のパスを一度に指定
aws cloudfront create-invalidation \
  --distribution-id E1234ABCD5678 \
  --paths file1.js file2.js ... file3000.js

# ✓ 良いパターン:ワイルドカード使用
aws cloudfront create-invalidation \
  --distribution-id E1234ABCD5678 \
  --paths "/*"

方法3: プログラムから動的にクリア(Python/Node.js)

マイクロサービスやサーバーレスアーキテクチャでは、アプリケーション内からプログラム的にInvalidationを実行する必要があります。

Python(boto3)での実装


import boto3
from botocore.exceptions import ClientError

def invalidate_cloudfront_cache(distribution_id, paths):
    """
    CloudFrontのキャッシュをクリア
    
    Args:
        distribution_id: CloudFrontディストリビューションID
        paths: クリア対象パスのリスト
    
    Returns:
        Invalidation ID
    """
    client = boto3.client('cloudfront')
    
    try:
        response = client.create_invalidation(
            DistributionId=distribution_id,
            InvalidationBatch={
                'Paths': {
                    'Quantity': len(paths),
                    'Items': paths
                },
                'CallerReference': str(int(time.time()))
            }
        )
        
        invalidation_id = response['Invalidation']['Id']
        print(f"✓ Invalidation created: {invalidation_id}")
        return invalidation_id
        
    except ClientError as e:
        print(f"✗ Error: {e.response['Error']['Message']}")
        raise

# 使用例
if __name__ == "__main__":
    import time
    
    DISTRIBUTION_ID = "E1234ABCD5678"
    PATHS = ["/index.html", "/api/config.json", "/static/*"]
    
    invalidate_cloudfront_cache(DISTRIBUTION_ID, PATHS)

Node.js(AWS SDK)での実装


const AWS = require('aws-sdk');

const cloudfront = new AWS.CloudFront({
  region: 'us-east-1'
});

async function invalidateCache(distributionId, paths) {
  const params = {
    DistributionId: distributionId,
    InvalidationBatch: {
      CallerReference: Date.now().toString(),
      Paths: {
        Quantity: paths.length,
        Items: paths
      }
    }
  };
  
  try {
    const result = await cloudfront.createInvalidation(params).promise();
    console.log(`✓ Invalidation ID: ${result.Invalidation.Id}`);
    return result.Invalidation.Id;
  } catch (error) {
    console.error(`✗ Error: ${error.message}`);
    throw error;
  }
}

// 使用例(Express)
app.post('/api/deploy', async (req, res) => {
  const DISTRIBUTION_ID = process.env.CLOUDFRONT_DIST_ID;
  const paths = ['/index.html', '/api/*'];
  
  try {
    const invalidationId = await invalidateCache(DISTRIBUTION_ID, paths);
    res.json({ success: true, invalidationId });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

キャッシュクリアの料金と最適化

CloudFrontのInvalidationは月100リクエストまで無料ですが、それ以降は1リクエストあたり0.005ドルかかります。以下の戦略で効率化してください。

最適化のポイント

  • バージョニング戦略:ファイル名にハッシュ値を含める(main.abc123.js)ことで、更新時のみ新ファイルを配信。キャッシュクリア不要に
  • パス指定の精密化:必要最小限のパスのみ指定。全削除/*の濫用を避ける
  • Cache-Controlヘッダー活用:頻繁に更新されるコンテンツはTTLを短く設定

# キャッシュ戦略の実例

# 静的アセット:1年キャッシュ(ハッシュ付き)
/static/js/main.abc123.js → Cache-Control: max-age=31536000

# HTML:30分ごとに確認
/index.html → Cache-Control: max-age=1800, must-revalidate

# API:キャッシュしない
/api/* → Cache-Control: no-cache, no-store

トラブルシューティング

Invalidationが完了しない

通常は数秒で完了しますが、まれに数分かかる場合があります。以下を確認してください:

  • IAMポリシーでcloudfront:CreateInvalidation権限を付与しているか
  • ディストリビューションIDが正しいか
  • パス形式が正しいか(先頭に/が必須)

キャッシュが削除されない

以下のいずれかが原因の可能性があります:

  • CloudFrontのキャッシュ動作が「None」に設定されている場合、Invalidationは不要
  • ブラウザキャッシュも一緒に削除する必要がある(Ctrl+Shift+Delete)
  • エッジロケーション全体への反映に数分待つ必要がある

CloudFrontキャッシュクリアの代替手段

Invalidationが最も一般的ですが、以下のアプローチもあります:

  • Cache-Controlヘッダー:最初からTTLを短く設定(ただしパフォーマンス低下)
  • Distribution再配置:新しいDistributionを作成し、DNSを切り替え(移行コストが大きい)
  • オリジン側でのバージョン管理:ファイル名にタイムスタンプを埋め込む

よくある質問

A: 通常は数秒〜1分以内です。ただしCloudFrontは全世界のエッジロケーションにキャッシュを持つため、最悪の場合5分程度かかることもあります。get-invalidationコマンドで「Completed」ステータスを確認してください。

A: はい。101回目以降は1リクエストあたり0.005ドル(2025年1月時点)発生します。ワイルドカードやバージョニングを活用して、Invalidation回数を削減することが重要です。

A: できません。CloudFrontのキャッシュはAWS側で管理されているため、Invalidation APIが唯一の公式な削除方法です。

まとめ

  • 管理コンソール:手動での一時的なクリアに最適。UIから直感的に操作可能
  • AWS CLI:デプロイスクリプトに統合可能。バッチ処理に向いている
  • プログラム実装:マイクロサービスやサーバーレスアーキテクチャで自動化に活用
  • 料金最適化:バージョニングやCache-Controlヘッダーで不要なInvalidationを削減
  • パス指定の精密化/*の濫用を避
K
AWS・Python・生成AIを専門とするソフトウェアエンジニア。AI・クラウド・開発ワークフローの実践ガイドを執筆しています。詳しく見る →