

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

# 在亚马 EC2 逊 Linux 实例上运行 ASP.NET Core Web API Docker 容器
在 AWS 上运行 ASP.NET Web API Docker 容器

*Vijai Anand Ramalingam 和 Sreelaxmi Pai，Amazon Web Services*

## Summary


这种模式适用于开始在 Amazon Web Services (AWS) Cloud 上对其应用程序进行容器化的人员。当您开始在云上容器化应用程序时，通常没有设置容器编排平台。这种模式可以帮助您在 AWS 上快速设置基础设施来测试您的容器化应用程序，而无需复杂的容器编排基础设施。

现代化进程第一步是改造应用程序。如果是旧版.NET 框架应用程序，则必须先将其运行时系统更改为 ASP.NET Core。然后执行以下操作：
+ 创建 Docker 容器镜像
+ 从该镜像运行 Docker 容器。
+ 在将应用程序部署到任何容器编排平台（例如 Amazon Elastic Container Service (Amazon ECS) 或 Amazon Elastic Kubernetes Service (Amazon EKS)）之前验证应用程序。 

此模式涵盖了在亚马逊弹性计算云 (Amazon EC2) Linux 实例上构建、运行和验证现代应用程序开发的各个方面。

## 先决条件和限制


**先决条件**
+ 一个活动 [Amazon Web Services (AWS) 账户](https://aws.amazon.com/account/)。
+ 要在这种模式下创建 AWS 资源，需要具有足够的 IAM 访问权限的 [AWS Identity and Access Management (IAM) 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。 
+ [Visual Studio Community 2022](https://visualstudio.microsoft.com/downloads/) 或更新版本已下载并安装
+ 已升级为 ASP.NET Core 框架项目
+ 存储 GitHub 库

**产品版本**
+ Visual Studio Community 2022 及以上版本

## 架构


**目标架构**

此模式使用 A [WS CloudFormation 模板](https://console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/new?stackName=SSM-SSH-Demo&templateURL=https://aws-quickstart.s3.amazonaws.com/quickstart-examples/samples/session-manager-ssh/session-manager-example.yaml)创建高可用架构，如下图所示。Amazon EC2 Linux 实例在私有子网中启动。AWS Systems Manager 会话管理器用于访问私有 Amazon EC2 Linux 实例和测试 Docker 容器中运行的 API。

![\[访问亚马逊 EC2 Linux 实例并测试在 Docker 容器中运行的 API 的用户。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/512e61b2-10ba-43be-bbd8-2bdc597c3de3/images/9c5206f6-32b1-47be-9037-360c0bff713c.png)


1. 通过 Session Manager 访问 Linux 实例

## 工具


**Amazon Web Services**
+ [AWS 命令行界面](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) - AWS 命令行界面（AWS CLI）是一种开源工具，它使您能够使用命令行 Shell 中的命令与 Amazon Web Services 交互。仅需最少的配置，即可使用 AWS CLI 开始运行命令，以便从终端程序中的命令提示符实现与基于浏览器的 AWS 管理控制台 所提供的功能等同的功能：
+ [AWS 管理控制台](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html) - AWS 管理控制台是一款 Web 应用程序，其中包含并引用了多种用于管理 AWS 资源的服务控制台。首次登录时，您会看到控制台主页。主页提供了对每个服务控制台的访问权限，并提供了访问执行 AWS 相关任务所需信息的单一位置。
+ [AWS Systems Manager 会话管理器](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html) – 会话管理器是一项完全托管的 AWS Systems Manager 功能。使用会话管理器，您可以管理您的亚马逊弹性计算云 (Amazon EC2) 实例。Session Manager 提供安全且可审计的节点管理，无需打开入站端口、维护堡垒主机或者管理 SSH 密钥。

**其他工具**
+ [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) – Visual Studio 2022 是一种集成式开发环境（IDE）。
+ [Docker](https://www.docker.com/) - Docker 是一组平台即服务（PaaS）产品，它们使用操作系统级别的虚拟化技术在容器中交付软件。

**代码**

```
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
 WORKDIR /app
EXPOSE 80
EXPOSE 443
 
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["DemoNetCoreWebAPI/DemoNetCoreWebAPI.csproj", "DemoNetCoreWebAPI/"]
RUN dotnet restore "DemoNetCoreWebAPI/DemoNetCoreWebAPI.csproj"
COPY . .
WORKDIR "/src/DemoNetCoreWebAPI"
RUN dotnet build "DemoNetCoreWebAPI.csproj" -c Release -o /app/build
 
FROM build AS publish
RUN dotnet publish "DemoNetCoreWebAPI.csproj" -c Release -o /app/publish
 
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DemoNetCoreWebAPI.dll"]
```

## 操作说明


### 开发ASP.NET Core web API



| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 Visual Studio 创建 ASP.NET Core web API | 要创建示例 ASP.NET Core web API，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 应用程序开发人员 | 
| 创建 Dockerfile。 | 要创建新文件，请执行以下操作之一：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html)要将更改推送到您的 GitHub 存储库，请运行以下命令。<pre>git add --all<br />git commit -m "Dockerfile added"<br />git push</pre> | 应用程序开发人员 | 

### 设置亚马逊 EC2 Linux 实例



| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置基础设施。 | 启动 A [WS CloudFormation 模板](https://console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/new?stackName=SSM-SSH-Demo&templateURL=https://aws-quickstart.s3.amazonaws.com/quickstart-examples/samples/session-manager-ssh/session-manager-example.yaml)以创建基础设施，其中包括以下内容： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html)要详细了解如何使用会话管理器访问私有 Amazon EC2 实例，无需堡垒主机，请参阅[迈向无堡垒世界博](https://aws.amazon.com/blogs/infrastructure-and-automation/toward-a-bastion-less-world/)客文章。 | 应用程序开发人员、AWS 管理员、AWS DevOps | 
| 登录亚马逊 EC2 Linux 实例。 | 要连接到私有子网中的 Amazon EC2 Linux 实例，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 应用程序开发人员 | 
| 安装并运行 Docker | 要在亚马逊 EC2 Linux 实例中安装并启动 Docker，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 应用程序开发人员、AWS 管理员、AWS DevOps | 
| 安装 Git 并克隆存储库。 | 要在 Amazon EC2 Linux 实例上安装 Git 并从中克隆存储库 GitHub，请执行以下操作。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 应用程序开发人员、AWS 管理员、AWS DevOps | 
| 运行 Docker 容器。 | 要构建 Docker 镜像并在亚马逊 EC2 Linux 实例中运行容器，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 应用程序开发人员、AWS 管理员、AWS DevOps | 

### 测试 web API



| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 curl 命令测试 Web API。 | 使用以下命令可运行 RSA 测试。<pre>curl -X GET "http://localhost/WeatherForecast" -H  "accept: text/plain"</pre>验证 API 响应。本地运行 Swagger 时，可以从 Swagger 获取每个端点的 curl 命令。 | 应用程序开发人员 | 

### 清理 资源



| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除资源 | 删除堆栈，以移除所有资源。这确保您不会为未使用的任何服务付费。 | AWS 管理员，AWS DevOps | 

## 相关资源

+ [使用 PuTTY 从 Windows 连接到 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html)
+ [使用 ASP.NET Core 创建 Web API](https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0&tabs=visual-studio)
+ [走向没有堡垒的世界](https://aws.amazon.com/blogs/infrastructure-and-automation/toward-a-bastion-less-world/)