Elastic Beanstalk post install脚本执行IIS配置报错如何解决
报错核心是Elastic Beanstalk部署代理默认以32位进程执行postInstall脚本,而IIS的WebAdministration模块依赖的IIS管理COM组件仅注册了64位版本,32位PowerShell进程加载时直接触发80040154 类未注册错误,后续读取应用池属性返回空值引发连锁报错。hostname这类不依赖架构专属组件的简单命令不受影响,所以能正常执行。
另外现有脚本还有个隐性问题:Elastic Beanstalk部署.NET Core应用时不会使用默认的DefaultAppPool,会为每个应用创建独立同名应用池,硬编码修改DefaultAppPool的参数根本不会对实际运行业务的应用池生效。
方案1:直接用appcmd命令修改(最简便,零依赖)
不需要单独写PowerShell脚本,直接修改aws-windows-deployment-manifest.json,在postInstall阶段显式调用64位版本的IIS管理命令行工具直接修改配置,完全避开PowerShell模块的架构兼容问题:
{ "manifestVersion": 1, "deployments": { "aspNetCoreWeb": [ { "name": "my-dotnet-core-app", "scripts": { "postInstall": { "command": "C:\\Windows\\SysNative\\inetsrv\\appcmd.exe set apppool /apppool.name:\"my-dotnet-core-app\" /queueLength:3000" } } } ] } }
注意路径里的
SysNative是64位Windows给32位进程提供的系统目录别名,用这个路径可以绕过系统自动的32位目录重定向,确保调用到真正的64位版appcmd。命令里的my-dotnet-core-app替换成你manifest里定义的应用名即可,和EB自动创建的应用池名一致。
方案2:修复PowerShell脚本执行架构
如果需要保留PowerShell脚本做更复杂的配置,按以下两步修改:
- 修改manifest文件,显式调用64位PowerShell执行脚本,不要用
file字段默认调用(默认调用会走32位PowerShell):
{ "manifestVersion": 1, "deployments": { "aspNetCoreWeb": [ { "name": "my-dotnet-core-app", "scripts": { "postInstall": { "command": "C:\\Windows\\SysNative\\WindowsPowerShell\\v1.0\\powershell.exe -ExecutionPolicy Bypass -NonInteractive -NoProfile -File SetupScripts/setupAppPool.ps1" } } } ] } }
- 优化
setupAppPool.ps1脚本,增加64位进程兜底判断,同时修正应用池名硬编码问题:
# 兜底判断:如果当前是32位PowerShell进程,自动切换到64位进程重跑脚本 if ($env:PROCESSOR_ARCHITECTURE -ne "AMD64") { & "C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe" -File $MyInvocation.MyCommand.Path @args exit $LASTEXITCODE } Import-Module WebAdministration -ErrorAction Stop # 应用池名和manifest中定义的name字段保持一致,不要用DefaultAppPool $appPoolName = "my-dotnet-core-app" # 不想硬编码的话可以用下面的代码自动获取当前站点应用关联的应用池 # $targetApp = Get-WebApplication -Site "Default Web Site" -Name "/" # $appPoolName = $targetApp.applicationPool Write-Host "修改前应用池队列长度: $((Get-ItemProperty "IIS:\AppPools\$appPoolName").queueLength)" Set-ItemProperty -Path "IIS:\AppPools\$appPoolName" -Name queueLength -Value 3000 Write-Host "修改后应用池队列长度: $((Get-ItemProperty "IIS:\AppPools\$appPoolName").queueLength)"
不需要在脚本里手动执行iisreset,EB部署流程最后会自动完成IIS配置生效的相关操作。
内容的提问来源于stack exchange,提问作者Endri

