我正在将CloudFront发行版指向我的BackboneJS应用程序。这包括索引.html、主.css、主.js。
步骤:
- 将 ?v=ID 附加到索引中的 css 和 js 链接.html
- 将索引.html、css、js 文件部署到源站。
- 使索引.html文件 @ CloudFront 无效
- 等待 CF 从服务器获取新的索引.html文件并加载新版本化的资产。
部署时,我可以通过在索引文件中应用新的查询字符串来破坏主.css和主.js缓存。不幸的是,索引.html文件缓存必须手动失效 - 亚马逊表示此过程可能需要10-15分钟。
在 CF 上立即将索引.html文件更改为最新版本的任何提示?
谢谢!
根据个人经验,我可以告诉您 CloudFront 失效不会花费那么长时间。由于您的用户可能会长时间打开您的页面,因此无论如何您都需要处理同时运行的多个应用程序版本。
下面是一个使用 AWS CLI 失效并等待失效传播的 Bash 脚本:
# Invalidates the CloudFront cache,
# waits for invalidation to be propagated.
function invalidate_cache() {
local invalidation
local invalidation_id
local distribution_id=$1
local status=""
invalidation=$(aws cloudfront create-invalidation --distribution-id "$distribution_id" --paths '/*')
invalidation_id=$(jq -r .Invalidation.Id <<< "$invalidation")
while [[ $status != "Completed" ]]; do
echo "Waiting for CloudFront invalidation to complete..."
sleep 1
status=$(aws cloudfront get-invalidation --distribution-id "$distribution_id" --id "$invalidation_id"| jq -r .Invalidation.Status)
done
}
如果出于某种原因,您始终希望确保index.html
是最新的,那么只需让 CloudFront 根本不缓存它即可。您可以为/index.html
创建特定的 CloudFront 行为,并将生存时间覆盖为零。
使 Cloudfront 缓存失效不是一个耗时的过程。这不会花费太长时间。不过,您可以通过多种方式监视失效状态。
您还可以让 lambda 函数在 cloudfront 完成缓存失效后更新下游组件/系统。
话虽如此,如果需要实时更新索引.html,您可以选择不将其作为 cloudfront 缓存的一部分包含在内。您可能希望在 cloudfront 的行为设置中进行设置。TTL 可以设置为 0。