AWS Elastic Beanstalk
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 AWS Elastic Beanstalk 部署 ASP.NET 内核应用程序

在本教程中,您将了解构建一个新的 ASP.NET Core 应用程序并将其部署到 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-tutorial-source.zip

可部署的源包可在这里找到:dotnet-core-tutorial-bundle.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,然后选择编辑

    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 环境

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

启动环境 (控制台)

  1. 使用下面的预配置链接打开 Elastic Beanstalk 控制台:console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. 对于平台,选择与应用程序使用的语言匹配的平台。

  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

将 ASP.NET 和 IIS 支持添加到您的代码

  1. Program.cs 复制到应用程序目录中以作为 Web 主机生成器运行。

    例 c:\users\username\dotnet-core-tutorial\Program.cs

    using System; using Microsoft.AspNetCore.Hosting; using System.IO; namespace aspnetcoreapp { public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); } } }
  2. 添加 Startup.cs 以运行 ASP.NET 网站。

    例 c:\users\username\dotnet-core-tutorial\Startup.cs

    using System; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; namespace aspnetcoreapp { public class Startup { public void Configure(IApplicationBuilder app) { app.Run(context => { return context.Response.WriteAsync("Hello from ASP.NET Core!"); }); } } }
  3. 添加 web.config 文件以配置 IIS 服务器。

    例 c:\users\username\dotnet-core-tutorial\web.config

    <?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\dotnet-core-tutorial.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" /> </system.webServer> </configuration>
  4. 添加 dotnet-core-tutorial.csproj,其中包含 IIS 中间件,以及来自 web.config 的输出的 dotnet publish 文件。

    注意

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

    例 c:\users\username\dotnet-core-tutorial\dotnet-core-tutorial.csproj

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" /> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.0" /> </ItemGroup> <ItemGroup> <None Include="web.config" CopyToPublishDirectory="Always" /> </ItemGroup> </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 文档。

    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 控制台

  2. 导航到您的环境的管理页

  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 组会扩展或收缩进行响应。

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

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

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

注意

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

清除

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

终止 Elastic Beanstalk 环境

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择操作,然后选择终止环境

  4. Confirm Termination (确认终止) 对话框中,键入环境名称,然后选择 Terminate (终止)

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

后续步骤

当您继续部署应用程序时,您可能需要一种方式可以管理环境和部署应用程序,而无需手动创建 .zip 文件并将其上传至 Elastic Beanstalk 控制台。Elastic Beanstalk 命令行界面 (EB CLI) 提供了易于使用的命令,可用于从命令行创建、配置应用程序并将应用程序部署到 Elastic Beanstalk 环境。

如果使用 Visual Studio 开发应用程序,则还可以使用 AWS Toolkit for Visual Studio 来部署更改、管理 Elastic Beanstalk 环境以及管理其他 AWS 资源。有关更多信息,请参阅AWS Toolkit for Visual Studio

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

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