Использование CodeDeploy для развертывания в экземпляре EC2 - PullRequest
0 голосов
/ 21 октября 2019

У меня есть базовый AMI для Windows Server 2016 на AWS, который я собираю для развертывания CodeDeploy. Я использую интерфейс командной строки для развертывания основного веб-сайта asp.net из github в этот экземпляр EC2.

aws deploy create-deployment --application-name my-App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name App-DepGrp --description "My GitHub deployment demo" --github-location repository=xxx-yyy/aws,commitId=d2c7cfcf90sfsfd2c7cfcfgs9e1e0f50eshshsgsgd2c7cfcfd2c7cgbsfgsbg

Развертывание начинается, и appspec вызывает файл Install.ps1, который отправляется исоздает папку, вызванную командой file в файле сценария powershell. Сайт не создается. Пул приложений также не создается. Вот как выглядит мой файл Appspec.yml:

version: 0.0
os: windows
files:
  - source: \
    destination: c:\website-dropfolder
hooks:
 ApplicationStart:
    - location: .\Install.ps1
      timeout: 300
      runas: Administrator

Это Install.ps1

# Create folder to publish binaries from drop folder
mkdir c:\website-published

# Switch to drop folder
Set-Location C:\website-dropfolder   

# Restore the nuget references
& "C:\Program Files\dotnet\dotnet.exe" restore  

# Publish application with all of its dependencies and runtime for IIS to use
& "C:\Program Files\dotnet\dotnet.exe" publish --configuration release -o c:\website-published --runtime active  

# Create an IIS website and point it to the published folder
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command {Import-Module WebAdministration; New-WebSite -Name CoreWebsite -Port 80 -HostHeader CoreWebsite -PhysicalPath "$env:systemdrive\website-published"}


# Create AppPool for website and set CLR version to core-dotnet
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command {Import-Module WebAdministration; New-WebAppPool CoreWebsiteAppPool}

C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell. exe -Command {Import-Module WebAdministration;Set-ItemProperty IIS: \ AppPools \ CoreWebsiteAppPool managedRuntimeVersion "" -verbose}

Я поставил -ErrorAction SilentlyContinue на случай, если возникнут какие-либо проблемы с восстановлением или публикацией dotnet. Что приводит к тому, что сайт не создается? Я запустил те же сценарии на своем компьютере с Windows 10 dev, и веб-сайт был создан с пулом приложений и даже установил его версию CLR. То же самое не работает на Windows Server 2016?

РЕДАКТИРОВАТЬ

Я посмотрел журналы данных пользователя, и кажется, что с этой строки происходит ошибка:New-WebSite -Name CoreWebsite -Port 80 -HostHeader CoreWebsite -PhysicalPath "$env:systemdrive\website-published" -ErrorAction SilentlyContinue

Ошибка:

System.Management.Automation.PSCustomObjectSystem.Object1Подготовка модулей для первого использования.0-1-1Completed-1 New-WebSite: не удается получить динамическийпараметры для командлета. _x000D__x000A_Retrieving СОМ фабрику классов для компонента с CLSID {_x000D__x000A_ 688EEEE5-6A7E-422F-B2E1-6AF00DC944A6} не удалось из-за ошибки: _x000D__x000A_80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 _x000D__x000A_ (REGDB_E_CLASSNOTREG)) ._ x000D__x000A_At линии: 1 полукокса:34_x000D__x000A_ + ... регистрация;New-WebSite -Name CoreWebsite -Port 80 -HostHeader CoreWe ..._ x000D__x000A _ +

Кажется, что команды powershell не работают, когда они вызываются агентом codedeploy даже при мысли, что он запускается как администратор, но когда я вручную запускаю файл сценария в командной строке powershell, он работает как положено. Я даже указал путь к исполняемому файлу powershell, который нужно вызвать, чтобы он не использовал тот, который находится в папке C:\Windows\SysWOW64. Даже это не работает. Есть идеи?

1 Ответ

0 голосов
/ 21 октября 2019

Из общего сообщения об ошибке:

"Исключение из HRESULT: 0x80040154 _x000D__x000A_ (REGDB_E_CLASSNOTREG)" *

... мне кажется, что CodeDeploy выполняетPS скрипт в 32 битном режиме вместо 64 битного. Эта проблема часто упоминается в документах AWS [1].

Можете ли вы изменить сценарий PowerShell, как указано в [1], следующим образом:

# 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...
# ...

Ссылка:

[0] http://kino505.blogspot.com/2016/12/aws-codedeploy-windows-3264-bit.html

[1] Устранение неполадок при развертывании в EC2 / локальных средах. Скриптам Windows PowerShell по умолчанию не удается использовать 64-разрядную версию Windows PowerShell - https://docs.aws.amazon.com/codedeploy/latest/userguide/troubleshooting-deployments.html#troubleshooting-deployments-powershell

...