Развертывание AWS codedeploy выбрасывается [stderr] Не удалось открыть входной файл при попытке вызвать файл php из файла sh на этапе afterInstall

В файле appspec я определил следующее:

hooks:
  AfterInstall:
    - location: afterInstall.sh 

Ниже приводится содержимое afterInstall.sh (я пытаюсь вызвать файл php из файла sh) -

php afterInstall.php

Оба файла afterInstall.sh и afterInstall.php находятся на одном уровне (внешнем уровне) в zip-архиве, который я загружаю на S3 -

appspec.yml
afterInstall.sh
afterInstall.php

Я получаю следующую ошибку -

Error Code         ScriptFailed
Script Name        afterInstall.sh
Message            Script at specified location: afterInstall.sh failed with exit code 1

Log Tail          LifecycleEvent - AfterInstall
                  Script - afterInstall.sh
                  [stderr]Could not open input file: afterInstall.php

Я также попытался добавить следующее в раздел разрешений файла apppsec:

permissions:
  - object: .
    pattern: "**"
    owner: sandeepan
    group: sandeepan
    mode: 777
    type:
      - file

Примечание. У меня есть учетные данные для экземпляров развертывания, использующих пользователя sandeepan.

Я немного смущен тем, что именно делает раздел разрешений. Из http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref-permissions.html,

В разделе разрешений указывается, как специальные разрешения, если таковые имеются, должны применяться к файлам и каталогам / папкам в разделе файлов после их копирования в экземпляр.

Я также попытался указать владельца / группу как root / root и runas: root против ловушки afterInstall, но все равно получал ту же ошибку.

Обновить

Я также попытался указать файл afterInstall.php в разделе файлов и убедиться, что его права и права собственности верны -

  - source: afterInstall.php
    destination: /var/cake_1.2.0.6311-beta

На /var/cake_1.2.0.6311-beta -

-rwxrwxr-x  1 sandeepan sandeepan   26 Aug  1 08:55 afterInstall.php

Я не знаю, что еще нужно сделать, чтобы это исправить.

Примечание. Я могу успешно выполнить развертывание, если не вызываю файл php из afterInstall.sh


person Sandeepan Nath    schedule 27.07.2016    source источник


Ответы (2)


Основная причина ошибки в том, что ссылка на файл php неверна. Ваш сценарий предполагает, что текущий рабочий каталог является папкой назначения или папкой архива развертывания.

Это разумное предположение, однако все это неверно. На моем сервере Ubuntu текущий рабочий каталог для вызова оболочки CodeDeploy на самом деле /opt/codedeploy-agent. Это объясняет, почему вы получаете ошибку «Не удалось открыть входной файл».

Поскольку вы находитесь в ловушке жизненного цикла afterInstall, все ваши файлы уже существуют в конечном месте назначения. Чтобы решить эту проблему, используйте путь, указанный в директиве destination: в файле afterInstall.sh:

#!/bin/bash
php /var/cake_1.2.0.6311-beta/afterInstall.php

Это позволит php найти правильный файл, и ваше развертывание будет успешно выполнено.

Обновление:

Если вы хотите запустить файл в ловушке beforeInstall, файл должен уже существовать в системе, и на него следует ссылаться по фиксированному пути, например /tools.

Это можно сделать одним из следующих способов:

  1. Используйте сценарий user-data, чтобы загрузить сценарий во время запуска экземпляра, или
  2. «Запекание» скрипта в образ AMI и запуск из этого образа.

В любом случае ловушка beforeInstall может затем вызвать сценарий со своего фиксированного пути, например, php /tools/beforeInstall.php.

В этих случаях я предпочитаю вариант 1. Мы поддерживаем корзину S3 с этими типами ресурсов, которые затем хранятся на S3 и загружаются в каждый экземпляр во время запуска. Любые обновления отправляются на S3 и вызываются при каждом запуске нового экземпляра.

person Rodrigo M    schedule 02.08.2016
comment
Отлично, это решает проблему. Я не знаю, как мне не удалось заранее указать файл php в каталоге назначения. Теперь это отсортировано. Но как мне исправить ту же проблему в случае шага beforeInstall (запустите beforeInstall.php из beforeInstall.sh). Я тоже получаю ту же ошибку (не могу открыть файл). Упомянув файл beforeInstall.php в разделе файлов, скопировать его не получится, потому что копирование файла не происходит во время выполнения шага beforeInstall. Есть указатели? - person Sandeepan Nath; 02.08.2016
comment
Рад слышать. См. Мое обновление выше для обработки beforeInstall хуков. - person Rodrigo M; 02.08.2016
comment
Идеально. Хотя я еще не пробовал использовать сценарий, который загрузит сценарий beforeInstall.php с S3, наличие файла в фиксированном месте в экземплярах у меня сработало. Большое спасибо за такие четкие объяснения. - person Sandeepan Nath; 03.08.2016
comment
Посмотрите, можете ли вы также ответить на этот вопрос - stackoverflow.com/questions/38740298/ - person Sandeepan Nath; 03.08.2016

  • Запись объекта может быть каталогом или файлом, текущая настройка "." соответствует каталогу архива развертывания CodeDeploy, а не месту назначения, куда были скопированы сценарии. Так что, вероятно, вы можете попробовать использовать каталог назначения файла в качестве объекта.

  • А поскольку каталог архива развертывания CodeDeploy содержит все файлы из пакета клиента. Я не совсем уверен насчет вашего файлового каталога, но если все объекты внутри каталога архива развертывания являются каталогами, вероятно, тип файла можно изменить на каталог.

Раздел файла имеет следующую структуру, и в этом разделе указываются имена файлов, которые должны быть скопированы в экземпляр во время события Install развертывания.

files: - source: source-file-location destination: destination-file-location

Хотя секция ловушек имеет следующую структуру, секция ловушек файла AppSpec содержит сопоставления, которые связывают перехватчики событий жизненного цикла развертывания с одним или несколькими сценариями. Если перехватчик события отсутствует, то для этого события никакая операция не выполняется. Этот раздел требуется только в том случае, если вы будете запускать сценарии как часть развертывания.

hooks: deployment-lifecycle-event-name - location: script-location timeout: timeout-in-seconds runas: user-name

person binbinlu    schedule 29.07.2016
comment
В порядке. Затем я попытаюсь указать пункт назначения (полный путь) вместо.? Однако зачем тогда кому-то указывать каталог архива развертывания (с помощью.)? Кроме того, я изначально пытался не упоминать раздел разрешений, и в этом случае я также получал то же самое, не могу открыть ошибку входного файла. Есть указатели, чтобы это исправить? - person Sandeepan Nath; 31.07.2016
comment
Моя файловая структура такова, что все файлы сценария (указанные в хуках) расположены на корневом уровне, где это файл appspec.yml. Весь код находится внутри каталога / codebase. Дайте мне знать, если вам понадобится дополнительная информация. - person Sandeepan Nath; 01.08.2016
comment
Я снова запуталась. Вы имеете в виду, что мои файлы сценариев хуков (beforeInstall, afterInstall и т. Д.) Должны запускаться из целевой папки, то есть из того места, где развернуто мое приложение? - person Sandeepan Nath; 01.08.2016
comment
Кроме того, проверьте обновление вопроса, где я упомянул, что я обнаружил после перемещения файла afterInstall.php в каталог развертывания, чтобы иметь возможность проверить его разрешение / право собственности. - person Sandeepan Nath; 01.08.2016
comment
Не могли бы вы убедиться, что у sandeepan есть разрешение на скрипт, вызываемый afterInstall.sh? Все скрипты, запускаемые агентом хоста, должны принадлежать пользователю, указанному в спецификации приложений. - person binbinlu; 02.08.2016