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.