65.9K
CodeProject 正在变化。 阅读更多。
Home

将多个 Web 应用部署到 Elastic Beanstalk

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2017 年 4 月 20 日

CPOL

4分钟阅读

viewsIcon

21745

downloadIcon

159

将 ASP.NET Core 和 MVC 应用部署到同一个 Beanstalk 服务器

引言

在我的组织中,我们通常将单个 Web 应用安装到单个 AWS Elastic Beanstalk 服务器上,并且该 Web 应用位于根目录 [默认网站],URL 最终为http://instancename。我们希望将多个应用部署到同一台服务器上,从而实现http://instancename/app1http://instancename/app2等。

Amazon 的博客:https://aws.amazon.com/blogs/developer/multiple-application-support-for-net-and-elastic-beanstalk/ 展示了“amazing front end”和“amazing admin”网站的示例截图,但没有提供示例代码。我将展示一个 ASP.NET Core 和经典的 ASP.NET MVC 网站,部署到同一个 Amazon 实例名称,并提供可用的示例代码。

Using the Code

请参阅下面的“要点”中的先决条件。

运行 Visual Studio 2015。

新建 Web 项目,.NET Core,创建名为“core”的应用程序,并保存到桌面文件夹。

运行 Visual Studio 开发人员命令提示符。

C:\Users\username\Desktop\Core\CoreApp\src\CoreApp>dotnet run coreapp

在我的浏览器中访问 https://:5000,以验证其是否正常工作。

右键单击,然后部署到我的 EB 实例,地址为 http://instancename.us-east-1.elasticbeanstalk.com/core

验证其是否正常工作。

创建一个新的 ASP 应用,使用在线模板“动态 MVC”,添加到桌面文件夹“Asp”。

右键单击,然后部署到我的 EB 实例,地址为 http://instancename.us-east-1.elasticbeanstalk.com/asp

验证其是否正常工作。

Amazon 的示例建议部署 .NET Core 应用,并“带上”关联的 ASP.NET 应用。因此,我选择 core 应用作为要部署的“父项目”,而 ASP 应用作为“子项目”。

默认的 Visual Studio 部署行为会尝试部署一个带有 URL 重写部分的全局 Web.config。以下步骤将覆盖此行为。

通过右键单击 Visual Studio 中的项目名称,选择“卸载”,然后再次右键单击并选择“编辑项目”来卸载每个项目。在您看到的第一个<PropertyGroup>中,插入以下行。您可以参考随附的应用程序 csproj 原始 XML,了解示例应用中是如何实现的。

  <DeployIISAppPath>Default Web Site/sitename</DeployIISAppPath>

根据文章,添加清单。

向 Core csproj 的*根*目录添加一个名为“aws-windows-deployment-manifest.json”的 JSON 格式文件。.NET Core 部分,Core,将在第一个部分“aspNetCoreWeb”中指定。经典的 ASP 部分,Asp,将在 msDeploy 部分以 zip 文件格式指定。我的清单,与 Amazon 的示例类似,在随附的示例应用程序中,如下所示。有关更多清单信息,请查阅其网站:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/dotnet-manifest.html

{
  "manifestVersion": 1,
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "Core",
        "parameters": {
          "appBundle": "./Core",
          "iisPath": "/Core"
        }
      }
    ],

    "msDeploy": [
      {
        "name": "Asp",
        "parameters": {
          "appBundle": "AspApp.zip",
          "iisPath": "/Asp"
        }
      }
    ]
  }
}

按照文章中的描述制作 PowerShell。创建一个*.ps1*文件,如下所示。在我的示例中,为了便于管理,我将*.ps1*文件添加到“core”项目中,但这并非必需。完成所有工作后,我将把所有文件添加到源代码管理中,所以为什么不把部署脚本与您要部署的解决方案放在一起呢?

转到 .NET Core 网站在源树中的目录,进行 dotnet publish。

set-location C:\Users\username\Desktop\Core\CoreApp\src\CoreApp

$publishFolder = "c:\temp\publish"

$publishWorkspace = [System.IO.Path]::Combine($publishFolder, "workspace")

If (Test-Path $publishWorkspace){
       Remove-Item $publishWorkspace -Confirm:$false -Force
}

$appBundle = [System.IO.Path]::Combine($publishFolder, "app-bundle.zip")

If (Test-Path $appBundle){
       Remove-Item $appBundle -Confirm:$false -Force
}

执行 dotnet publish。

Write-Host 'Publish the ASP.NET Core frontend' 

$publishFrontendFolder = [System.IO.Path]::Combine($publishWorkspace, "Core")

write-host $publishFrontendFolder

dotnet publish .\project.json -o $publishFrontendFolder -c Release

MSBuild 为 Asp 创建了 zip 包。请注意指定的路径相对于 Core 项目目录。让我们面对现实。在一个组织中,您很有可能将各种网站解决方案放在源树的不同位置;很少有将所有要部署到公共服务器的网站都包含在同一个解决方案中。因此,只需根据需要添加适量的*..\..\*来引用其他要发布的网站即可。

Write-Host 'Create msdeploy archive for Asp'

msbuild   ..\..\..\Desktop\Core\CoreApp\src\CoreApp.csproj 
/t:package /p:Configuration=Release

Copy-Item ..\..\..\Desktop\Core\CoreApp\obj\Release\Package\Asp.zip $publishWorkspace

我们创建的项目清单将与我们从 dotnet publish 和 msbuild 生成的两个 zip 文件一起复制到*publish*文件夹中。

Write-Host 'Copy deployment manifest'

Copy-Item .\aws-windows-deployment-manifest.json $publishWorkspace

Write-Host 'Zipping up publish workspace to create app bundle'

Add-Type -assembly "system.io.compression.filesystem"

[io.compression.zipfile]::CreateFromDirectory( $publishWorkspace, $appBundle)

Amazon 展示了更多 PowerShell 步骤来自动化我们即将部署的 zip 文件的部署。但是,您也可以手动部署您刚刚制作的 zip 文件。

登录到您的 Amazon 控制台,https://yourname.signin.aws.amazon.com/console

在“**所有服务**”部分,点击“**Elastic Beanstalk**”,然后导航到您的目标服务器。在“**概述**”部分,点击“**上传和部署**”按钮,选择您的*app-bundle.zip*,然后部署。

关注点

重要的先决条件,我吃过亏才明白:从 AWS 实例上一个完全干净的 IIS 安装开始。如果您的服务器上已安装了一些应用,没问题:只需确保根目录:“默认网站”或“*c:\inetpub\wwwroot*”上没有 Web 应用即可。

如果您在 Visual Studio 中右键单击一个 Web 应用并将其发布到 Elastic Beanstalk,作为您 AWS 实例上的默认网站,它会将您的代码放入此默认网站。如果您接着在*instancename\site1*上安装另一个应用,您会收到一个误导性的错误消息,提示您的 Web.config 中有重复的脚本处理程序节。

在解决此问题的过程中,并与 Amazon 支持部门沟通我的进展时,他们承认“amazing front end”确实只是一个截图。我向他们提供了随附的源代码,供他们在在线帮助/文档中使用,他们很喜欢,并可能会发布!您可以说您是*在这里*第一次看到的!:)

历史

  • 2017 年 4 月 19 日:初次修订
© . All rights reserved.