2015-10-13 8 views
5

Sto tentando di eseguire alcuni script durante la distribuzione utilizzando AWS Code Deploy, ma non vengono mai eseguiti perché non dispongono delle autorizzazioni per eseguire gli script.Il codice AWS distribuisce gli script non riusciti a causa delle autorizzazioni

Ecco il mio file 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 

I codedeploy-cartella Scripts vengono distribuiti con l'applicazione e i permessi ho impostato per la cartella non ottiene impostato. Le autorizzazioni per la cartella vengono sempre ripristinate:

[[email protected] 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 
... 

i file nella cartella sembrano avere diritti eseguibili:

[[email protected] 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 

Perché non ottenere il codice distribuito con le autorizzazioni ho impostato nel file appspec. La cartella codedeploy-scripts dovrebbe avere 777 permessi ma non lo fa mai.

Questo è l'errore che ottengo in /var/log/aws/codedeploy-agent/codedeploy-agent.log per ciascuno di questi script:

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. 

Qualsiasi aiuto sarebbe apprezzato.

risposta

6

L'agente sta eseguendo gli script direttamente dal pacchetto di archivio estratto non da eventuali luoghi arbitrari che potrebbero essere stati copiati utilizzando la sezione files. Dovrai impostare il bit di esecuzione nel tuo archivio in S3 o repository Git.

Quello che hai come è fa questo:

  • copiare tutti i file da /var/www/html.
  • Impostare le autorizzazioni sulla directory sul contenuto di /var/www/html/codedeploy-scripts su 777 ma non sulla directory stessa (vedere appspec.yml reference). Questo sarà anche influenzato da umask, che potresti impostare /etc/profile.
  • Eseguire ciascuno degli script per gli eventi del ciclo di vita (quando si verificano) dalla radice di archivio. Quindi lo script ValidateSerivce è in esecuzione da non <deployment-archive-root>/codedeploy-scripts/validate-service da /var/www/html/codedeploy-scripts/validate-service

Nota: ApplicationStop è speciale perché viene eseguito prima del nuovo nuovo bundle di archivio viene scaricato.

+0

ah, sì, impostando il comando di esecuzione in git risolto il problema. Grazie! – gprime

+0

questo non era così ovvio ... ma fantastico .. grazie :) –

+0

@gprime cosa intendi impostando il comando execute in git? Sto affrontando un problema che potrebbe anche essere correlato alle autorizzazioni. Eccolo: http://stackoverflow.com/questions/38616547/aws-codedeploy-deployment-throwing-stderr-could-not-open-input-file-at-after –

4

Senza ulteriori dettagli, non sarò in grado di parlare del motivo per cui l'impostazione degli script per essere eseguibile ha risolto il problema, ma la risposta accettata non avrebbe dovuto risolvere altro che l'istruzione del registro che si stava visualizzando.

Date un'occhiata più da vicino il registro:

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. 

E 'solo un avvertimento, non un errore. L'agente Code Deploy ha notato che lo script validate_service.sh non era eseguibile ed era "Tentativo di per renderlo eseguibile". Se guardiamo allo relevant Code Deploy agent code, vedremo che l'agente sarà lo chmod +x lo script stesso.

Quando si impostano gli script come eseguibili, è stato disattivato solo questo avviso e non avrebbe dovuto influire su altro.Guardando al codice dell'agente Code Deploy, in L106, se l'agente non era in grado di rendere eseguibile il tuo script avresti visto un errore nei tuoi log.

Per rispondere alla domanda sui permessi, si dispone di un appspec.yml errato. Quando si dice:

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

si sta dicendo Codice Deploy per impostare tutti i file di tipo "directory" all'interno /var/www/html/codedeploy-scripts disporre di autorizzazioni 777.

Tutti i vostri script sotto codedeploy-scripts sono tipi "file" (non "directory"), che è il motivo per cui i loro permessi non sono stati fissati, e le autorizzazioni si applicano solo ai file sotto la directory specificata, ed è per questo le autorizzazioni per la directory codedeploy-scripts non sono state impostate.

Ecco la descrizione della scelta del consenso appspec.yml type da the AWS docs:

tipo - opzionale. I tipi di oggetti per applicare le autorizzazioni specificate a. Questo può essere impostato su file o directory. Se il file è specificato, le autorizzazioni verranno applicate solo ai file contenuti immediatamente nell'oggetto dopo l'operazione di copia (e non all'oggetto stesso). Se viene specificata la directory, le autorizzazioni verranno applicate in modo ricorsivo a tutte le directory/cartelle che sono ovunque all'interno dell'oggetto dopo l'operazione di copia (ma non all'oggetto stesso).

0

Mi piacerebbe espandere un problema menzionato da Jonathan Turpie che può creare una situazione molto strana.

Dalla documentazione sulla ApplicationStop:

Questa distribuzione evento del ciclo di vita si verifica anche prima della revisione applicazione viene scaricata. ... Il file AppSpec e gli script utilizzati per questo evento del ciclo di vita della distribuzione provengono dalla precedente revisione dell'applicazione distribuita correttamente.

Ora immaginate questa situazione:

  1. Una revisione è stata schierata con i permessi di pasticciato ApplicationStop script. La distribuzione è comunque andata bene perché è stata utilizzata una versione precedente.
  2. Una nuova revisione viene inviata e non riesce il passaggio ApplicationStop (perché ora ha tentato di eseguire lo script mal riuscito dal punto 1).
  3. Si nota l'errore, si corregge il codice, si pubblica una nuova revisione, ma non riesce ancora con lo stesso errore!

A questo punto non è possibile correggere l'errore distribuendo nuovo codice. Hai solo due opzioni:

  1. Nelle impostazioni di distribuzione Attiva "Ignora Arrestare fallimenti" (ad esempio con la bandiera --ignore-application-stop-failures CLI [1])
  2. correggere manualmente i permessi dei file nella radice della precedente distribuzione corretta.

Ciò riguarda eventuali errori di arresto dello script, non solo le autorizzazioni, naturalmente.

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

Problemi correlati