Elastic Beanstalk 删除配置更改时生成的文件

Zag*_*ags 6 amazon-web-services amazon-elastic-beanstalk

在 Elastic Beanstalk 上,使用基于 AWS Linux 2 的环境时,更新环境的环境属性(即环境变量)会导致所有生成的文件被删除。作为此更新的一部分,它也不会运行container_commands。

例如,我有一个 Django 项目,其中包含collectstatic容器命令:

05_collectstatic:
  command: |
    source $PYTHONPATH/activate
    python manage.py collectstatic --noinput --ignore *.scss
Run Code Online (Sandbox Code Playgroud)

这会将静态文件收集到一个称为staticfiles部署一部分的文件夹中。但是当我更新环境变量时,staticfiles它被删除了。这会导致应用程序上的所有静态文件被破坏,直到我重新部署为止,这是极其不可取的。

在基于 AWS Linux 1 的环境中不会发生此行为。差异似乎在于,基于 AWS Linux 2 的环境/var/app/current在环境变量更改期间会替换该文件夹,而基于 AWS Linux 1 的环境则不会执行此操作。

我该如何解决?

研究

我可以通过监视来验证在环境变量更改期间容器命令没有运行/var/log/cfn-init.log;没有新条目添加到此日志中。

滚动更新类型“禁用”和“不可变”都会发生这种情况。

即使我将环境命令转换为平台钩子,也会发生这种情况,尽管更新环境属性时钩子被列为正在运行。

在我看来,有两种潜在的解决方案,但我不知道其中任何一个的 Elastic Beanstalk 设置:

  1. 让环境变量更改保留/var/app/current而不是替换它。
  2. 让环境变量更改运行容器命令。

有关容器命令的 Elastic Beanstalk 文档表示“仅在环境创建和部署期间执行仅领导者容器命令,而每次配置或更新实例时都会执行其他命令和服务器自定义操作。” 这是 Elastic Beanstalk 中的错误吗?

相关问题:EB:在配置更改时触发容器命令/部署脚本

Zag*_*ags 5

解决方案是对更改部署目录中文件的任何命令使用配置部署平台挂钩。请注意,这与应用程序部署平台挂钩不同。

使用collectstatic命令的示例,最好的办法是将其从容器命令移动到一对钩子,一个用于标准部署,一个用于配置更改。

为此,请删除collectstatic 容器命令。然后,制作两个相同的文件:

  • .platform/confighooks/predeploy/predeploy.sh
  • .platform/hooks/predeploy/predeploy.sh

每个文件应包含以下代码:

#!/bin/bash
source $PYTHONPATH/activate
python manage.py collectstatic --noinput --ignore *.scss
Run Code Online (Sandbox Code Playgroud)

你需要两个看似多余的文件,因为不同的钩子有不同的触发条件。hooks部署应用程序时运行脚本,而confighooks更改应用程序配置时运行脚本。

确保根据 git 使这两个文件可执行,否则当您尝试部署. 您可以通过以下方式检查它们是否可执行git ls-files -s .platform100755您应该在该命令的输出中看到任何 shell 文件之前。如果您100644在任何 shell 文件之前看到,请运行git add --chmod=+x -- .platform/*/*/*.sh以使它们可执行。


归档时间:

查看次数:

1084 次

最近记录:

3 年,10 月 前