【问题标题】:Upgrading Elastic Beanstalk environment from AWS Linux 1 to AWS Linux 2将 Elastic Beanstalk 环境从 AWS Linux 1 升级到 AWS Linux 2
【发布时间】:2021-12-11 06:50:36
【问题描述】:

我有一个在 AWS Linux 1 上运行 Python 3.6 的 Elastic Beanstalk 环境,我想在 Amazon Linux 2 上将其切换到 Python 3.8。

我知道我可以使用 aws CLI update-environment 命令升级环境:

aws elasticbeanstalk update-environment --environment-name <ENV_NAME> --solution-stack-name "64bit Amazon Linux 2 v3.3.7 running Python 3.8"

但是,AWS Linux 2 使用不同的配置参数。我无法部署 AWS Linux 2 配置,因为它在 AWS Linux 1 上无效,我无法升级到 AWS Linux 2,因为我的配置无效。

我如何进行升级,有没有办法就地升级?

【问题讨论】:

    标签: python amazon-web-services amazon-elastic-beanstalk


    【解决方案1】:

    配置差异

    AWS Linux 2 对弹性 beanstalk 的工作方式和配置方式进行了很多更改。无论您是进行就地升级还是启动新环境,这里列出了在进行升级之前需要执行的不同操作。这里的大多数项目都是在 .ebextensions 中的 Elastic Beanstalk 配置中不同的东西。

    1. Python 3.6 和 3.8 的子包依赖存在差异。您应该在 Python 3.8 上测试您的需求文件并确保它兼容,尤其是在您使用生成的 requirements.txt 时。

    2. AWS Linux 2 不再允许您使用 .ebextensions 中的 file 指令编写 Apache 配置。这些修改现在需要存在于.platform/httpd/conf

    3. 运行 container_commands 时虚拟环境不再处于活动状态。任何使用您的代码的容器命令都需要先运行 source $PYTHONPATH/activate

    4. 生成的文件现在会在配置更改时被擦除,因此像 django 的 collectstatic need to get moved to hooks 这样的命令。

    5. 虽然 yum,但 Postgres 客户端不再正常可用。要安装它,您需要执行以下操作:

      packages:
          yum:
              amazon-linux-extras: []
      
      commands:
          01_postgres_activate:
              command: sudo amazon-linux-extras enable postgresql10
          02_postgres_install:
              command: sudo yum install -y postgresql-devel
      
    6. Apache 不再是默认的 Web 服务器(它是 Nginx)。要继续使用它,您需要将其指定为环境中的一个选项,例如:

      option_settings:
        aws:elasticbeanstalk:environment:proxy:
          ProxyServer: apache
      
    7. Modwsgi 已被 Gunicorn 取代。您拥有的任何 modwsgi 自定义将不再起作用,并且 WSGI 路径具有不同的格式:

      option_settings:
        aws:elasticbeanstalk:container:python:
          WSGIPath: config.wsgi:application
      
    8. 静态文件配置有不同的格式:

      option_settings:
        aws:elasticbeanstalk:environment:proxy:staticfiles:
          /static: staticfiles
      
    9. 您将选择加入高级健康报告。强烈建议添加 Elastic Beanstalk 运行状况检查:

      option_settings:
        aws:elasticbeanstalk:application:
          Application Healthcheck URL: /health-check/
      
    10. 应用程序现在通过 Gunicorn 在服务器的 8000 端口上运行,而 Apache/Nginx 只是将请求代理到 Gunicorn。如果您正在执行 apache 自定义,例如 encrypting traffic between the load balancers and applications servers,这很重要。

    11. Apache 现在通过 systemctl 而不是 supervisord 运行。如果您尝试重新启动 Apache,则命令现在为 sudo systemctl restart httpd

    12. 如果你想在 sshed 到服务器时加载你的环境变量,你需要对它们进行不同的解析:

    13. 环境变量位于不同的位置并具有不同的格式。要在通过 SSH 登录时访问它们,您需要将 jq: [] 添加到您的 yum 安装中。然后,运行以下命令或将它们添加到服务器的 bashrc(使用 .ebextensions 中的 file 指令)以加载环境变量并激活 python 虚拟环境:

      source <(/opt/elasticbeanstalk/bin/get-config environment | jq -r 'to_entries | .[] | "export \(.key)=\"\(.value)\""')
      source $PYTHONPATH/activate
      cd /var/app/current
      

    通过启动新环境进行升级

    要采用此升级路径,您无需使用 Elastic Beanstalk 数据层(即您自己启动了 RDS 实例,而不是通过 Elastic Beanstalk)。

    1. 使用您的 AWS Linux 2 配置创建代码分支

    2. 在 AWS Linux 2 上启动新的 Elastic Beanstalk 环境。

    3. 从以前的环境中复制环境变量。

    4. 允许从新环境访问您的数据库(将新环境的服务器安全组添加为数据库安全组的入口规则的目标)

    5. 在新环境中设置 SSL。

    6. 将 AWS Linux 2 代码分支部署到新环境。

    7. 测试这个新环境,忽略浏览器证书警告(或设置一个临时 DNS 条目来测试它)。

    8. 切换 DNS 条目以指向您的新环境或使用 AWS 的 CNAME swap feature on the two environemnts

    9. 在您的新环境运行足够长的时间没有出现问题后,终止您的旧环境。

    就地升级

    有一种方法可以就地升级,尽管您的网站会在几分钟内显示“502 Bad Gateway”。为此,您需要与 AWS Linux 1 和 AWS Linux 2 环境兼容的 EB 配置。

    对于 Python,您可以使用一个小型 Flask 应用程序和一个四部分部署来完成此操作。

    第 1 部分:部署与两个平台兼容的占位符应用

    1. flask 添加到您的requirements.txt(如果它还没有的话)。

    2. 删除.ebextensions中的所有文件

    3. 制作.ebextensions/01.config:

      option_settings:
        aws:elasticbeanstalk:container:python:
          WSGIPath: wsgi_shim.py
      
    4. 制作wsgi_shim.py:

      from flask import Flask
      
      application = Flask(__name__)
      
      @application.route("/")
      @application.route("/<path:path>/")
      def hello_world(path=None):
          return "This site is currently down for maintenance"
      
    5. [如果使用load balancer to application server encryption,请将负载均衡器更改为通过 HTTP 将所有流量发送到服务器。]

    6. eb deploy

    第 2 部分:将平台升级到 AWS Linux 2

    1. [如果您在 elastic beanstalk 中配置了任何静态路由,请删除它们。]

    2. 升级您的 eb 环境

      # Get list of solution stacks
      aws elasticbeanstalk list-available-solution-stacks --output=json --query 'SolutionStacks' --region us-east-1
      
      # Use one of the above options here
      aws elasticbeanstalk update-environment --environment-name <ENV_NAME> --solution-stack-name "64bit Amazon Linux 2 v3.3.7 running Python 3.8"
      

    第 3 部分:将您的主应用程序部署到 AWS Linux 2

    1. 用您的新 AWS Linux 2 配置替换 .ebextensions/01.config

    2. Add .platform/httpd/conf.d/ssl_rewrite.conf:

      重写引擎开启 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    3. eb deploy

    第 4 部分:清理

    1. [如果使用load balancer to application server encryption,请将负载均衡器改回通过 HTTPS 向服务器发送流量。]

    2. 删除 wsgi_shim.py 并从 requirements.txt 中删除烧瓶(除非它是烧瓶项目)。

    3. eb deploy

    【讨论】:

    • 正如您很好地列出了所有差异:日志文件呢? /var/log/httpd/error_log 不再存在,因此 CloudWatch 为空...
    • 如果您使用 Apache 作为代理服务器,@E.ws /var/log/httpd/error_log 仍然存在。 Nginx 是 AWS Linux 2 的默认代理服务器,但它是可配置的
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 2015-09-16
    • 2021-09-29
    • 2020-08-19
    • 2015-08-05
    • 2020-10-18
    • 2020-08-05
    • 2015-12-29
    相关资源
    最近更新 更多