O AWS CodeDeploy Powershell Script falha na execução

2

Eu tenho um aplicativo que estou implantando usando o AWS Codedeploy para uma instância do EC2 que executa o Windows Server 2012 R2 com implantação de código instalada. O Codedeploy é instalado na instância usando o modelo recomendado do CloudFormation e tem funcionado bem até agora.

Eu criei um script simples que deve criar uma pasta no sistema de arquivos e um diretório virtual no IIS no site padrão, o script está abaixo:

# Are you running in 32-bit mode?
#   (\SysWOW64\ = 32-bit mode)

if ($PSHOME -like "*SysWOW64*")
{
  Write-Warning "Restarting this script under 64-bit Windows PowerShell."

  # Restart this script under 64-bit Windows PowerShell.
  #   (\SysNative\ redirects to \System32\ for 64-bit mode)

  & (Join-Path ($PSHOME -replace "SysWOW64", "SysNative") powershell.exe) -File '
    (Join-Path $PSScriptRoot $MyInvocation.MyCommand) @args

  # Exit 32-bit script.

  Exit $LastExitCode
}

# Was restart successful?
Write-Warning "Hello from $PSHOME"
Write-Warning "  (\SysWOW64\ = 32-bit mode, \System32\ = 64-bit mode)"
Write-Warning "Original arguments (if any): $args"

# Your 64-bit script code follows here...

# Install IIS Web Server administrator
Import-Module -Name ServerManager
Import-Module WebAdministration
Install-WindowsFeature Web-Server

$folderLoc = 'C:\inetpub\imageprocessorcache'

if (-not (Test-Path $folderLoc))
{
    # Create new folder
    New-Item $folderLoc -type directory

    # Get rule and add new rule to it
    $existingAcl = Get-Acl $folderLoc
    $permissions = 'Users', 'FullControl', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
    $rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permissions
    $existingAcl.AddAccessRule($rule)

    # Apply new rule to the folder
    $existingAcl | Set-Acl -Path $folderLoc

    # Get the ACL for the folder for output purposes
    Get-Acl -Path $folderLoc
}

$virtualPathLocation = 'IIS:\Sites\Default Web Site\imageprocessorcache'

# Check if the virtual directory exists in IIS
if (-not (Test-Path $virtualPathLocation))
{
    # Create it because it doesn't exist yet
    New-WebVirtualDirectory -Name 'imageprocessorcache' -PhysicalPath $folderLoc -Site 'Default Web Site'
}

Aqui está o arquivo appspec que eu tenho:

version: 0.0
os: windows
files:
  - source: MyWebsite
    destination: c:\temp\CodeDeployFiles
hooks:
  BeforeInstall:
    - location: \Deployment Scripts\IISCreateImageProcessorVirtualDirectory.ps1
      timeout: 900

Por algum motivo, o script não é executado como parte do processo de implantação, parece que é ignorado ou simplesmente falha silenciosamente.

Eu posso acessar a área de trabalho remota, navegar até a pasta temporária na instância do EC2 (para onde os arquivos são copiados durante a implantação pelo CodeDeploy) e clicar com o botão direito do mouse em IISCreateImageProcessorVirtualDirectory.ps1 e escolher 'Executar com PowerShell' na cópia roteiro. Isso funciona bem, a pasta e o diretório virtual são criados.

Eu tive sucesso executando .ps1 scripts no passado usando o código deploy com a minha configuração atual, mas este não funciona ou deixa mensagens de erro.

O que poderia estar causando a execução do script?

Obrigado pela sua ajuda.

Codedeploy Log com erro

[2016-11-24 21:10:54.909] [d-DSQ9EQ28J]Script - .\Powershell Scripts\IISCreateImageProcessorVirtualDirectory.ps1
[2016-11-24 21:10:55.112] [d-DSQ9EQ28J][stderr]Processing -File 'C:\ProgramData/Amazon/CodeDeploy/c979dfe5-9d99-4cee-870d-cc9e3cb518bc/d-DSQ9EQ28J/deployment-archive/.\Powershell' failed because the file does not have a '.ps1' extension. Specify a valid Windows PowerShell script file name, and then try again.
    
por Luke 23.11.2016 / 23:36

2 respostas

2

É assim que o agente CodeDeploy executa seu script ( fonte ):

powershell.exe -ExecutionPolicy Bypass -File <absolute_path_to_your_script_here>

Então, tente mudar seu gancho para isso:

hooks:
  BeforeInstall:
    - location: .\Deployment Scripts\IISCreateImageProcessorVirtualDirectory.ps1
      timeout: 900

O operador .\ permite que você execute um script no diretório atual .

Solução de problemas gerais

Se você precisar solucionar problemas adicionais, poderá encontrar suas implementações recentes aqui: C:\ProgramData\Amazon\CodeDeploy\

E seus registros por implantação aqui: C:\ProgramData\Amazon\CodeDeploy\DEPLOYMENTGROUPIDGOESHERE\DEPLOYMENTIDGOESHERE\logs

Você pode escrever para o host ou stdout / stderr em seus scripts e, se eles estiverem sendo executados, a saída terminará nesses logs.

    
por 24.11.2016 / 01:49
1

Eu finalmente consegui que meus scripts do Powershell fossem executados pelo CodeDeploy mais uma vez. Parece que me dei os problemas colocando os scripts ps1 em uma pasta dentro do meu pacote de implantação e não na raiz com meu arquivo appspec.yml .

Acho que pode ser algo relacionado a uma mensagem que li quando li o arquivo de ajuda do powershell.exe executando powershell.exe /? :

-File
Runs the specified script in the local scope ("dot-sourced"), so that the functions and variables that the script creates are available in the current session. Enter the script file path and any parameters. File must be the last parameter in the command, because all characters typed after the File parameter name are interpreted as the script file path followed by the script parameters.

    
por 24.11.2016 / 22:21