AWS Elastic Beanstalk:通过缓存避免在 EB 应用程序更新时重新下载应用程序的静态文件

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk:通过缓存避免在 EB 应用程序更新时重新下载应用程序的静态文件【英文标题】:AWS Elastic Beanstalk: Avoid redownload of app's static files on EB app update by caching 【发布时间】:2016-02-29 22:06:57 【问题描述】:

我们的项目包含应用程序在 Elastic Beanstalk 部署过程中从 Amazon S3 下载的多 Gb 数量的静态文件(使用 .ebextensions/*.config 文件),因此将新服务器实例部署到集群和/或应用程序版本更新需要很长时间,所以我们甚至需要大大增加部署超时时间。

这些文件位于应用程序目录中,当 EB 在应用程序版本更新时重建主应用程序目录时,部署过程会在每次应用程序更新时将所有静态文件从 S3 重新下载到新创建的目录,从而增加部署时间并生成不必要的流量支出。

想法是通过在应用程序目录之外保存静态文件的缓存副本并在部署时将其与 s3 同步(以防在 S3 上更改或删除任何静态文件)来防止重新下载:

aws s3 sync s3://bucket/staicfiles path/to/local/cached/staticfiles --delete

然后将文件从这个缓存的目录移动/复制到新部署的目录。

    是否有任何其他想法/最佳做法来防止在更新时重新下载静态文件? 对于不受系统或部署过程影响的用户缓存文件,是否有任何 Amazon Linux 推荐目录?

【问题讨论】:

【参考方案1】:

您可以在部署期间使用EBExtensions 执行任意命令。正如您所建议的,我要做的是在那里使用命令将 S3 同步运行到未附加到您的应用程序部署路径的文件夹。

您可以将这些命令放在应用程序根目录的“.ebextensions”目录中 - EB 将在部署期间读取该目录,并执行在其中找到的任何“*.config”文件。

至于其他方法 - 我不确定您的应用程序结构/组织/等,但这些资产(图像、js、css 等)是否可以直接从 S3 存储桶提供?然后你就可以完全抵消服务器的负载了。

【讨论】:

感谢您的回答。 - 1. 我们已经在使用 .ebextensions/*.config 文件 - 这就是我们在部署时从 s3 下载文件的方式。 - 2. 不,我们从 Amazon CloudFront 提供图像、js、css,那些静态文件(我们需要在应用程序目录中)是应用程序相关文件。 酷 - 感谢您提供更多信息。大多数 EB 容器使用/var/app/ondeck/ 构建应用程序,然后在将其翻转为活动版本时翻转为/var/app/current。您想在其中运行 S3 同步的任何其他文件夹(我建议使用 /opt 或 /srv 之类的东西)都应该没问题。【参考方案2】:

名为 Elastic File System 的新 AWS 服务解决了这个问题。它允许将单个虚拟磁盘驱动器安装到多个实例并访问文件。像魅力一样工作。

您可以在此处找到有关弹性文件系统 (AWS EFS) 工作原理的更多信息:

http://docs.aws.amazon.com/efs/latest/ug/how-it-works.html

【讨论】:

以上是关于AWS Elastic Beanstalk:通过缓存避免在 EB 应用程序更新时重新下载应用程序的静态文件的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS Elastic Beanstalk (AWS) 到 Android

通过 AWS Elastic Beanstalk 部署应用程序时出错

通过 AWS Elastic Beanstalk 部署 Django 应用程序会破坏 CSS 路径

通过 AWS Elastic Beanstalk 成功部署 Django,但出现 500 错误

通过 aws.push 部署到 Elastic Beanstalk 时保留某些现有文件

通过ebextensions在aws elastic beanstalk中用nginx替换apache