教程:使用 Elastic Beanstalk 部署 ASP.NET Core 应用程序 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:使用 Elastic Beanstalk 部署 ASP.NET Core 应用程序

在本教程中,您将逐步完成构建新的 ASP.NET Core 应用程序并将其部署到 Amazon Elastic Beanstalk的过程。

首先,您将使用 .NET Core 开发工具包的 dotnet 命令行工具生成基本命令行 .NET Core 应用程序、安装依赖项、编译代码并在本地运行应用程序。接下来,您将创建默认 Program.cs 类,并添加 ASP.NET Startup.cs 类和配置文件,以创建使用 ASP.NET 和 IIS 为 HTTP 请求提供服务的应用程序。

最后,Elastic Beanstalk 使用部署清单在一个服务器上配置 .NET Core 应用程序、自定义应用程序和多个 .NET Core 或 MSBuild 应用程序的部署。要将 .NET Core 应用程序部署到 Windows Server 环境,请使用部署清单将站点存档添加到应用程序源包。dotnet publish 命令生成已编译的类和依赖项,您可以将它们与 web.config 文件捆绑,以创建一个站点存档。部署清单告知 Elastic Beanstalk 站点应运行的路径且可用于配置应用程序池并在不同路径上运行多个应用程序。

源代码可在此处获得:dotnet-core-windows-tutorial.zip

先决条件

本教程使用 .NET Core 开发工具包生成基本 .NET Core 应用程序,在本地运行该应用程序,并构建可部署的软件包。

要求
  • .NET Core (x64) 1.0.1、2.0.0 或更高版本

安装 .NET Core 开发工具包
  1. microsoft.com/net/core 下载安装程序。选择 Windows。选择 Download .NET SDK(下载 .NET 开发工具包)。

  2. 运行安装程序并按说明操作。

本教程使用命令行 ZIP 实用工具创建一个源包,您可以将该源包部署到 Elastic Beanstalk。要在 Windows 中使用 zip 命令,您可以安装 UnxUtils,一个有用的命令行实用工具 (如 zipls) 的轻型集合。或者,可以使用 Windows 资源管理器或任何其他 ZIP 实用工具创建源包存档。

要安装 UnxUtils
  1. 下载 UnxUtils

  2. 将存档提取到本地目录。例如:C:\Program Files (x86)

  3. 将二进制的路径添加到 Windows PATH 用户变量。例如:C:\Program Files (x86)\UnxUtils\usr\local\wbin

    1. 按下 Windows 键,然后键入 environment variables

    2. 选择 Edit environment variables for your account(编辑您账户的环境变量)。

    3. 选择 PATH,然后选择 Edit(编辑)。

    4. Variable value 字段添加路径,中间用分号隔开。例如:C:\item1\path;C:\item2\path

    5. 选择 OK 两次以应用新设置。

    6. 关闭任何正在运行的命令提示符窗口,然后重新打开命令提示符窗口。

  4. 打开一个新的命令提示符窗口并运行 zip 命令,验证它是否有效。

    > zip -h Copyright (C) 1990-1999 Info-ZIP Type 'zip "-L"' for software license. ...

生成 .NET Core 项目

使用 dotnet 命令行工具生成一个新的 C# .NET Core 项目并在本地运行它。默认 .NET Core 应用程序是打印 Hello World! 然后退出的命令行实用工具。

生成新的 .NET Core 项目
  1. 打开一个新的命令提示窗口并导航至您的用户文件夹。

    > cd %USERPROFILE%
  2. 使用 dotnet new 命令生成新的 .NET Core 项目。

    C:\Users\username> dotnet new console -o dotnet-core-tutorial Content generation time: 65.0152 ms The template "Console Application" created successfully. C:\Users\username> cd dotnet-core-tutorial
  3. 使用 dotnet restore 命令安装依赖项。

    C:\Users\username\dotnet-core-tutorial> dotnet restore Restoring packages for C:\Users\username\dotnet-core-tutorial\dotnet-core-tutorial.csproj... Generating MSBuild file C:\Users\username\dotnet-core-tutorial\obj\dotnet-core-tutorial.csproj.nuget.g.props. Generating MSBuild file C:\Users\username\dotnet-core-tutorial\obj\dotnet-core-tutorial.csproj.nuget.g.targets. Writing lock file to disk. Path: C:\Users\username\dotnet-core-tutorial\obj\project.assets.json Restore completed in 1.25 sec for C:\Users\username\dotnet-core-tutorial\dotnet-core-tutorial.csproj. NuGet Config files used: C:\Users\username\AppData\Roaming\NuGet\NuGet.Config C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config Feeds used: https://api.nuget.org/v3/index.json C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
  4. 使用 dotnet run 命令在本地构建和运行应用程序。

    C:\Users\username\dotnet-core-tutorial> dotnet run Hello World!

启动 Elastic Beanstalk 环境

使用 Elastic Beanstalk 控制台启动 Elastic Beanstalk 环境。对于本示例,您将同时启动 .NET 平台。启动和配置环境后,可随时部署新的源代码。

启动环境(控制台)
  1. 使用以下预配置链接打开 Elastic Beanstalk 控制台:console.aws.amazon.com/elasticbeanstalk/home#/ newApplicationName=Tutorials &Environmentype= LoadBalanced

  2. 对于 Platform(平台),选择与应用程序使用的语言匹配的平台和平台分支。

  3. 对于应用程序代码,选择示例应用程序

  4. 选择复查并启动

  5. 检查可用选项。选择要使用的可用选项,然后在准备就绪后选择创建应用程序

环境创建需要花费大约 10 分钟。再次期间,您可以更新源代码。

更新源代码

将默认应用程序修改为使用 ASP.NET 和 IIS 的 Web 应用程序。

  • ASP.NET 是 .NET 的网站框架。

  • IIS 是在 Elastic Beanstalk 环境中的 Amazon EC2 实例上运行应用程序的 Web 服务器。

以下是要遵循的源代码示例:dotnet-core-tutorial-source. zip

注意

以下过程介绍如何将项目代码转换为 Web 应用程序。为简化该过程,您可以从头开始就将此项目生成为一个 Web 应用程序。在上一节生成 .NET Core 项目中,使用以下命令修改 dotnet new 步骤的命令。

C:\Users\username> dotnet new web -o dotnet-core-tutorial -n WindowsSampleApp
将 ASP.NET 和 IIS 支持添加到您的代码
  1. Program.cs 复制到应用程序目录中以作为 Web 主机生成器运行。

    例 c:\users\username\dotnet-core-tutorial\ Program.cs
    namespace Microsoft.AspNetCore.Hosting; using WindowsSampleApp; public static class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args).UseStartup<Startup>(); }
  2. 添加 Startup.cs 以运行 ASP.NET 网站。

    例 c:\users\username\dotnet-core-tutorial\ Startup.cs
    namespace WindowsSampleApp { public class Startup { public void Configure(IApplicationBuilder app) { app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("/", () => "Hello World from Elastic Beanstalk"); }); } } }
  3. 添加 WindowsSampleApp.csproj,其中包含 IIS 中间件,以及来自 web.config 的输出的 dotnet publish 文件。

    注意

    以下示例是使用 .NET Core 运行时 2.2.1 开发的。您可能需要修改 TargetFramework 元素中的 VersionPackageReference 属性值以匹配您在自定义项目中使用的 .NET Core 运行时版本。

    例 c:\users\username\dotnet-core-tutorial\ WindowsSampleApp .csproj
    <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <RollForward>LatestMajor</RollForward> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <RootNamespace>WindowsSampleApp</RootNamespace> </PropertyGroup> </Project>

接下来,安装新的依赖项并在本地运行 ASP.NET 网站。

在本地运行网站
  1. 使用 dotnet restore 命令安装依赖项。

  2. 使用 dotnet run 命令在本地构建和运行应用程序。

  3. 打开 localhost:5000 查看网站。

要在 Web 服务器上运行应用程序,您需要将已编译的源代码与 web.config 配置文件和运行时依赖项捆绑。dotnet 工具提供了一个 publish 命令,该命令根据 dotnet-core-tutorial.csproj 中的配置将这些文件聚集在一个目录中。

构建您的网站
  • 使用 dotnet publish 命令将已编译代码和依赖项输出到一个名为 site 的文件夹。

    C:\users\username\dotnet-core-tutorial> dotnet publish -o site

要将应用程序部署到 Elastic Beanstalk,请将站点存档与部署清单捆绑。这将告知 Elastic Beanstalk 如何运行它。

创建源包
  1. 将站点文件夹中的文件添加到 ZIP 文档。

    注意

    如果您使用不同的 ZIP 实用程序,请确保将所有文件添加到生成的 ZIP 存档的根文件夹中。这是成功将应用程序部署到您的 Elastic Beanstalk 环境所必需的。

    C:\users\username\dotnet-core-tutorial> cd site C:\users\username\dotnet-core-tutorial\site> zip ../site.zip * adding: dotnet-core-tutorial.deps.json (164 bytes security) (deflated 84%) adding: dotnet-core-tutorial.dll (164 bytes security) (deflated 59%) adding: dotnet-core-tutorial.pdb (164 bytes security) (deflated 28%) adding: dotnet-core-tutorial.runtimeconfig.json (164 bytes security) (deflated 26%) adding: Microsoft.AspNetCore.Authentication.Abstractions.dll (164 bytes security) (deflated 49%) adding: Microsoft.AspNetCore.Authentication.Core.dll (164 bytes security) (deflated 57%) adding: Microsoft.AspNetCore.Connections.Abstractions.dll (164 bytes security) (deflated 51%) adding: Microsoft.AspNetCore.Hosting.Abstractions.dll (164 bytes security) (deflated 49%) adding: Microsoft.AspNetCore.Hosting.dll (164 bytes security) (deflated 60%) adding: Microsoft.AspNetCore.Hosting.Server.Abstractions.dll (164 bytes security) (deflated 44%) adding: Microsoft.AspNetCore.Http.Abstractions.dll (164 bytes security) (deflated 54%) adding: Microsoft.AspNetCore.Http.dll (164 bytes security) (deflated 55%) adding: Microsoft.AspNetCore.Http.Extensions.dll (164 bytes security) (deflated 50%) adding: Microsoft.AspNetCore.Http.Features.dll (164 bytes security) (deflated 50%) adding: Microsoft.AspNetCore.HttpOverrides.dll (164 bytes security) (deflated 49%) adding: Microsoft.AspNetCore.Server.IISIntegration.dll (164 bytes security) (deflated 46%) adding: Microsoft.AspNetCore.Server.Kestrel.Core.dll (164 bytes security) (deflated 63%) adding: Microsoft.AspNetCore.Server.Kestrel.dll (164 bytes security) (deflated 46%) adding: Microsoft.AspNetCore.Server.Kestrel.Https.dll (164 bytes security) (deflated 44%) adding: Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll (164 bytes security) (deflated 56%) adding: Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll (164 bytes security) (deflated 51%) adding: Microsoft.AspNetCore.WebUtilities.dll (164 bytes security) (deflated 55%) adding: Microsoft.Extensions.Configuration.Abstractions.dll (164 bytes security) (deflated 48%) adding: Microsoft.Extensions.Configuration.Binder.dll (164 bytes security) (deflated 47%) adding: Microsoft.Extensions.Configuration.dll (164 bytes security) (deflated 46%) adding: Microsoft.Extensions.Configuration.EnvironmentVariables.dll (164 bytes security) (deflated 46%) adding: Microsoft.Extensions.Configuration.FileExtensions.dll (164 bytes security) (deflated 47%) adding: Microsoft.Extensions.DependencyInjection.Abstractions.dll (164 bytes security) (deflated 54%) adding: Microsoft.Extensions.DependencyInjection.dll (164 bytes security) (deflated 53%) adding: Microsoft.Extensions.FileProviders.Abstractions.dll (164 bytes security) (deflated 46%) adding: Microsoft.Extensions.FileProviders.Physical.dll (164 bytes security) (deflated 47%) adding: Microsoft.Extensions.FileSystemGlobbing.dll (164 bytes security) (deflated 49%) adding: Microsoft.Extensions.Hosting.Abstractions.dll (164 bytes security) (deflated 47%) adding: Microsoft.Extensions.Logging.Abstractions.dll (164 bytes security) (deflated 54%) adding: Microsoft.Extensions.Logging.dll (164 bytes security) (deflated 48%) adding: Microsoft.Extensions.ObjectPool.dll (164 bytes security) (deflated 45%) adding: Microsoft.Extensions.Options.dll (164 bytes security) (deflated 53%) adding: Microsoft.Extensions.Primitives.dll (164 bytes security) (deflated 50%) adding: Microsoft.Net.Http.Headers.dll (164 bytes security) (deflated 53%) adding: System.IO.Pipelines.dll (164 bytes security) (deflated 50%) adding: System.Runtime.CompilerServices.Unsafe.dll (164 bytes security) (deflated 43%) adding: System.Text.Encodings.Web.dll (164 bytes security) (deflated 57%) adding: web.config (164 bytes security) (deflated 39%) C:\users\username\dotnet-core-tutorial\site> cd ../
  2. 添加指向站点存档的部署清单。

    例 c:\users\username\dotnet-core-tutorial\ aws-windows-deployment-manifest .json
    { "manifestVersion": 1, "deployments": { "aspNetCoreWeb": [ { "name": "test-dotnet-core", "parameters": { "appBundle": "site.zip", "iisPath": "/", "iisWebSite": "Default Web Site" } } ] } }
  3. 使用 zip 命令创建一个名为 dotnet-core-tutorial.zip 的源包。

    C:\users\username\dotnet-core-tutorial> zip dotnet-core-tutorial.zip site.zip aws-windows-deployment-manifest.json adding: site.zip (164 bytes security) (stored 0%) adding: aws-windows-deployment-manifest.json (164 bytes security) (deflated 50%)

部署您的应用程序

将源包部署到您创建的 Elastic Beanstalk 环境。

你可以在这里下载源包:dotnet-core-tutorial-bundle. zip

部署源包
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在环境概述页面上,选择 Upload and deploy(上传和部署)。

  4. 使用屏幕上的对话框上传源包。

  5. 选择 Deploy(部署)。

  6. 部署完成后,选择站点 URL 以在新选项卡中打开您的网站。

应用程序简单地将 Hello from ASP.NET Core! 写入到响应并返回。

启动环境将创建以下资源:

  • EC2 实例 - 配置为在您选择的平台上运行 Web 应用程序的 Amazon Elastic Compute Cloud (Amazon EC2) 虚拟机。

    各平台运行一组特定软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 NGINX 作为 Web 应用程序前的反向代理,向其转发请求、提供静态资产以及生成访问和错误日志。

  • 实例安全组 - 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。通过此资源,HTTP 流量可以从负载均衡器到达运行您的 Web 应用程序的 EC2 实例。默认情况下,其他端口不允许流量进入。

  • 负载均衡器 – 配置为向运行您的应用程序的实例分配请求的 Elastic Load Balancing 负载均衡器。负载均衡器还使您无需将实例直接公开在 Internet 上。

  • 负载均衡器安全组 – 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。利用此资源,HTTP 流量可从 Internet 到达负载均衡器。默认情况下,其他端口不允许流量进入。

  • Auto Scaling 组 – 配置为在实例终止或不可用时替换实例的 Auto Scaling 组。

  • Amazon S3 存储桶 – 使用 Elastic Beanstalk 时创建的源代码、日志和其他构件的存储位置。

  • Amazon CloudWatch CloudWatch 警报 — 两个警报,用于监控您环境中实例的负载,并在负载过高或过低时触发。警报触发后,您的 Auto Scaling 组会扩展或收缩以进行响应。

  • Amazon CloudFormation 堆栈 — Elastic Amazon CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 Amazon CloudFormation 控制台查看的模板中定义。

  • 域名 – 一个域名,它以下面的形式路由到您的 Web 应用程序:subdomain.region.elasticbeanstalk.com

    注意

    为了增强您的 Elastic Beanstalk 应用程序的安全性,eb.amazonaws.com.cn 名已在公共后缀列表 (PSL) 中注册。为进一步增强安全性,如果您需要在 Elastic Beanstalk 应用程序的默认域名中设置敏感 Cookie,我们建议您使用带 __Host- 前缀的 Cookie。这将有助于保护您的域,防范跨站点请求伪造(CSRF)攻击。要了解更多信息,请参阅 Mozilla 开发者网络中的 Set-Cookie 页面。

所有这些资源都由 Elastic Beanstalk 管理。当您终止环境时,Elastic Beanstalk 会终止其包含的所有资源。

注意

Elastic Beanstalk 创建的 Amazon S3 存储桶将在多个环境之间共享并且在环境终止期间不会被删除。有关更多信息,请参阅将 Elastic Beanstalk 和 Amazon S3 结合使用

清除

Elastic Beanstalk 使用完毕时,您可以终止您的环境。Elastic Beanstalk Amazon 会终止与您的环境关联的所有资源,例如 Amazon EC2 实例、数据库实例、负载均衡器、安全组和警报。

终止 Elastic Beanstalk 环境
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 选择 Actions(操作),然后选择 Terminate environment(终止环境)。

  4. 使用屏幕上的对话框确认环境终止。

利用 Elastic Beanstalk,可以随时为您的应用程序轻松创建新环境。

后续步骤

当您继续开发应用程序时,您可能希望管理环境和部署应用程序,而无需手动创建 .zip 文件并将该文件上传到 Elastic Beanstalk 控制台。Elastic Beanstalk 命令行界面 (EB CLI easy-to-use ) 提供了从命令行创建、配置应用程序并将其部署到 Elastic Beanstalk 环境的命令。

如果您使用 Visual Studio 开发应用程序,则还可以使用 Amazon Toolkit for Visual Studio 来部署变更、管理 Elastic Beanstalk 环境以及管理其他资源。 Amazon 参阅 这些区域有: Amazon Toolkit for Visual Studio 了解更多信息。

对于开发和测试,您可能希望使用 Elastic Beanstalk 的用于将托管数据库实例直接添加到环境的功能。有关在环境内设置数据库的说明,请参阅将数据库添加到 Elastic Beanstalk 环境

最后,如果您计划在生产环境中使用应用程序,请为环境配置自定义域名启用 HTTPS 以实现安全连接。