首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于权限原因,AWS代码部署失败脚本

由于权限原因,AWS代码部署失败脚本
EN

Stack Overflow用户
提问于 2015-10-13 16:51:39
回答 4查看 9.6K关注 0票数 8

我试图在部署AWS代码部署时运行几个脚本,但由于没有运行脚本的权限,它们从未运行过。

这是我的appspec.yml文件:

代码语言:javascript
复制
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

与应用程序一起部署码部署-脚本文件夹,并且我在文件夹上设置的权限没有设置。文件夹上的权限总是被重置为:

代码语言:javascript
复制
[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
...

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

代码语言:javascript
复制
[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文件夹应该有777个权限,但它从来没有。

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

代码语言:javascript
复制
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.

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-13 17:54:48

代理直接从提取的归档包执行脚本,而不是从您可能使用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
EN

Stack Overflow用户

发布于 2016-01-09 20:31:51

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

仔细看看日志:

代码语言:javascript
复制
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脚本不是可执行的,而是“尝试使其可执行”。如果我们查看相关代码部署代理代码,您将看到代理将chmod +x脚本本身。

当您将脚本设置为可执行时,您只会沉默此警告,并且它不应该影响任何其他内容。回顾一下L106中的代码,如果代理无法使脚本可执行,您就会在日志中看到一个错误。

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

代码语言:javascript
复制
  permissions:
    - object: /var/www/html/codedeploy-scripts
      owner: root
      mode: 777
      type:
        - directory

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

codedeploy-scripts下的所有脚本都是"file“类型(而不是”目录“),这就是为什么没有设置它们的权限,并且权限只适用于您指定的目录下的文件,这就是为什么没有设置对codedeploy-scripts目录的权限。

下面是appspec.yml权限的type选项的描述,来自AWS文档

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

票数 6
EN

Stack Overflow用户

发布于 2018-01-22 20:06:34

我想详述一下乔纳森·图皮提到的一个问题,它会造成一个非常奇怪的情况。

ApplicationStop上的文档

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

现在想象一下这种情况:

  1. 使用拙劣的ApplicationStop脚本权限部署了一个修订版。部署仍然进行得很好,因为使用了以前的版本。
  2. 一个新的修订版被推入并失败了ApplicationStop步骤(因为现在它试图执行步骤1中的拙劣脚本)。
  3. 您注意到您的错误,修复代码,发布一个新的修订,但它仍然失败与相同的错误!

此时,不可能通过部署新代码来修复错误。你只有两个选择:

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

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

1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33108309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档