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

gpr*_*ime 7 amazon-web-services aws-code-deploy

我试图同时使用AWS代码部署部署到运行几个剧本,但他们从来没有因为没有权限运行脚本运行.

这是我的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
Run Code Online (Sandbox Code Playgroud)

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
...
Run Code Online (Sandbox Code Playgroud)

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

[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
Run Code Online (Sandbox Code Playgroud)

为什么不使用我在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.
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

Jon*_*pie 6

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

你拥有的是这样的:

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

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


小智 6

没有更多细节,我将无法解释为什么将您的脚本设置为可执行文件可以解决您的问题,但是除了您看到的日志语句之外,可接受的答案应该没有解决任何其他问题。

仔细看看日志:

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.
Run Code Online (Sandbox Code Playgroud)

这只是警告,不是错误。Code Deploy代理注意到您的validate_service.sh脚本不可执行,并且是“ 试图使其可执行”。如果我们查看相关的Code Deploy代理代码,您将看到该代理将chmod +x自己编写脚本。

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

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

  permissions:
    - object: /var/www/html/codedeploy-scripts
      owner: root
      mode: 777
      type:
        - directory
Run Code Online (Sandbox Code Playgroud)

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

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

这是AWS docs中对appspec.yml权限type选项的描述:

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