

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

# 迁移 .NET 应用程序
<a name="migrating-net-workloads"></a>

将.NET 应用程序迁移到 AWS 使您能够创建具有弹性扩展功能的高可用性工作负载，降低操作开销，并通过专注于差异化价值来提高业务灵活性。

本节重点介绍在 AWS上托管 .NET 应用程序的不同选项。您可以选择使用虚拟机、托管解决方案（如 [AWS Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/)）、容器化代码或将代码重构到一个基于微服务或无服务器的架构中。

## 评测
<a name="migrating-net-workloads-assess"></a>

为 .NET 工作负载选择迁移路径取决于以下关键因素：
+ **查找使用的 .NET 版本** – Microsoft 支持两种不同的 .NET 实施：.NET Framework（1.0-4.8）和 .NET（.NET Core 1.0-3.1 和 .NET 5 及更高版本）。两者共享许多相同的组件，并且可以运行使用不同的.NET 编程语言（例如 C\#、F\# 和 VB.NET）编写的应用程序代码。选择迁移策略和托管服务取决于所使用的运行时系统，因为 .NET Framework 在 Windows 上运行，而较新的 .NET 是多平台的。对于 .NET Framework，您可以在 Windows 操作系统上托管，也可以重构代码以使用更新的 .NET。较新的.NET 也可以托管在 Linux OS-based 服务上。对.NET Framework-based 工作负载进行现代化改造时，您可以使用 [AWS Transform .NET](https://docs.aws.amazon.com/transform/latest/userguide/dotnet.html) 来扫描您的代码并生成兼容性评估报告。通过查看您的项目是否引用了不兼容的 .NET Framework API，您可以根据迁移项目的复杂性进行规划，并决定是否以及何时重构代码以使用更新的运行时系统。
+ **查看您当前的部署**-检查当前迁移的工作负载是否有可以更新以将相同的工作负载部署到云中的现有 CI/CD 管道。使用现有的构建和部署管线可以自动执行构建、配置和部署工作负载所需的步骤，从而可缩短将应用程序部署到云所需的时间。
+ **查看您的路线图** – 根据项目的当前状态，您可能已经在计划重新架构或重新设计应用程序。所执行的任何现代化均应考虑产品路线图。例如，决定对现有代码进行容器化或将单体架构重构为微服务是理想的产品路线图的一部分，并且与其他开发工作保持一致。

## 动员
<a name="migrating-net-workloads-mobilize"></a>

当将 .NET 工作负载迁移到 AWS时，需要考虑三种不同的迁移路径。您可以根据现有代码库的复杂性、分配的迁移时间以及为支持迁移工作而分配的团队规模，在不同的选项之间进行选择。在考虑将现代化作为迁移的一部分时，最佳做法是与产品路线图保持一致。
+ **重新托管（lift & shift）**— 如果您的优先事项是更快地迁移到 AWS ，而几乎没有更改，则可以选择这种方法。您可以将 ASP.NET-based 网站重新托管到在 Amazon EC2 实例上运行的互联网信息服务 (IIS)。[您可以将基于桌面的应用程序（例如 Windows Presentation Foundation、Web Forms 和.NET MAUI）重新托管到最终用户计算平台之一，例如亚马逊[应用程序 WorkSpaces ](https://aws.amazon.com/appstream2/)或亚马逊。 WorkSpaces](https://aws.amazon.com/workspaces-family/)
+ **更换平台** – 更换平台最适合以下情况：您希望使用托管服务托管应用程序而不进行代码更改，但希望通过消除无差别的繁重工作（如安装、修补、升级和实例管理）来减少运营开销。此策略也适用于想要移至基于容器的工作负载的团队。您可以对现有应用程序更换平台，转为 [Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/)，或使用 [Amazon ECS](https://aws.amazon.com/ecs/)、[Amazon EKS](https://aws.amazon.com/eks/) 或 [AWS App Runner](https://aws.amazon.com/apprunner/) 上托管的 Docker 容器。
+ **重构** — 如果您可以投入时间和精力进行代码和架构更改，从而减少运营开销，并通过使用 AWS 云原生服务实现更好的扩展、高可用性和灾难恢复，请选择这种方法。重构涉及到通过将现有 .NET Framework 应用程序移植到 .NET（以前称为 .NET Core）或对现有代码库进行现代化改造以在云中更好地运行来实现代码库的现代化改造。您可以使用[适用于 .NET 的 AWS SDK](https://aws.amazon.com/sdk-for-net/) 从 .NET 代码中调用许多 AWS 云服务。诸如 [.NET 之类AWS Transform 的](https://docs.aws.amazon.com/transform/latest/userguide/dotnet.html)工具可用于将您的代码库从.NET Framework 移植到.NET。通过将现有的 .NET 工作负载重构为在 [AWS Lambda](https://aws.amazon.com/lambda/) 上运行，您可以使用无服务器计算来避免预调配和管理基础设施。

## 迁移
<a name="migrating-net-workloads-migrate"></a>

.NET 工作负载迁移的步骤取决于您在评测阶段选择的迁移路径和您的应用程序类型。

### 对 .NET 应用程序更换主机
<a name="net-rehost"></a>

如果您想在不更改任何代码的情况下迁移应用程序，但希望受益于云中的自动扩展、负载均衡和弹性，请选择此迁移路径。对于 Windows-based 网站，重新托管通常意味着在互联网信息服务 (IIS) 上 AWS运行它们。对于基于桌面的应用程序，必须安装相应的应用程序并允许用户从外部连接到该应用程序。

### 互联网信息服务开启 AWS
<a name="net-iis"></a>

互联网信息服务（IIS）是一款在 Windows 操作系统上运行的 Microsoft Web 服务器，用于托管网站和 Web 服务。IIS 可以安装在运行 Windows Server 的任何 Amazon EC2 实例上。启用并配置 IIS 后，您可以使用与本地环境相同的部署机制来部署 ASP.NET 网站和服务。

如果您在 EC2 Windows 实例上托管 IIS，那么根据您的工作负载和 HADR 需求，通过使用负载平衡、Auto Scaling 组和多可用区部署来遵循[AWS Well-Architected框架](https://aws.amazon.com/architecture/well-architected/)非常重要。我们建议使用，[AWS Launch Wizard](https://docs.aws.amazon.com/launchwizard/latest/userguide/what-is-launch-wizard-iis.html)因为它可以指导你完成运行 IIS 资源的 Windows Server 工作负载的大小、配置和部署 AWS。Launch Wizard 会部署一个高可用性架构，该架构跨越两个可用区，其中包含新创建或现有 VPC 所需的计算、联网和存储组件。

### 在上托管桌面应用程序 AWS
<a name="net-hosting"></a>

许多客户端均需要访问基于 Windows 的胖客户端应用程序。您可以在三种不同的平台之间进行选择：
+ [亚马逊 EC2](https://aws.amazon.com/pm/ec2/) — 如果您希望您的用户使用微软远程桌面连接到 Windows Server-based 环境，请选择此选项。使用此选项，您负责修补和维护操作系统。您还必须为用户购买额外的远程桌面服务客户端访问许可证（RDS CAL）和[有效的软件保障（SA）](https://aws.amazon.com/windows/resources/licensemobility/)。有关更多信息，请参阅 AWS 文档 AWS中的 [Microsoft 许可](https://aws.amazon.com/windows/resources/licensing/)。
+ [Amazon WorkSpaces](https://aws.amazon.com/workspaces-family/) — 如果您需要为用户提供完全托管的虚拟桌面基础架构 (VDI)，请选择此选项。您可以使用 WorkSpaces 为用户提供持久的 Windows 桌面体验。您还可以使用自定义映像自定义 WorkSpaces 环境并安装.NET 应用程序，或者使用[AWS Systems Manager](https://aws.amazon.com/systems-manager/)将.NET 应用程序交付到您的 WorkSpaces环境。用户可以使用浏览器或 A [mazon WorkSpaces 客户端](https://clients.amazonworkspaces.com/)进行连接。
+ [Amazon A WorkSpaces ](https://aws.amazon.com/appstream2/) pplications — 选择此选项可提供从任何位置对应用程序和非永久桌面进行安全、可靠和可扩展的访问。您可以使用 WorkSpaces 应用程序让您的用户能够从 Web 访问您的.NET 应用程序。如果您已经有现有 RDS CAL 和活动的 SA，则可以使用许可证[移动性将这些许可证](https://aws.amazon.com/windows/resources/licensemobility/)用于 WorkSpaces 应用程序。

## 更换平台
<a name="migrating-net-workloads-replatform"></a>

更换平台涉及到更改您的托管环境，只需少量甚至完全无需更改代码。选择此策略可以减少运营开销并利用云功能和服务。

### AWS Elastic Beanstalk
<a name="net-beanstalk"></a>

您可以使用 [AWS Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/) 来为您的 .NET Framework 工作负载更换平台。如果您打包您的 ASP.NET-based或 ASP.NET Core-based 应用程序，则 AWS 无需了解运行这些应用程序的基础架构，即可在其中快速部署和管理应用程序。这样可降低复杂性，而不会限制选择或控制权。您只需上传应用程序，Elastic Beanstalk 将自动处理有关容量预配置、负载均衡、扩展和应用程序运行状况监控的部署细节。

要了解更多信息，请参阅以下资源：
+ [Creating and deploying .NET applications on Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_NET.html)（Elastic Beanstalk 文档）
+ [Working with .NET Core on Linux](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-dotnet-core-linux.html)（Elastic Beanstalk 文档）
+ [Multi-App 支持.NET 和 AWS Elastic Beanstalk（AWS 开发者工具博客）的自定义域](https://aws.amazon.com/blogs/developer/multi-app-support-with-custom-domains-for-net-and-aws-elastic-beanstalk/)

### 容器化现有应用程序
<a name="net-containerize-existing"></a>

您可以使用 Amazon ECS 或 Amazon EKS 来托管您的 Docker-based 容器化应用程序。 AWS 管理这两项服务。这两者之间的选择取决于现有的知识和偏好。这两个选项都可以运行 Linux-based容器或 Windows-based 容器。

要了解更多信息，请参阅以下资源：
+ [Amazon EC2 Windows 容器](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_Windows.html)（Amazon ECS 文档）
+ [为 Amazon EKS 集群启用 Windows 支持](https://docs.aws.amazon.com/eks/latest/userguide/windows-support.html)（Amazon EKS 文档）
+ [Running Windows Containers with Amazon ECS on AWS Fargate](https://aws.amazon.com/blogs/containers/running-windows-containers-with-amazon-ecs-on-aws-fargate/)（AWS Blog）
+ [使用 EC2 映像生成器和映像缓存策略加快 Windows 容器的启动时间](https://aws.amazon.com/blogs/containers/speeding-up-windows-container-launch-times-with-ec2-image-builder-and-image-cache-strategy/)（AWS 博客）
+ [快速入门： CI/CD 适用于上的 .NET 应用程序 AWS Fargate](https://aws.amazon.com/quickstart/architecture/dotnet-cicd-fargate/)（AWS 文档）

对基于 .NET 的应用程序进行容器化取决于所使用的 .NET 运行时系统。请考虑以下事项：
+ **.NET Framework-based 应用程序在 Windows 容器上运行** — 为现有应用程序添加 Docker 支持是通过创建一个 Docker 文件来完成的，该文件概述了应用程序需要如何进行容器化。
+ **.NET 或.NET Core** — 除了运行更新的版本之外。 NET-based Amazon ECS 或 Amazon EKS 上的 Web 应用程序，你也可以使用[AWS App Runner](https://aws.amazon.com/apprunner/)。App Runner 是一款完全托管的无服务器解决方案，可运行您的代码或容器映像，并管理负载均衡、自动扩缩、日志记录、证书和联网。

### Refactor/re-architect 现有代码
<a name="net-refactor"></a>

如果您有强烈的业务需求，需要添加在应用程序的当前环境中难以实现的功能、规模或性能，请选择此选项。根据应用程序路线图，您可以选择更改代码以使用最新的框架、云原生服务，或重新架构代码以更好地在云中运行。

第一个可用的重构选项是将现有的 .NET Framework 应用程序迁移到 .NET。迁移到 .NET 可为您带来在 Linux 而不是在 Windows 上运行的便利。这样可以降低总许可成本，为您提供最新的框架，并提供最新版本的 .NET 编程语言。

### 适用于 .NET 的 AWS SDK
<a name="sdk-for-net"></a>

[适用于 .NET 的 AWS SDK](https://aws.amazon.com/sdk-for-net/) AWS 服务 通过提供一组一致且为.NET 开发人员熟悉的库来简化使用。S AWS DK 提供跨平台支持，使用 NuGet分发。开发人员可以使用 AWS SDK 通过.NET 代码轻松调用云服务，从而满足其应用程序的存储、队列、身份验证和配置要求。

### 实现 .NET Framework 应用程序现代化
<a name="net-modernize"></a>

您可以使用AWS Transform for .NET 从.N [ET](https://docs.aws.amazon.com/transform/latest/userguide/dotnet.html) Framework 迁移，它会扫描您的代码文件并创建一份报告，帮助规划应用程序组合迁移路线图。Porting Assistant for .NET 还可以通过识别不兼容的 .NET Core API 和软件包并查找已知替换来减少移植开销。将.NET Framework 应用程序迁移到.NET 可以在 ARM64-based Graviton 处理器上运行它们，从而获得更好的性价比。有关更多信息，请参阅 [Graviton on 上的.NET GitHub 以及 Work](https://github.com/aws/aws-graviton-getting-started/blob/main/dotnet.md) shop Studio 文档中的 [Graviton 和容器](https://catalog.workshops.aws/graviton/en-US/amazoncontainers)。 AWS 

### 从单体到微服务
<a name="net-monolith"></a>

许多开发团队均希望将其现有的单体应用程序重新架构到微服务中。通过迁移到基于微服务的架构，您的开发团队可以提高开发敏捷性、降低计算成本、单独扩展服务并缩短部署时间。通过识别组件和对功能进行分组，开发团队能够以增量方式将功能从 .NET Framework 单体应用程序中提取到 .NET 服务中。

### 重构为无服务器应用程序
<a name="net-serverless-refactor"></a>

[AWS Lambda](https://aws.amazon.com/lambda/) 是一项无服务器、事件驱动计算服务，让您能够为几乎任何类型的应用程序或后端服务运行代码，而无需预调配或管理服务器。您可以从现有应用程序中提取逻辑，以创建基于事件的无服务器工作流，这些工作流可在需要时使用 .NET 和 Lambda 自动扩展。[Lambda 的常见使用案例](https://docs.aws.amazon.com/lambda/latest/dg/applications-usecases.html)包括运行数秒钟或数分钟的事件驱动型工作负载，这些工作负载具有不同的扩展需求，例如文件处理、分析、网站和移动应用程序。有关更多信息，请参阅 Lambda 文档中的[使用 C\# 构建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-csharp.html)。

## 其他资源
<a name="migrating-net-workloads-resources"></a>
+ [AWS Toolkit for Azure DevOps](https://aws.amazon.com/vsts/)（AWS 文档）
+ [通过将 Jenkins 与 AWS CodeBuild 和集成 AWS CodeDeploy（AWS DevOps 博客）来设置 CI/CD 管道](https://aws.amazon.com/blogs/devops/setting-up-a-ci-cd-pipeline-by-integrating-jenkins-with-aws-codebuild-and-aws-codedeploy/)
+ [关于.NET AWS 部署工具](https://aws.github.io/aws-dotnet-deploy/) (AWS GitHub)
+ [.NET 开启 AWS](https://aws.amazon.com/developer/language/net/)（AWS 文档）
+ [aws/dotnet](https://github.com/aws/dotnet) (GitHub)