如何将应用程序池分配给不同的ASP.Net Core网站在AWS Elastic Beanstalk?



我们有两个ASP。. Net Core 3.1网站(具有不同的域名/主机头)部署在运行Windows 2019核心服务器和IIS的Elastic Beanstalk中。我们可以这样做https://aws.amazon.com/blogs/developer/multi-app-support-with-custom-domains-for-net-and-aws-elastic-beanstalk/

然而,这两个网站都在"DefaultAppPool"下运行。ASP。Net Core不允许每个应用程序池中有多个应用程序。. NET Core不支持同一个应用池中的多个应用)。

因此,我们将以下部分添加到aws-windows-deployment-manifest.json
"iisConfig": {
"appPools": [
{
"name": "AppPool1",
"managedPipelineMode": "Integrated",
"managedRuntimeVersion": "v4.0"
},
{
"name": "AppPool2",
"managedPipelineMode": "Integrated",
"managedRuntimeVersion": "v4.0"
}
]
}

并且,EB部署在IIS中创建了相应的应用池。

现在,我们无法将应用程序池分配给每个网站。理想情况下,我们希望在'install*中使用来自WebAdministration模块(https://learn.microsoft.com/en-us/powershell/module/webadministration/?view=windowsserver2019-ps)的命令。ps1' PowerShell脚本或在一个'。配置' file in '。ebextensions"文件夹中。但是,web管理模块在这两个地方都不可用IMPORT-MODULE WebAdministration也不行。在"install*"时,只有IISAdministration模块(https://learn.microsoft.com/en-us/powershell/module/iisadministration/?view=windowsserver2019-ps)可用。执行Ps1的脚本。

那么,如何将应用程序池分配给不同的ASP。Net Core网站在AWS Elastic Beanstalk?

非常简单的文档(适用于Windows Server)秘方隐藏在https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html

所以,对我们来说,下面的策略是有效的。我们在appool中增加了以下内容配置(名称不重要,只要它有。Config扩展名)文件到。ebeextensions

files:
"c:/Program Files/Amazon/ElasticBeanstalk/hooks/appdeploy/post/config.ps1":
content: |
Start-IISCommitDelay
$site = Get-IISSite "site1"
$site.Applications["/"].ApplicationPoolName = "AppPool1"
$site = Get-IISSite "site2"
$site.Applications["/"].ApplicationPoolName = "AppPool2"
Stop-IISCommitDelay

这在c:/Program Files/Amazon/ElasticBeanstalk/hooks/appdeploy/post/文件夹中创建了一个powershell脚本config.ps1。powershell脚本在创建新实例或部署新版本后执行。

唯一的缺点是每次在现有实例上部署新版本时都会创建config.ps1。旧文件被重命名为config.ps1.bak,并被EB部署过程忽略。这里肯定有改进的余地(将推迟一天)。

为了完整起见,这里是整个aws-windows-deployment-manifest.json

{
"manifestVersion": 1,
"iisConfig": {
"appPools": [
{
"name": "AppPool1",
"managedPipelineMode": "Integrated",
"managedRuntimeVersion": "v4.0"
},
{
"name": "AppPool2",
"managedPipelineMode": "Integrated",
"managedRuntimeVersion": "v4.0"
}
]
},
"deployments": {
"custom": [
{
"name": "site1",        
"scripts": {
"install": {
"file": "install1.ps1"
},
"restart": {
"file": "restart.ps1"
},
"uninstall": {
"file": "uninstall1.ps1"
}
}
},
{
"name": "site2",        
"scripts": {
"install": {
"file": "install2.ps1"
},
"restart": {
"file": "restart.ps1"
},
"uninstall": {
"file": "uninstall2.ps1"
}
}
}  
]
}
}

And Here'sinstall1.ps1

Copy-Item -Path "C:stagingsite1" -Destination "C:inetpub" -Recurse -Force
New-IISSite -Name "site1" -BindingInformation "*:80:*.site1.com" -PhysicalPath "C:inetpubsite1" -Force

uninstall1.ps1

Remove-IISSite -Name "site1" -Confirm:$False
rm -r "c:inetpubsite1" -Force

restart.ps1

iisreset /timeout:1

install2.ps1uninstall2.ps1与上面的site1相似。

我们在网上参考了很多文章,并且欠他们一个Thank You

在manifest文件中定义appPools之后,你可以使用它们的appPool属性将它们分配给你的应用程序:

{
"manifestVersion": 1,
"iisConfig": {
"appPools": [
{
"name": "AppPool1",
"managedPipelineMode": "Integrated",
"managedRuntimeVersion": "v4.0"
},
{
"name": "AppPool2",
"managedPipelineMode": "Integrated",
"managedRuntimeVersion": "v4.0"
}
]
},
"deployments": {
"aspNetCoreWeb": [
{
"name": "frontend",
"parameters": {
"appBundle": "./frontend",
"iisPath": "/frontend",
"appPool": "AppPool1"
}
},
{
"name": "ext-api",
"parameters": {
"appBundle": "./ext-api",
"iisPath": "/ext-api",
"appPool": "AppPool2"
}
}
]
}
}

最新更新