当前位置: 首页 > 知识库问答 >
问题:

AWS弹性豆茎容器命令失败

锺离飞鸣
2023-03-14

我一直在努力将我的Django Web应用程序成功部署到AWS的Elastic Beanstalk。我能够在本地机器上从EB CLI部署我的应用程序,没有任何问题,直到我将container_commands配置文件列表添加到.ebextensions文件夹中。

以下是我的配置文件的内容:

container_commands:
  01_makeAppMigrations:
    command: "django-admin.py makemigrations"
    leader_only: true
  02_migrateApps:
    command: "django-admin.py migrate"
    leader_only: true
  03_create_superuser_for_django_admin:
    command: "django-admin.py createfirstsuperuser"
    leader_only: true
  04_collectstatic:
    command: "django-admin.py collectstatic --noinput"

我已经深入研究了日志,发现这些消息在 cfn-init-cmd.log是最有帮助的:

2020-06-18 04:01:49,965 P18083 [INFO] Config postbuild_0_DjangoApp_smt_prod
2020-06-18 04:01:49,991 P18083 [INFO] ============================================================
2020-06-18 04:01:49,991 P18083 [INFO] Test for Command 01_makeAppMigrations
2020-06-18 04:01:49,995 P18083 [INFO] Completed successfully.
2020-06-18 04:01:49,995 P18083 [INFO] ============================================================
2020-06-18 04:01:49,995 P18083 [INFO] Command 01_makeAppMigrations
2020-06-18 04:01:49,998 P18083 [INFO] -----------------------Command Output-----------------------
2020-06-18 04:01:49,998 P18083 [INFO]   /bin/sh: django-admin.py: command not found
2020-06-18 04:01:49,998 P18083 [INFO] ------------------------------------------------------------
2020-06-18 04:01:49,998 P18083 [ERROR] Exited with error code 127

我不确定为什么它在这个最新的环境中找不到该命令。我已经将具有相同配置文件的相同应用程序部署到之前的豆茎环境中,没有任何问题。现在唯一的区别是这个新环境是在VPC中启动的,并且正在使用最新推荐的平台。

旧的Beanstalk环境平台:运行在64位Amazon Linux/2.9.3上的Python 3.6

新的Beanstalk环境平台:运行在64位Amazon Linux 2/3.0.2上的Python 3.7

在此迁移期间,我遇到了与此最新平台的语法更新相关的其他问题。我希望这个问题也只是一个简单的语法问题,但我已经挖得很远了,但运气不好……

如果有人能指出我在这里缺少的一些明显的东西,我将不胜感激!如果我能提供一些额外的信息,请告诉我!

共有3个答案

段干河
2023-03-14

这对我有用。

container_commands:
  01_migrate:
    command: "source /var/app/venv/*/bin/activate && python /var/app/staging/manage.py migrate --noinput"
    leader_only: true
丘智志
2023-03-14

这可能可以正常工作

   option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: mysite.wsgi:application
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /static: static
packages: 
  yum:
    python3-devel: []
    mariadb-devel: []
container_commands:
  01_collectstatic:
    command: "source /var/app/venv/staging-LQM1lest/bin/activate && python manage.py collectstatic --noinput"
  02_migrate:
    command: "source /var/app/venv/staging-LQM1lest/bin/activate && python manage.py migrate --noinput"
    leader_only: true
松俊才
2023-03-14

在深入研究了AWS文档和论坛之后,终于找到了真相…

从本质上讲,随着豆茎从亚马逊Linux迁移到亚马逊Linux 2,发生了很多变化。这里模糊地提到了许多这些变化。

上面链接中提到的Python平台的一个主要区别是“环境Amazon EC2实例上应用程序目录的路径是 /var/app/current.它是在AmazonLinuxAMI平台上 /opt/python/current/app的。”这对于您尝试创建Django迁移脚本至关重要,因为我将在下面进一步详细解释,或者当您eb ssh进入Beanstatk实例并自己导航它时。

知道这一点,并在这里走过这个论坛,优秀的社区成员经历了填补亚马逊文档中空白的麻烦,我能够成功地部署以下文件设置:

(请注意,“MDG在线”是我Django应用程序的名称)

. eb扩展\01_packages.config:

packages:
  yum:
    git: []
    postgresql-devel: []
    libjpeg-turbo-devel: []

. eb扩展\django.config:

container_commands:
  01_sh_executable:
    command: find .platform/hooks/ -type f -iname "*.sh" -exec chmod +x {} \;
option_settings:
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: MDGOnline.settings
  aws:elasticbeanstalk:environment:proxy:staticfiles:    
    /static: static
    /static_files: static_files
  aws:elasticbeanstalk:container:python:
    WSGIPath: MDGOnline.wsgi:application

.平台\钩子\预部署\01_migrations.sh:

#!/bin/bash

source /var/app/venv/*/bin/activate
cd /var/app/staging

python manage.py makemigrations
python manage.py migrate
python manage.py createfirstsuperuser
python manage.py collectstatic --noinput

请注意。sh脚本需要基于linux。我遇到了一个错误,部署会失败,并在日志中提供了这条消息:< code >。platform \ hooks \ pre deploy \ 01 _ migrations . sh因错误fork/exec而失败。platform \ hooks \ pre deploy \ 01 _ migrations . sh:没有这样的文件或目录。原来这是因为我在我的windows开发环境中创建了这个脚本。我的解决方案是在linux环境中创建它,并将其复制到我在Windows中的开发环境目录中。我肯定有办法把DOS转换成Unix。这个看起来很有前途的dos2unix!

我真的希望AWS可以更好地记录这种迁移,但是我希望这个答案可以节省我花费在成功部署上的无数时间。

请随时要求我澄清以上任何问题!

编辑:我在上面的配置文件中添加了一个“container_command”,因为我注意到另一个用户在部署时也遇到了平台钩子的“权限拒绝”错误。这个“01_sh_executable”命令是对应用程序钩子目录中的所有. sh脚本进行chmod,以便Elastic Beanstek可以在部署过程中拥有执行它们的适当权限。我在这个论坛中找到了这个容器命令解决方案:

 类似资料:
  • 配置验证异常:AWS Elastic Beanstatk无法与Amazon EC2通信以确定是否为Elastic Load均衡创建自定义安全组。 在创建AWS Elastic Beanstalk应用程序时,我在尝试继续“查看和启动”时遇到了这个错误。我是新手。请帮忙。

  • 我是AWS的新手,这个问题似乎很基本。然而,我需要看看我是否能找到解决方案。 我首先创建并启动了一个 EC2 实例,然后创建了一个弹性 Beanstalk 实例,并在该实例上部署了一个示例应用程序。默认情况下,弹性 Beanstalk 会将“默认环境”附加到此实例,我无法将其更改为我的 EC2 实例。如何将我的 EC2 实例(我之前创建的实例)附加到此弹性豆茎实例?我正在使用亚马逊免费套餐来学习。

  • 我知道ECS有EC2和fargate启动类型,它们对底层环境配置提供的控制不同。

  • 我想我应该做的是,为“website.com”创建一个SSL证书,并将该SSL证书应用到AWS EB负载均衡器。然后,我需要为“website.com”创建一个子域,将流量重定向到“something.elasticbeanstalk.com”。客户端应用程序连接到“website.com”的子域,该子域现在是HTTPS,并重定向到“something.elsastic.beanstalk.com

  • 有人知道在弹性豆茎中传递一个秘密值作为环境变量是可能的吗?另一个选择显然是在我们的代码库中使用sdk,但我想先探讨环境变量方法 干杯Damien

  • 我使用WindowsPowerShell创建了一个弹性Beanstalk环境,并遵循以下部署文档将Django应用程序部署到弹性Beanstalk 我完成了以下步骤:使用Django的Python虚拟环境, 创建了django项目, 创建IAM用户我获得了访问密钥ID和机密访问密钥ID 失败此步骤环境并部署您的Django应用程序 当我尝试it询问访问密钥、秘密访问密钥和区域aws应用程序自动生成