【问题标题】:Elastic BeanStalk app deploy post hook not executing my commandElastic BeanStalk 应用程序部署后挂钩未执行我的命令
【发布时间】:2020-10-18 00:08:27
【问题描述】:

我最近能够在 Elastic Beanstalk 上使用 codepipeline 部署我的 Laravel 应用程序,但遇到了问题。我注意到我的路由由于 php.conf Nginx 配置而失败。我必须在 EB 的 nginx php.conf 文件中添加几行代码才能让它工作。

我现在的问题是,在每次部署之后,我修改 php.conf 文件的应用程序实例都被销毁并重新创建。我想要一种在每次成功部署后动态更新文件的方法。我有一个我想用我的应用程序版本化的文件版本,因此想在部署后创建指向该文件的符号链接。

经过大量研究,我偶然发现了 appDeploy Hooks on Elastic Beanstalk,它在部署后运行 post 脚本,所以这样做

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/91_post_deploy_script.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      sudo mkdir /var/testing1
      sudo ln -sfn /var/www/html/php.conf.example /etc/nginx/conf.d/elasticbeanstalk/php.conf
      sudo mkdir /var/testing
      sudo nginx -s reload

由于某种原因,这不起作用。未创建符号链接,因此我的路线仍然无法正常工作..

我什至添加了一些 mkdir,因此可以确定该脚本中的命令运行,这些命令都没有运行,因为没有创建这些目录。

请注意,如果我 ssh 进入 ec2 实例并在那里运行命令,它就可以工作。该 bash 脚本也存在于 post 目录中,如果我在服务器上手动运行它也可以。

任何有关我如何解决此问题的指示都会有所帮助。也许我也做错了什么。

现在我已经通过关注this 来运行我的脚本。但是,脚本没有运行。我收到一个错误

2020/06/28 08:22:13.653339 [INFO] Following platform hooks will be executed in order: [01_myconf.config]
2020/06/28 08:22:13.653344 [INFO] Running platform hook: .platform/hooks/postdeploy/01_myconf.config
2020/06/28 08:22:13.653516 [ERROR] An error occurred during execution of command [app-deploy] - [RunPostDeployHooks]. Stop running the command. Error: Command .platform/hooks/postdeploy/01_myconf.config failed with error fork/exec .platform/hooks/postdeploy/01_myconf.config: permission denied 

我尝试关注此论坛帖子here,通过向我的容器命令添加如下新命令来使我的文件可执行:

01_chmod1:
        command: "chmod +x .platform/hooks/postdeploy/91_post_deploy_script.sh"

我仍然遇到同样的问题。权限被拒绝

【问题讨论】:

  • 那是什么环境?亚马逊 Linux 1 还是 2?
  • 操作系统是 Amazon Linux 2
  • appDeploy是个什么钩子?没有这样的钩子。你只有haveprebuildpredeploypostdeploy
  • 在压缩应用程序之前,您可以使其在本地工作站上可执行。另外,当您登录到实例时,您可以手动调用脚本吗?手动运行时是否正常运行?
  • 不错。很高兴听到它成功了:-)

标签: amazon-web-services continuous-integration amazon-elastic-beanstalk devops continuous-deployment


【解决方案1】:

遗憾的是,您描述的挂钩(即/opt/elasticbeanstalk/hooks/appdeploy)适用于 Amazon Linux 1

由于您使用的是 Amazon Linux 2,如 cmets 中所述,您尝试使用的挂钩不适用。因此它们没有被执行

在 Amazon Linux 2 中,有 here 所述的新挂钩,它们是:

prebuild – 此处的文件在 Elastic Beanstalk 平台引擎下载和提取应用程序源包之后,在它设置和配置应用程序和 Web 服务器之前运行。

predeploy – 此处的文件在 Elastic Beanstalk 平台引擎设置和配置应用程序和 Web 服务器之后运行,在将它们部署到最终运行时位置之前运行。

postdeploy – 此处的文件在 Elastic Beanstalk 平台引擎部署应用程序和代理服务器后运行。

这些新挂钩的使用与在 Amazon Linux 1 中不同。因此,您必须返回到 Amazon Linux 1 或将您的应用程序迁移到 Amazon Linux 2。

描述了在 EB 中从 Amazon Linux 1 到 Amazon Linux 2 的一般迁移步骤here

【讨论】:

  • 我现在可以看到日志了。它正在尝试运行脚本,但我的权限被拒绝。我假设这些脚本以 root 用户身份运行。我什至在我的脚本中添加了 sudo su 但它仍然是同样的错误。运行平台挂钩下方的日志:.platform/hooks/postdeploy/01_myconf.config 2020/06/28 08:06:57.020364 [错误] 执行命令 [app-deploy] - [RunPostDeployHooks] 期间发生错误。停止运行命令。错误:命令 .platform/hooks/postdeploy/01_myconf.config 失败,错误 fork/exec .platform/hooks/postdeploy/01_myconf.config: 权限被拒绝
  • @OmeneJosephOgheneruno 嗨。 01_myconf.config 应该重命名为01_myconf.sh,它应该是可执行的(chmod +x 01_myconf.sh),也是普通的 bash 脚本。仅重复使用您在 Amazon Linux 1 中使用的相同 01_myconf.config 文件是不够的。必须为 Amazon Llinux 2 重写它。我添加了有关如何从 Amazon Linux 1 迁移到 Amazon Linux 2 的答案的链接。
  • 这是我现在的脚本 sudo su
  • @OmeneJosephOgheneruno 如果您使用所有新细节更新或提出新问题,也许会更好。很难理解您的设置的新状态是什么以及新的问题是什么。另外,如果我的回答有任何帮助,我们将不胜感激。
  • 感谢您的回答。如果您能提供进一步的指导,我将不胜感激。我的命令没有执行。
【解决方案2】:

在您的项目根文件夹中创建一个名为 .platform 的文件夹,并在 .platform 文件夹中创建一个名为 00_myconf.config 的文件。

.platform/
          00_myconf.config

打开 00_myconf.config 并添加脚本

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/91_post_deploy_script.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      sudo mkdir /var/testing1
      sudo ln -sfn /var/www/html/php.conf.example /etc/nginx/conf.d/elasticbeanstalk/php.conf
      sudo mkdir /var/testing
      sudo nginx -s reload

提交您的更改或重新上传项目。在创建每个新实例时都会考虑这个 .platform 文件夹,并且您的应用程序将在 Amazon Elastic beanstalk 创建的所有新实例中正确部署。

【讨论】:

  • 可能是用户可能无权执行命令。你能检查一下日志,看看哪一行命令执行失败
  • 我实际上不确定在哪里可以看到与此相关的日志。另外,我假设命令以 root 身份运行
  • 您可以从 Elastic Beanstalk 环境仪表板中找到日志
  • 它不存在。我检查了好几次。
  • @OmeneJosephOgheneruno 他们在那里,查看左侧边栏
【解决方案3】:

如果您访问文档here 并滚动到标题为“带扩展的应用程序示例”的部分,您可以看到 .platform 文件夹的文件夹结构示例,因此它会将您的自定义配置添加到每个 NGINX conf部署。

您可以将整个 nginx.conf 文件替换为您的文件,也可以将其他配置文件添加到 conf.d 目录

在应用部署时将 conf 文件替换为您的文件: .platform/nginx/nginx.conf

在 nginx.conf 中添加配置文件: .platform/nginx/conf.d/custom.conf

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 2012-11-13
    • 2016-02-27
    • 2015-04-19
    • 2022-12-05
    • 2022-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多