

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

# 使用适用 AWS Elastic Beanstalk 于 Visual Studio 的 AWS Toolkit 和 Amazon Q 部署到 Visual Studio 中
<a name="deployment-beanstalk"></a>

AWS Elastic Beanstalk 是一项服务，可简化为应用程序配置 AWS 资源的过程。Elastic Beanstalk 提供了部署应用程序所需 AWS 的所有基础架构。此基础设施包括：
+ 一些 Amazon EC2 实例，可托管应用程序的可执行文件和内容。
+ 一个自动扩缩组，可维持适当数量的 Amazon EC2 实例来支持您的应用程序。
+ 一个 Elastic Load Balancing 负载均衡器，可将传入流量路由至具有最大带宽的 Amazon EC2 实例。

本用户指南主题介绍如何在 Amazon Q 上使用工具包中的 AWS Elastic Beanstalk 向导。有关 Elastic Beanstalk 的详细信息，请参阅开发者指南。[AWS Elastic Beanstalk](https://docs.aws.amazon.com//elasticbeanstalk/latest/dg/Welcome.html)以下主题部分描述了 Amazon Q 工具包的 Elastic Beanstalk AWS 向导。

**Topics**
+ [部署 ASP.NET 应用程序（传统）](deployment-beanstalk-traditional.md)
+ [部署 ASP.NET 应用程序（.NET Core）（旧版）](deployment-beanstalk-netcore.md)
+ [指定 AWS 凭证](deployment-beanstalk-specify-credentials.md)
+ [重新发布到 Elastic Beanstalk（旧版）](deployment-beanstalk-republish.md)
+ [自定义部署（传统）](deployment-beanstalk-custom.md)
+ [自定义部署（.NET 内核）](deployment-beanstalk-custom-netcore.md)
+ [多应用程序支持](deployment-beanstalk-multiple-application.md)

# 将传统的 ASP.NET 应用程序部署到 Elastic Beanstalk
<a name="deployment-beanstalk-traditional"></a>

本部分介绍如何使用**发布到 Elastic Beanstalk** 向导（作为 Toolkit for Visual Studio 的一部分提供）通过 Elastic Beanstalk 部署应用程序。要进行练习，您可使用 Visual Studio 中内置的 Web 应用程序初学者项目的实例，也可使用您自己的项目。

**注意**  
此向导还支持部署 ASP.NET 内核应用程序。有关 ASP.NET Core 的信息，请参阅《[AWS .NET deployment tool](https://aws.github.io/aws-dotnet-deploy/)》指南和更新的[部署到 AWS](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/deployment-chapt.html) 目录。

**注意**  
在使用**发布到 Elastic Beanstalk** 向导之前，必须先下载并安装 [Web Deploy](http://www.microsoft.com/en-us/download/details.aspx?id=39277)。此向导依赖 Web Deploy 将 Web 应用程序和网站部署到 Internet Information Services (IIS) Web 服务器。

## 创建示例 Web 应用程序初学者项目
<a name="to-create-a-sample-web-application-starter-project"></a>

1. 在 Visual Studio 中，从 **File (文件)** 菜单中，选择 **New (新建)**，然后选择 **Project (项目)**。

1. 在 **New Project (新建项目)** 对话框的导航窗格中，依次展开 **Installed (已安装)**、**Templates (模板)** 和 **Visual C\$1**，然后选择 **Web**。

1. 在 Web 项目模板的列表中，选择其说明中包含 `Web` 和 `Application` 字样的任何模板。在本示例中，请选择 **ASP.NET Web Forms Application (ASP.NET Web 表单应用程序)**。  
![\[New Project window showing ASP.NET web application templates for Visual C# in .NET Framework 4.5.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-new-web-project-console.png)

1. 在 **Name (名称)** 框中，键入 `AEBWebAppDemo`。

1. 在 **Location (位置)** 框中，键入您的开发计算机上的解决方案文件夹的路径或选择 **Browse (浏览)**，然后浏览并选择解决方案文件夹，再选择 **Select Folder (选择文件夹)**。

1. 确认选中了 **Create directory for solution (为解决方案创建目录)** 框。在 **Solution (解决方案)** 下拉列表中，确认选择了 **Create new solution (创建新解决方案)**，然后选择 **OK (确定)**。Visual Studio 将基于 ASP.NET Web 表单应用程序项目模板创建解决方案和项目。随后，Visual Studio 将显示解决方案资源管理器，其中将显示新的解决方案和项目。  
![\[Solution Explorer window showing project structure with folders and files for a web application.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-web-app-solution-explorer-console.png)

## 使用 Publish to Elastic Beanstalk 向导部署应用程序
<a name="to-deploy-an-application-by-using-the-publish-to-elastic-beanstalk-wizard"></a>

1. 在解决方案资源管理器中，打开您在上一节中创建的**AEBWebAppDemo**项目的项目文件夹的上下文（右键单击）菜单，或者打开您自己的应用程序的项目文件夹的快捷菜单，然后选择**发布到 E AWS lastic Beanstalk**。  
![\[Solution Explorer context menu showing "Publish to AWS..." option for AEBWebAppDemo project.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-publish-to-aws-console.png)

   随即显示 **Publish to Elastic Beanstalk (发布到 Elastic Beanstalk)** 向导。  
![\[Publish to AWS Elastic Beanstalk wizard interface for creating or redeploying an application environment.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-aeb-wizard-app-console.png)

1. 在**配置文件**中，从**用于部署的账户配置文件**下拉列表中，选择要用于部署的 AWS 账户配置文件。

   或者，如果您有要使用的 AWS 帐户，但尚未为其创建 AWS 账户资料，则可以选择带有加号 (`+`) 的按钮来添加 AWS 账户资料。

1. 从**区域**下拉列表中，选择希望 Elastic Beanstalk 将应用程序部署到的区域。

1. 在 **Deployment Target (部署目标)** 中，您可选择 **Create a new application environment (创建新应用程序环境)** 执行应用程序的初始部署或选择 **Redeploy to an existing environment (重新部署到现有环境)** 重新部署之前已部署的应用程序。（之前的部署可能是使用向导或已弃用的独立部署工具执行的。） 如果您选择 **Redeploy to an existing environment (重新部署到现有环境)**，则当向导从当前正在运行的之前的部署中检索信息时可能会出现延迟。
**注意**  
如果您选择 **Redeploy to an existing environment (重新部署到现有环境)**，再选择列表中的环境，然后选择 **Next (下一步)**，则向导会将您定向至 **Application Options (应用程序选项)** 页面。如果您执行此过程，请向前跳至此部分中后面描述如何使用 **Application Options (应用程序选项)** 页面的说明。

1. 选择**下一步**。  
![\[Application Environment setup page for AWS with fields for name, environment, and URL.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-aeb-wizard-env-console.png)

1. 在 **Application Environment (应用程序环境)** 页面上的 **Application (应用程序)** 区域中，**Name (名称)** 下拉列表将为应用程序建议默认名称。您可通过选择此下拉列表中的其他名称来更改默认名称。

1. 在**环境**区域的**名称**下拉列表中，为您的 Elastic Beanstalk 环境键入一个名称。在此上下文中，术语*环境*是指 Elastic Beanstalk 为您的应用程序预置的基础设施。此下拉列表中可能已建议默认名称。如果未建议默认名称，您可键入一个名称或从下拉列表中选择一个名称（如果提供了任何其他名称）。环境名称的长度不得超过 23 个字符。

1. 在 **URL** 区域中，此框会建议将作为您的 Web 应用程序 URL 的默认子域 `.elasticbeanstalk.com`。您可键入新的子域名来更改默认子域。

1. 选择 **Check availability (检查可用性)** 以确保您的 Web 应用程序 URL 未在使用中。

1. 如果您的 Web 应用程序 URL 可以使用，请选择 **Next (下一步)**。

![\[AWS EC2 launch configuration settings for deploying an application to Amazon Web Services.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-aeb-wizard-ec2-console.png)


1. 在 **AWS 选项**页面上的 **Amazon EC2 启动配置**中，从**容器类型**下拉列表中，选择将用于您的应用程序的亚马逊机器映像（AMI）类型。

1. 在**实例类型**下拉列表中，指定要使用的 Amazon EC2 实例类型。在本示例中，我们建议您使用 **Micro (微型)**。这将最大程度降低相关的实例运行成本。有关 Amazon EC2 成本的更多信息，请转至 [EC2 定价](https://aws.amazon.com/ec2/pricing/)页面。

1. 在**密钥对**下拉列表中，选择一个 Amazon EC2 实例密钥对，用于登录您的应用程序将使用的实例。

1. （可选）在 **Use custom AMI (使用自定义 AMI)** 框中，您可指定将覆盖 **Container type (容器类型)** 下拉列表中指定的 AMI 的自定义 AMI。有关如何创建自定义 AMI 的更多信息，请转到 Elasti [AWS c Beanstalk 开发人员指南 AMIs中的[使用自定义](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.customami.html)，然后从 Amazon EC](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/) [2 实例创建](tkv-create-ami-from-instance.md) AMI。

1. （可选）如果您要在 VPC 中启动实例，请选中 **Use a VPC (使用 VPC)** 框。

1. （可选）如果您要启动单个 Amazon EC2 实例，然后将应用程序部署到该实例，请选中**单实例环境**选项框。

   如果您选中此框，Elastic Beanstalk 仍将创建自动扩缩组，但不会配置改组。如果您希望稍后配置自动扩缩组，则可使用 AWS 管理控制台。

1. （可选）如果您希望控制将应用程序部署到实例时的条件，请选中 **Enable Rolling Deployments (启用滚动部署)** 框。只能在未选中 **Single instance environment (单个实例环境)** 框时选中此框。

1. 如果您的应用程序使用诸如 Amazon S3 和 DynamoDB 之类的 AWS 服务，则提供证书的最佳方式是使用 IAM 角色。在**已部署应用程序权限**区域中，您可选择现有 IAM 角色或创建一个供向导用来启动环境的角色。使用的应用程序在向 AWS 服务发出请求时 适用于 .NET 的 AWS SDK 将自动使用此 IAM 角色提供的证书。

1. 如果您的应用程序访问 Amazon RDS 数据库，请在**关系数据库访问权限**区域的下拉列表中，选中向导将更新的任何 Amazon RDS 安全组旁的框，以便您的 Amazon EC2 实例可访问该数据库。

1. 选择**下一步**。
   + 如果您已选择 **Use a VPC (使用 VPC)**，则将显示 **VPC Options (VPC 选项)** 页面。
   + 如果您已选择 **Enable Rolling Deployments (启用滚动部署)**，但未选择 **Use a VPC (使用 VPC)**，则将显示 **Rolling Deployments (滚动部署)** 页面。向前跳至此部分中后面描述如何使用 **Rolling Deployments (滚动部署)** 页面的说明。
   + 如果您未选择 **Use a VPC (使用 VPC)** 或 **Enable Rolling Deployments (启用滚动部署)**，则将显示 **Application Options (应用程序选项)** 页面。向前跳至此部分中后面描述如何使用 **Application Options (应用程序选项)** 页面的说明。

1. 如果您已选择 **Use a VPC (使用 VPC)**，请在 **VPC Options (VPC 选项)** 页面上指定信息以在 VPC 中启动应用程序。  
![\[VPC Options interface for configuring AWS Elastic Beanstalk application deployment settings.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-aeb-wizard-vpc-console.png)

   必须已创建 VPC。如果您在 Toolkit for Visual Studio 中创建了 VPC，则 Toolkit for Visual Studio 将为您填充此页面。如果您在 [AWS 管理控制台](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo-vpc-basic.html)中创建了 VPC，请在此页面中键入有关您的 VPC 的信息。

## 针对 VPC 的部署的主要注意事项
<a name="key-considerations-for-deployment-to-a-vpc"></a>
+ 您的 VPC 需要至少一个公有子网和一个私有子网。
+ 在 *ELB Subnet (ELB 子网)* 下拉列表中，指定公有子网。Toolkit for Visual Studio 将应用程序的 Elastic Load Balancing 负载均衡器部署到公有子网。公有子网与具有指向 Internet 网关的入口的路由表关联。您可识别 Internet 网关，因为它具有以 `igw-` 开头的 ID（例如，`igw-83cddaex`）。您使用 Toolkit for Visual Studio 创建的公有子网包含将其标识为公有的标签值。
+ 在 *Instances Subnet (实例子网)* 下拉列表中，指定私有子网。Toolkit for Visual Studio 会将应用程序的 Amazon EC2 实例部署到私有子网。
+ 应用程序的 Amazon EC2 实例将通过公有子网中执行网络地址转换（NAT）的 Amazon EC2 实例实现从私有子网到 Internet 的通信。要启用此通信，您需要允许流量从私有子网流至 NAT 实例的 [VPC 安全组](https://console.aws.amazon.com/vpc/home)。在 *Security Group (安全组)* 下拉列表中，指定此 VPC 安全组。

有关如何将 Elastic Beanstalk 应用程序部署到 VPC 的更多信息，请参阅《[AWS Elastic Beanstalk 开发人员指南](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/)》。

1. 在填充 **VPC Options (VPC 选项)** 页面上的所有信息后，请选择 **Next (下一步)**。
   + 如果您已选择 **Enable Rolling Deployments (启用滚动部署)**，则将显示 **Rolling Deployments (滚动部署)** 页面。
   + 如果您未选择 **Enable Rolling Deployments (启用滚动部署)**，则将显示 **Application Options (应用程序选项)** 页面。向前跳至此部分中后面描述如何使用 **Application Options (应用程序选项)** 页面的说明。

1. 如果您已选择 **Enable Rolling Deployments (启用滚动部署)**，请在 **Rolling Deployments (滚动部署)** 页面上指定信息以配置新版本的应用程序部署到负载均衡环境中的实例的方式。例如，如果您的环境中有 4 个实例，并且您需要更改实例类型，则可将环境配置为一次更改 2 个实例。这可帮助确保您的应用程序在执行更改时仍处于运行状态。  
![\[Rolling Deployments configuration interface for AWS application updates and environment settings.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-aeb-wizard-rolling-console.png)

1. 在 *Application Versions (应用程序版本)* 区域中，选择用于控制一次部署的实例的百分比或数量的选项。指定所需百分比或数量。

1. （可选）在 *Environment Configuration (环境配置)* 区域中，如果要指定在部署期间保持运行的实例数量，请选中此框。如果选中此框，请指定一次应修改的实例的最大数目和/或一次应保持运行的实例的最小数目。

1. 选择*下一步*。

1. 在 **Application Options (应用程序选项)** 页面上，指定有关版本、Internet Information Services (IIS) 和应用程序设置的信息。  
![\[Application Options interface for configuring build and deployment settings for AWS.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-aeb-wizard-options-console.png)

1. 在 **Build and IIS Deployment Settings (生成和 IIS 部署设置)** 区域的 **Project build configuration (项目生成配置)** 下拉列表中，选择目标版本配置。如果向导可以找到它，则 **Release (发布)** 将显示，否则此框中将显示有效配置。

1. 在 **App pool (应用程序池)** 下拉列表中，选择您的应用程序所需的 .NET Framework 版本。应已显示正确的 .NET Framework 版本。

1. 如果您的应用程序是 32 位的，请选中 **Enable 32-bit applications (启用 32 位应用程序)** 框。

1. 在 **App path (应用程序路径)** 框中，指定 IIS 将用来部署应用程序的路径。默认情况下，指定 **Default Web Site/**，它通常会转换为路径 `c:\inetpub\wwwroot`。如果您指定了 **Default Web Site/** 之外的路径，向导将在 **Default Web Site/** 路径中放置指向您指定的路径的重定向。

1. 在**应用程序设置**区域的**运行状况检查 URL** 框中，键入要检查的 Elastic Beanstalk URL，以确定您的 Web 应用程序是否仍响应。此 URL 相对于根服务器 URL。默认情况下，已指定根服务器 URL。例如，如果完整 URL 为 `example.com/site-is-up.html`，则键入 `/site-is-up.html`。

1. 在 **Key (键)** 和 **Value (值)** 的区域中，可指定要添加到应用程序的 `Web.config` 文件的任何密钥和值对。
**注意**  
尽管不建议这样做，但您可以使用 **Key** 和 **Value** 区域来指定应用程序运行时应使用的 AWS 凭据。首选方式是在 **AWS 选项**页面上的 **Identity and Access Management 角色**下拉列表中指定 IAM 角色。但是，如果您必须使用 AWS 证书而不是 IAM 角色来运行应用程序，请在**密钥**行中选择**AWSAccess密钥**。在 **Value (值)** 行中，键入访问密钥。对 **AWSSecretKey** 重复这些步骤。

1. 选择**下一步**。  
![\[Review window for publishing an application to AWS Elastic Beanstalk with deployment details.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-aeb-wizard-review-console.png)

1. 在 **Review (查看)** 页面上，查看您配置的选项，然后选中 **Open environment status window when wizard closes (在向导关闭时打开环境状态窗口)** 框。

1. 如果一切正常，请选择 **Deploy (部署)**。
**注意**  
部署应用程序时，将向活动账户收取应用程序使用的 AWS 资源所产生的费用。

   有关部署的信息将显示在 Visual Studio 状态栏和 **Output (输出)** 窗口中。该过程可能需要几分钟。部署完成后，**Output (输出)** 窗口中将显示确认消息。

1. **要删除部署，请在 AWS 资源管理器中展开 El **asti** c Beanstalk 节点，打开部署子节点的上下文（右键单击）菜单，然后选择删除。**此删除过程可能需要几分钟。

# 将 ASP.NET Core 应用程序部署到 Elastic Beanstalk（旧版）
<a name="deployment-beanstalk-netcore"></a>

**重要**  
本文档涉及旧版服务和功能。有关更新的指南和内容，请参阅 [AWS .NET deployment tool](https://aws.github.io/aws-dotnet-deploy/) 指南和更新的[部署到 AWS](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/deployment-chapt.html) 目录。

AWS Elastic Beanstalk 是一项服务，可简化为应用程序配置 AWS 资源的过程。 AWS Elastic Beanstalk 提供了部署应用程序所需的所有 AWS 基础架构。

Visual Studio 工具包支持 AWS 使用 Elastic Beanstalk 部署 ASP.NET Core 应用程序。ASP.NET 内核是对 ASP.NET 的重新设计，具有模块化的架构，它最大程度地降低了依赖项开销并简化了应用程序以便在云中运行。

AWS Elastic Beanstalk 可以轻松地将各种不同语言的应用程序部署到 AWS。Elastic Beanstalk 支持传统 ASP.NET 应用程序和 ASP.NET Core 应用程序。本主题描述如何部署 ASP.NET 内核应用程序。

## 使用部署向导
<a name="tkv-deploy-using-wizard-netcore"></a>

将 ASP.NET Core 应用程序部署到 Elastic Beanstalk 的最简单方法是使用 Toolkit for Visual Studio。

如果您之前用过此工具包部署传统 ASP。NET 应用程序，您将发现 ASP.NET 内核的体验与之非常相似。在以下步骤中，我们将演练部署体验。

如果您以前从未使用过该工具包，则安装该工具包后需要做的第一件事就是向该工具包注册您的 AWS 凭据。有关操作[方法的详细信息，请参阅 Visual Studio 的 “如何为应用程序指定 AWS 安全证书](deployment-beanstalk-specify-credentials.md#tkv-deploy-specify-credentials-for-application)” 文档。

要部署 ASP.NET Core Web 应用程序，请在解决方案资源管理器中右键单击该项目，然后选择**发布到 AWS...。**

在发布到 AWS Elastic Beanstalk 部署向导的第一页上，选择创建新的 Elastic Beanstalk 应用程序。Elastic Beanstalk 应用程序是 Elastic Beanstalk 组件的逻辑集合，包括环境、版本和环境配置。此部署向导将生成一个应用程序，此应用程序将包含应用程序版本和环境的集合。这些环境包含运行应用程序版本的实际 AWS 资源。每次部署应用程序时，都会创建一个新的应用程序版本，并且此向导会将环境指向此版本。您可在 [Elastic Beanstalk 组件](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts.components.html)中了解有关这些概念的更多信息。

接下来，为应用程序及其第一个环境设置名称。每个环境均关联一个唯一的别名，可使用此别名在部署完成后访问应用程序。

下一页 “**AWS 选项**” 允许您配置要使用的 AWS 资源类型。在此示例中，将保留默认值（**Key pair (密钥对)** 部分除外）。利用密钥对，可以检索 Windows 管理员密码，以便您能登录到计算机。如果您尚未创建密钥对，可能需要选择 **Create new key pair (创建新密钥对)**。

## Permissions
<a name="tkv-deploy-using-wizard-netcore-permissions"></a>

**权限**页面用于向运行您的应用程序的 EC2 实例分配 AWS 证书。如果您的应用程序使用访问其他 AWS 服务， 适用于 .NET 的 AWS SDK 这一点很重要。如果您未使用应用程序中的任何其他服务，则可将保留此页面的默认值。

## 应用程序选项
<a name="tkv-deploy-using-wizard-netcore-app-options"></a>

**Application Options (应用程序选项)** 页面上的详细信息不同于部署传统 ASP.NET 应用程序时指定的详细信息。在此处，可指定用于打包应用程序的版本配置和框架，还可指定应用程序的 IIS 资源路径。

完成 **Application Options (应用程序选项)** 页面后，单击 **Next (下一步)** 查看设置，然后单击 **Deploy (部署)** 开始部署过程。

## 检查环境状态
<a name="tkv-deploy-using-wizard-netcore-check-status"></a>

将应用程序打包并上传到后 AWS，您可以在 Visual Studio 的资源管理器中打开环境状态视图，查看 AWS Elastic Beanstalk 环境的状态。

事件将在环境联机时显示在状态栏中。一切完成后，环境状态将变为正常状态。您可单击 URL 来查看站点。在此处，您还可从环境或远程桌面，将日志提取到作为 Elastic Beanstalk 环境一部分的 Amazon EC2 实例。

任何应用程序的首次部署都将比随后的重新部署花费更长的时间，因为它会创建新的 AWS 资源。在开发期间对应用程序执行迭代时，可再次通过向导快速重新部署，或通过在右键单击项目时选择 **Republish (重新发布)** 选项来快速重新部署。

重新发布操作将使用通过部署向导进行的上次运行中的设置来打包您的应用程序，并将应用程序包上传到现有 Elastic Beanstalk 环境。

# 如何为您的应用程序指定 AWS 安全证书
<a name="deployment-beanstalk-specify-credentials"></a>

你在 “**发布到 Elastic Beanstalk**” 向导中指定的 AWS 账户 AWS 是该向导部署到 Elastic Beanstalk 时将使用的账户。

尽管不建议这样做，但您可能还需要指定应用程序在部署后用于访问 AWS 服务的 AWS 账户证书。首选方法是指定一个 IAM 角色。在**发布到 Elastic Beanstalk** 向导中，您可以通过**AWS 选项**页面上的 **Identity and Access Management 角色**下拉列表执行此操作。在旧版的**发布到 Amazon Web Services** 向导中，您可以通过 **AWS 选项**页面上的 **IAM 角色**下拉列表执行此操作。

如果您必须使用 AWS 账户证书而不是 IAM 角色，则可以通过以下方式之一为您的应用程序指定 AWS 账户证书：
+ 在项目文件`appSettings`元素中引用与 AWS 账户凭据对应的`Web.config`个人资料。（要创建配置文件，请参阅[配置 AWS 凭据](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-config-creds.html)。） 以下示例指定了配置文件名称为 `myProfile` 的凭证。

  ```
  <appSettings>
    <!-- AWS CREDENTIALS -->
    <add key="AWSProfileName" value="myProfile"/>
  </appSettings>
  ```
+ **如果您使用的是**发布到 Elastic Beanstalk** 向导，请**在** “应用程序选项” 页面的 “键和值” 区域的 “密钥” **行****中**选择。**AWS AccessKey****在 **Value (值)** 行中，键入访问密钥。对重复这些步骤**AWS SecretKey**。
+ 如果您使用旧版**发布到 Amazon Web Services** 向导，则在**应用程序选项**页面上的**应用程序凭证**区域，选择**使用这些凭证**，然后在**访问密钥**和**密钥**框中分别键入访问密钥和秘密访问密钥。

# 如何将应用程序重新发布到 Elastic Beanstalk 环境（旧版）
<a name="deployment-beanstalk-republish"></a>

**重要**  
本文档涉及旧版服务和功能。有关更新的指南和内容，请参阅 [AWS .NET 部署工具](https://aws.github.io/aws-dotnet-deploy/)指南。

您可以进行不连续的更改，然后将新版本重新发布到已启动的 Elastic Beanstalk 环境，从而在应用程序上进行迭代。

1. 在 “解决方案资源管理器” 中，打开您在上一节中发布的**AEBWebAppDemo**项目的项目文件夹的上下文（右键单击）菜单，然后选择 “**发布到**” AWS Elastic Beanstalk。  
![\[Solution Explorer context menu showing "Publish to AWS..." option for AEBWebAppDemo project.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-publish-to-aws-console.png)

   随即显示 **Publish to Elastic Beanstalk (发布到 Elastic Beanstalk)** 向导。  
![\[Publish to AWS Elastic Beanstalk dialog with profile and deployment options.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-aeb-wizard-app-console2.png)

1. 选择 **Redeploy to an existing environment (重新部署到现有环境)**，然后选择您之前所发布到的环境。单击**下一步**。

   **Review (查看)** 向导随即出现。  
![\[Review wizard showing deployment details for an AWS Elastic Beanstalk application.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/tkv-aeb-wizard-app-review.png)

1. 单击 **Deploy (部署)**。该应用程序将重新部署到相同的环境。

如果您的应用程序正处于启动或终止过程，则无法重新发布。

# 自定义 Elastic Beanstalk 应用程序部署
<a name="deployment-beanstalk-custom"></a>

本主题介绍 Elastic Beanstalk 的 Microsoft Windows 容器的部署清单如何支持自定义应用程序部署。

对于想利用 Elastic Beanstalk 的功能来创建和管理 AWS 资源，同时希望完全控制应用程序的部署方式的高级用户，自定义应用程序部署是一个强大的功能。对于自定义应用程序部署，您将为 Elastic Beanstalk 执行的三个不同操作创建 Windows PowerShell 脚本。安装操作在启动部署时使用，重新启动操作在从工具包或 Web 控制台调用 `RestartAppServer` API 时使用，卸载操作在新部署出现时被任何之前的部署调用。

例如，当您的文档团队编写了一个他们希望包含在部署中的静态网站情况下，您可能希望部署一个 ASP.NET 应用程序。您可以按如下方式编写部署清单来执行该操作：

```
{
  "manifestVersion": 1,
  "deployments": {

    "msDeploy": [
      {
        "name": "app",
        "parameters": {
          "appBundle": "CoolApp.zip",
          "iisPath": "/"
        }
      }
    ],
    "custom": [
      {
        "name": "PowerShellDocs",
        "scripts": {
          "install": {
            "file": "install.ps1"
          },
          "restart": {
            "file": "restart.ps1"
          },
          "uninstall": {
            "file": "uninstall.ps1"
          }
        }
      }
    ]
  }
}
```

为每个操作列出的脚本必须位于与部署清单文件相关的应用程序包中。在本示例中，应用程序包还将包含一个 documentation.zip 文件，该文件包含由您的文档团队创建的静态网站。

`install.ps1` 脚本将提取该 zip 文件并设置 IIS 路径。

```
Add-Type -assembly "system.io.compression.filesystem"
[io.compression.zipfile]::ExtractToDirectory('./documentation.zip', 'c:\inetpub\wwwroot\documentation')

powershell.exe -Command {New-WebApplication -Name documentation -PhysicalPath  c:\inetpub\wwwroot\documentation -Force}
```

由于您的应用程序在 IIS 中运行，重新启动操作将调用 IIS 重置。

```
iisreset /timeout:1
```

若要卸载脚本，则务必清除在安装阶段使用的所有设置和文件。这样，在新版本的安装阶段，您可以避免与以前的部署之间的所有冲突。在本示例中，您需要删除静态网站的 IIS 应用程序并删除网站文件。

```
powershell.exe -Command {Remove-WebApplication -Name documentation}
Remove-Item -Recurse -Force 'c:\inetpub\wwwroot\documentation'
```

由于这些脚本文件以及 documentation.zip 文件包含在您的应用程序包中，该部署将创建 ASP.NET 应用程序，然后部署文档站点。

在本示例中，我们将选择一个部署简单静态网站的简单示例，但通过自定义应用程序部署，您可以部署任何类型的应用程序并让 Elastic Beanstalk 管理其 AWS 资源。

# 自定义 ASP.NET Core Elastic Beanstalk 部署
<a name="deployment-beanstalk-custom-netcore"></a>

本主题介绍部署的工作原理，以及在利用 Elastic Beanstalk 和 Toolkit for Visual Studio 创建 ASP.NET Core 应用程序时如何自定义部署。

在 Toolkit for Visual Studio 中完成部署向导后，Toolkit 将对该应用程序打包并将其发送到 Elastic Beanstalk。创建应用程序包的第一步是借助新的 dotnet CLI 为应用程序做好使用 **publish** 命令进行发布的准备。框架和配置将从向导中的设置向下传递到 **publish** 命令。因此，如果您为 `configuration` 选择了**发布**，为 `framework` 选择了 **netcoreapp1.0**，则 Toolkit 将执行以下命令：

 `dotnet publish --configuration Release --framework netcoreapp1.0` 

当 **publish** 命令完成后，Toolkit 会将新的部署清单写入到发布文件夹。此部署清单是一个名为 **aws-windows-deployment-manifest.json** 的 JSON 文件，Elastic Beanstalk Windows 容器（版本 1.2 或更高版本）将读取该文件以确定如何部署应用程序。例如，对于要在 IIS 的根处部署的 ASP.NET 内核应用程序，Toolkit 将生成一个清单文件，如下所示：

```
{
  "manifestVersion": 1,
  "deployments": {

    "aspNetCoreWeb": [
      {
        "name": "app",
        "parameters": {
          "appBundle": ".",
          "iisPath": "/",
          "iisWebSite": "Default Web Site"
        }
      }
    ]
  }
}
```

`appBundle` 属性指示了应用程序位与清单文件相关的位置。此属性可指向目录或 ZIP 存档。`iisPath` 和 `iisWebSite` 属性指示了 IIS 中要托管应用程序的位置。

## 自定义清单
<a name="tkv-deploy-beanstalk-custom-netcore-manifest"></a>

如果某个清单文件在发布文件夹中尚不存在，则 Toolkit 仅写入该清单文件。如果该文件已存在，Toolkit 将更新该清单的 `appBundle` 部分下列出的第一个应用程序中的 `iisPath`、`iisWebSite` 和 `aspNetCoreWeb` 属性。这使您可以将 **aws-windows-deployment-manifest.json** 添加到您的项目并自定义该清单。要对 Visual Studio 中的 ASP.NET 内核 Web 应用程序执行此操作，请将新的 JSON 文件添加到项目的根并将其命名为 **aws-windows-deployment-manifest.json**。

该清单必须命名为 **aws-windows-deployment-manifest.json** 且必须位于项目的根处。Elastic Beanstalk 容器将在根中寻找该清单，如果找到，则会调用部署工具。如果该文件不存在，Elastic Beanstalk 容器将回退到较早的部署工具，该工具假定存档为 **msdeploy** 存档。

要确保 dotnet CLI `publish` 命令包含该清单，请更新 `project.json` 文件以将该清单文件包含在 `include` 中 `publishOptions` 下的 include 部分。

```
{
   "publishOptions": {
     "include": [
       "wwwroot",
       "Views",
       "Areas/**/Views",
       "appsettings.json",
       "web.config",
       "aws-windows-deployment-manifest.json"
     ]
   }
 }
```

既然您已声明该清单以便让它包含在应用程序包中，您可以进一步配置要部署应用程序的方式。除了部署向导所支持的部署之外，您还可以自定义部署。AWS 已为 **aws-windows-deployment-manifest.json 文件**定义了 JSON 架构，并且在您安装 Toolkit for Visual Studio 后，该安装程序为架构注册了 URL。

当您打开 `windows-deployment-manifest.json` 时，您将看到在“Schema (架构)”下拉框中选择的架构 URL。您可以导航到该 URL 以获取可在该清单中设置的内容的完整说明。在已选择该架构的情况下，Visual Studio 将在您编辑该清单时提供 IntelliSense。

您可以执行的一项自定义是配置应用程序将在其下运行的 IIS 应用程序池。以下示例显示了如何定义 IIS 应用程序池（“customPool”），该池每 60 分钟再循环一次流程，并使用 `"appPool": "customPool"` 将流程分配到应用程序。

```
{
  "manifestVersion": 1,
  "iisConfig": {
    "appPools": [
      {
        "name": "customPool",
        "recycling": {
          "regularTimeInterval": 60
        }
      }
    ]
  },
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "app",
        "parameters": {
          "appPool": "customPool"
        }
      }
    ]
  }
}
```

此外，该清单还可以声明 Windows PowerShell 脚本在安装、重启和卸载操作之前和之后运行。例如，以下清单运行 Windows PowerShell 脚本 `PostInstallSetup.ps1` 以在 ASP.NET 内核应用程序部署到 IIS 之后完成进一步设置工作。在添加类似这样的脚本时，请确保将它们添加到 `project.json` 文件中的 publishOptions 下的 include 部分，正如对 `aws-windows-deployment-manifest.json` 文件的处理方式一样。如果没有这样做，这些脚本将不会作为 dotnet CLI **publish** 命令的一部分包含。

```
{
  "manifestVersion": 1,
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "app",
        "scripts": {
          "postInstall": {
            "file": "SetupScripts/PostInstallSetup.ps1"
          }
        }
      }
    ]
  }
}
```

## ebextensions 怎么样？
<a name="tkv-deploy-beanstalk-custom-netcore-ebextensions"></a>

Elastic Beanstalk **.ebextensions** 配置文件像在所有其他 Elastic Beanstalk 容器中一样受支持。要在 ASP.NET 内核应用程序中包含 ebextensions，请将 `.ebextensions` 目录添加到 `include` 文件中的 `publishOptions` 下的 `project.json` 部分。有关 ebextensions 的更多信息，请查阅 [Elastic Beanstalk 开发人员指南](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ebextensions.html)。

# 对 .NET 和 Elastic Beanstalk 的多应用程序支持
<a name="deployment-beanstalk-multiple-application"></a>

通过使用部署清单，您能够将多个应用程序部署到同一 Elastic Beanstalk 环境。

部署清单支持 [ASP.NET 内核](http://www.asp.net/core) Web 应用程序以及用于传统 ASP.NET 应用程序的 msdeploy 存档。设想以下情形：您为前端编写了一个使用 ASP.NET 内核的很棒的新应用程序并为扩展 API 编写了一个 Web API 项目。您还有一个使用传统 ASP.NET 编写的管理应用程序。

工具包的部署向导侧重于部署单一项目。要利用多应用程序部署，您必须手动构造应用程序包。要开始，请写入清单。在本示例中，您将在解决方案的根部写入清单。

清单中的部署部分包含两个子级：要部署的 ASP.NET 内核 Web 应用程序的数组以及要部署的 msdeploy 存档的数组。对于每个应用程序，您应设置应用程序的位相对于清单的 IIS 路径和位置。

```
{
  "manifestVersion": 1,
  "deployments": {

    "aspNetCoreWeb": [
      {
        "name": "frontend",
        "parameters": {
          "appBundle": "./frontend",
          "iisPath": "/frontend"
        }
      },
      {
        "name": "ext-api",
        "parameters": {
          "appBundle": "./ext-api",
          "iisPath": "/ext-api"
        }
      }
    ],
    "msDeploy": [
      {
        "name": "admin",
        "parameters": {
          "appBundle": "AmazingAdmin.zip",
          "iisPath": "/admin"
        }
      }
    ]
  }
}
```

在写入清单后，您将使用 Windows PowerShell 创建应用程序包并更新现有 Elastic Beanstalk 环境以运行此包。写入脚本时将假定它在包含您的 Visual Studio 解决方案的文件夹中运行。

您在脚本中需要执行的一个操作是设置在其中创建应用程序包的工作区文件夹。

```
$publishFolder = "c:\temp\publish"

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

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

创建此文件夹后，是时候为前端做好准备了。与使用部署向导时一样，应使用 dotnet CLI 来发布应用程序。

```
Write-Host 'Publish the ASP.NET Core frontend'
$publishFrontendFolder = [System.IO.Path]::Combine($publishWorkspace, "frontend")
dotnet publish .\src\AmazingFrontend\project.json -o $publishFrontendFolder -c Release -f netcoreapp1.0
```

请注意，子文件夹“frontend”用于输出文件夹 (与您在清单中设置的文件夹匹配)。现在您需要对 Web API 项目执行相同的操作。

```
Write-Host 'Publish the ASP.NET Core extensibility API'
$publishExtAPIFolder = [System.IO.Path]::Combine($publishWorkspace, "ext-api")
dotnet publish .\src\AmazingExtensibleAPI\project.json -o $publishExtAPIFolder -c Release -f netcoreapp1.0
```

管理员站点是传统 ASP.NET 应用程序，因此您无法使用 dotnet CLI。对于管理应用程序，您应使用在生成目标包中传递的 msbuild 来创建 msdeploy 存档。默认情况下，包目标将在 `obj\Release\Package` 文件夹下创建 msdeploy 存档，因此您需要将此存档部署到发布工作区。

```
Write-Host 'Create msdeploy archive for admin site'
msbuild .\src\AmazingAdmin\AmazingAdmin.csproj /t:package /p:Configuration=Release
Copy-Item .\src\AmazingAdmin\obj\Release\Package\AmazingAdmin.zip $publishWorkspace
```

要告知 Elastic Beanstalk 环境如何处理所有这些应用程序，请将此清单从您的解决方案复制到发布工作区，然后压缩文件夹。

```
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)
```

现在您已拥有应用程序包，您可转到 Web 控制台并将存档上传到 Elastic Beanstalk 环境。或者，您也可以继续使用 AWS PowerShell cmdlet，用应用程序包更新 Elastic Beanstalk 环境。确保您使用 `Set-AWSCredentials` 和 `Set-DefaultAWSRegion` cmdlet 将当前配置文件和区域设置为包含您的 Elastic Beanstalk 环境的配置文件和区域。

```
Write-Host 'Write application bundle to S3'
# Determine S3 bucket to store application bundle
$s3Bucket = New-EBStorageLocation
Write-S3Object -BucketName $s3Bucket -File $appBundle


$applicationName = "ASPNETCoreOnAWS"
$environmentName = "ASPNETCoreOnAWS-dev"
$versionLabel = [System.DateTime]::Now.Ticks.ToString()

Write-Host 'Update Beanstalk environment for new application bundle'
New-EBApplicationVersion -ApplicationName $applicationName -VersionLabel $versionLabel -SourceBundle_S3Bucket $s3Bucket -SourceBundle_S3Key app-bundle.zip
Update-EBEnvironment -ApplicationName $applicationName -EnvironmentName $environmentName -VersionLabel $versionLabel
```

现在，通过在 Toolkit 或 Web 控制台中使用 Elastic Beanstalk 环境状态页面来检查更新状态。完成后，您将能够导航到部署于在部署清单中设置的 IIS 路径的所有应用程序。