由于权限,AWS代码部署失败的脚本

时间:2015-10-13 16:51:40

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

我在使用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.

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:6)

代理程序直接从解压缩的归档捆绑包中执行脚本,而不是使用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很特殊,因为它在下载新的归档包之前运行。

答案 1 :(得分:5)

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

仔细查看日志:

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.

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

当您将脚本设置为可执行时,您只会使此警告静音,并且不会影响其他任何内容。回顾一下代码部署代理程序代码,在L106中,如果代理程序无法使您的脚本可执行,那么您的日志中就会出现错误。

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

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

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

codedeploy-scripts下的所有脚本都是“文件”类型(不是“目录”),这就是为什么他们的权限没有设置,权限只适用于的文件您指定的目录,这就是未设置codedeploy-scripts目录上的权限的原因。

以下是来自the AWS docs的appspec.yml权限type选项的说明:

  

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

答案 2 :(得分:0)

我想扩展Jonathan Turpie提到的一个问题,这可能会造成一种非常奇怪的情况。

来自 ApplicationStop 的文档:

  

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

现在想象一下这种情况:

  1. 使用拙劣的ApplicationStop脚本权限部署了修订版。部署仍然很好,因为使用了以前的版本。
  2. 推送新修订版并使ApplicationStop步骤失败(因为现在它尝试执行步骤1中的拙劣脚本)。
  3. 你注意到你的错误,修复了代码,发布了一个新版本,但它仍然失败并出现同样的错误!
  4. 此时,无法通过部署新代码来修复错误。您只有两个选择:

    1. 在部署设置中启用&#34;忽略停止失败&#34; (例如,使用--ignore-application-stop-failures CLI标志[1])
    2. 在先前成功部署的根目录中手动修复文件权限。
    3. 这涉及任何停止脚本失败,当然不仅仅是权限。

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