【问题标题】:AWS Code Deploy Failing Scripts Due To PermissionsAWS Code Deploy 由于权限而失败的脚本
【发布时间】:2022-02-28 19:37:43
【问题描述】:

我在使用 AWS Code Deploy 进行部署时尝试运行一些脚本,但由于没有运行脚本的权限,它们从未运行。

这是我的 appspec.yml 文件:

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html
permissions:
  - object: /var/www/html/codedeploy-scripts
    owner: root
    mode: 777
    type:
      - directory
hooks:
  ApplicationStop:
    - location: codedeploy-scripts/application-stop
      timeout: 300
      runas: root
  BeforeInstall:
    - location: codedeploy-scripts/before-install
      timeout: 300
      runas: root
  AfterInstall:
    - location: codedeploy-scripts/after-install
      timeout: 600
      runas: root
  ApplicationStart:
    - location: codedeploy-scripts/application-start
      timeout: 300
      runas: root
  ValidateService:
    - location: codedeploy-scripts/validate-service
      timeout: 300
      runas: root

codedeploy-scripts 文件夹随应用程序一起部署,而我在该文件夹上设置的权限未设置。文件夹的权限总是被重置为:

[ec2-user@ip-10-0-8-181 html]$ ls -al
total 156
drwxrwsr-x  7 ec2-user www   4096 Oct 13 16:36 .
drwxrwsr-x  3 ec2-user www   4096 Oct 13 15:01 ..
-rw-rw-r--  1 ec2-user www    740 Oct 13 16:28 appspec.yml
drwxr-sr-x  2 ec2-user www   4096 Oct 13 16:36 codedeploy-scripts
...

文件夹中的文件似乎有可执行权限:

[ec2-user@ip-10-0-8-181 alio]$ ls -al codedeploy-scripts
total 28
drwxr-sr-x 2 ec2-user www 4096 Oct 13 16:36 .
drwxrwsr-x 7 ec2-user www 4096 Oct 13 16:36 ..
-rwxr-xr-x 1 ec2-user www  343 Oct 13 16:28 after-install
-rwxr-xr-x 1 ec2-user www   12 Oct 13 16:28 application-start
-rwxr-xr-x 1 ec2-user www   12 Oct 13 16:28 application-stop
-rwxr-xr-x 1 ec2-user www  889 Oct 13 16:28 before-install
-rwxr-xr-x 1 ec2-user www   12 Oct 13 16:28 validate-service

为什么不使用我在 appspec 文件中设置的权限部署代码。 codedeploy-scripts 文件夹应该有 777 权限,但它从来没有。

这是我在 /var/log/aws/codedeploy-agent/codedeploy-agent.log 中为每个脚本遇到的错误:

2015-10-13 16:36:23 WARN  [codedeploy-agent(9918)]: InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: codedeploy-scripts/validate-service is not executable.  Trying to make it executable.

任何帮助将不胜感激。

【问题讨论】:

    标签: amazon-web-services aws-code-deploy


    【解决方案1】:

    代理直接从提取的存档包中执行脚本,而不是从您可能使用files 部分复制它们的任意位置执行脚本。您需要在 S3 或 Git 存储库中的存档中设置执行位。

    你所拥有的是这样的:

    • 将所有文件复制到/var/www/html
    • 将目录对/var/www/html/codedeploy-scripts 内容的权限设置为777,而不是目录本身(参见appspec.yml reference)。这也会受到 umask 的影响,您可能正在设置 /etc/profile
    • 从存档根目录执行生命周期事件(发生时)的每个脚本。所以您的 ValidateSerivce 脚本是从 <deployment-archive-root>/codedeploy-scripts/validate-service 而不是从 /var/www/html/codedeploy-scripts/validate-service 运行的

    注意:ApplicationStop 是特殊的,因为它在下载新的新归档包之前运行。

    【讨论】:

    • 啊,是的,在 git 中设置执行命令解决了这个问题。谢谢!
    • 这太不明显了...但是很棒..谢谢:)
    • @gprime 在 git 中设置执行命令是什么意思?我面临的问题也可能与权限有关。这是 - stackoverflow.com/questions/38616547/…
    • @Sand确保您需要执行的文件在提交到 git 之前具有这些权限。 chmod 755 那些文件应该这样做。
    • 755 完全够了...,如果将 -root 文件夹放入与应用程序用户共享的 CI 组,则为 750。
    【解决方案2】:

    如果没有更多详细信息,我将无法说明为什么将您的脚本设置为可执行可以解决您的问题,但除了您看到的日志语句之外,接受的答案不应该解决任何问题。

    仔细查看日志:

    2015-10-13 16:36:23 WARN  [codedeploy-agent(9918)]: InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: codedeploy-scripts/validate-service is not executable.  Trying to make it executable.
    

    这只是一个警告,而不是错误。 Code Deploy 代理注意到您的 validate_service.sh 脚本不可执行,并且正在“尝试使其可执行”。如果我们查看relevant Code Deploy agent code,您会看到代理将chmod +x 脚本本身。

    当您将脚本设置为可执行时,您只是消除了此警告,它不应该影响其他任何事情。回顾 L106 中的 Code Deploy 代理代码,如果代理无法使您的脚本可执行,您会在日志中看到错误。

    要回答您关于权限的问题,您的 appspec.yml 配置错误。当你说:

      permissions:
        - object: /var/www/html/codedeploy-scripts
          owner: root
          mode: 777
          type:
            - directory
    

    您是在告诉 Code Deploy 将 /var/www/html/codedeploy-scripts 中所有“目录”类型的文件设置为具有权限 777

    codedeploy-scripts 下的所有脚本都是“文件”类型(不是“目录”),这就是未设置它们的权限的原因,并且权限仅适用于目录的文件您指定,这就是未设置 codedeploy-scripts 目录的权限的原因。

    这是来自the AWS docs 的appspec.yml 权限的type 选项的描述:

    类型——可选。要应用指定权限的对象类型。这可以设置为文件或目录。如果指定了文件,则权限将仅应用于复制操作后立即包含在对象中的文件(而不应用于对象本身)。如果指定了目录,则权限将递归地应用于复制操作后对象内任何位置的所有目录/文件夹(但不应用于对象本身)。

    【讨论】:

      【解决方案3】:

      我想详细谈谈 Jonathan Turpie 提到的一个问题,该问题可能会造成非常奇怪的情况。

      来自 ApplicationStop 上的文档:

      此部署生命周期事件甚至在下载应用程序修订之前发生。 ... 用于此部署生命周期事件的 AppSpec 文件和脚本来自先前成功部署的应用程序修订版。

      现在想象一下这种情况:

      1. 部署了具有拙劣 ApplicationStop 脚本权限的修订。由于使用了以前的版本,因此部署仍然顺利。
      2. 新修订被推送,但 ApplicationStop 步骤失败(因为现在它尝试执行步骤 1 中的拙劣脚本)。
      3. 您注意到自己的错误,修复代码,发布新修订版,但仍然失败并出现同样的错误!

      此时无法通过部署新代码来修复错误。你只有两个选择:

      1. 在部署设置中启用“忽略停止失败”(例如,使用 --ignore-application-stop-failures CLI 标志 [1])
      2. 手动修复之前成功部署的根目录中的文件权限。

      这涉及任何停止脚本失败,当然不仅仅是权限。

      [1]https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html

      【讨论】:

        【解决方案4】:

        解决权限问题:

        希望您位于所有脚本 .sh 文件所在的根目录中:

        1. chmod +x ./*.sh

        这使得所有 .sh 文件都可执行

        1. 添加一些脚本 change_permissions.sh 并在文件中添加以下内容:
        #!/bin/bash
        chmod -R 777 /var/www/html/
        

        这将授予您的目标文件夹 - /var/www/html/ 可执行权限。

        1. 最后asspec.yml文件添加如下:
          BeforeInstall:
          - location: change_permissions.sh
            timeout: 6
            runas: root
        

        这将在您的 ec2 实例中运行时将可执行权限应用于文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多