そのため、クラウドフロントdistを使用してs3でangularアプリをホストしました。古いコンテンツが取得されないように、ファイルのリビジョンを(grunt filerevを使用して)実行します。 index.htmlファイル。他のすべてのファイルはindex.html内で参照されるため、必須です。
静的サイトとして使用するようにバケットを構成しました。したがって、URLでバケットを参照すると、index.htmlが取得されます。
Cloudfrontは、min TTLを0に設定する必要があるため、コンテンツを提供するために常にOriginにヒットします。ただし、すべてのファイルのファイルリビジョンを実行しているため、これは必要ありません( index.htmlを除く)。これらのファイルのcdnキャッシングを利用できます。
また、単一のオブジェクトを無効にするには、max-ageヘッダーを0に設定するとも言われています。index.htmlに以下を追加してみました
<meta http-equiv="Cache-Control" content="public, must-revalidate, proxy-revalidate, max-age=0"/>
ただし、s3にアップロードすると、これは反映されません。 s3cmdまたはダッシュボードを使用してs3にヘッダーを明示的に設定する必要がありますか?そして、index.htmlが変更されてアップロードするたびにこれを行う必要がありますか?
私はcmdを使用して単一のファイルを無効にできることを知っていますが、それは繰り返しのプロセスであり、s3にデプロイするだけでそれ自体を処理できれば素晴らしいと思います。
S3cmdを使用している場合、受け入れられた答えは正しいですが、私はAWS CLIを使用していたので、次の2つのコマンドを実行しました。
まず、実際にコードをデプロイするには:
aws s3 sync ./ s3://bucket-name-here/ --delete
次に、CloudFrontで無効化を作成するには:
aws cloudfront create-invalidation --distribution-id <distribution-id> --paths /index.html
私自身の質問に答えます。 s3cmd
tool を使用してサイトをS3にデプロイし、変更されたすべてのファイルのCloudFrontキャッシュを無効にするオプションがあります(dist
フォルダーとS3の違い)バケツ)。これにより、インデックスファイルを含む変更されたすべてのファイルのキャッシュが無効になります。新しい変更を本番環境に反映するには、通常15〜20分かかります。
これがコマンドです
s3cmd sync --acl-public --reduced-redundancy --delete-removed --cf-invalidate [your-distribution-folder]/* s3://[your-s3-bucket]
注:macOSでは、このツールはbrew install s3cmd
からインストールできます。
お役に立てれば。
Lambdaを使用してプロセスを自動化できます。これにより、特定のイベント(S3の新しいファイル)に応答して特定のアクション(この場合はオブジェクトの無効化)を実行する関数を作成できます。
ローカルディレクトリをs3と同期する場合、次のことができます。
aws s3 sync ./dist/ s3://your-bucket --delete
aws s3 cp \
s3://your-bucket s3://your-bucket \
--exclude 'index.html' --exclude 'robots.txt' \
--cache-control 'max-age=604800' \
--metadata-directive REPLACE --acl public-read \
--recursive
最初のコマンドは通常の同期であり、2番目のコマンドはS3がindex.html
とrobots.txt
を除くすべてのファイルのキャッシュ制御を返すことを可能にします。
その後、SPAを完全にキャッシュできます(index.html
を除く)。
s3cmd sync
を使用して--cf-invalidate
オプションを使用する場合、設定によっては--cf-invalidate-default-index
も指定する必要がある場合があります。
マニュアルページから:
カスタムオリジンとS3静的ウェブサイトを使用する場合は、デフォルトのインデックスファイルを無効にします。
これにより、インデックスドキュメント(おそらくindex.html)も無効になります。そうしないと、同期によって更新されたかどうかに関係なくスキップされます。